Chinaunix

标题: 解读C语言声明的方法 [打印本页]

作者: duke_gun    时间: 2006-01-06 10:45
标题: 解读C语言声明的方法
-------------------英文版----------------
The Precedence Rule for Understanding C Declarations
Step A : Declarations are read by starting with the name and then reading in precedence order.
Step B : The precedence, from high to low, is:
Step B.1 : parentheses grouping together parts of a declaration
Step B.2 : the postfix operators: parentheses () indicating a function, and square brackets [] indicating an array.
Step B.3 : the prefix operator: the asterisk denoting "pointer to".
Step C : If a const and/or volatile keyword is next to a type specifier (e.g. int, long, etc.) it
applies to the type specifier. Otherwise the const and/or volatile keyword applies to the
pointer asterisk on its immediate left.
------------------中文版-------------------
理解C语言声明的优先级规则
A  声明从它的名字开始读取,然后按照优先级顺序依次读取:
B  优先级从高到低依次是:
    B.1 声明中被括号括起来的那部分
    B.2 后缀操作符:
          括号()表示这是一个函数、而
          方括号[]表示这是一个数组。
    B.3 前缀操作符:星号*表示“指向…的指针”。
C  如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其   他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。

[ 本帖最后由 duke_gun 于 2006-1-10 10:28 编辑 ]
作者: duke_gun    时间: 2006-01-06 14:00
围绕C语言声明,有许多的问题。参照上述规则,十分复杂的C声明语法解析就有了规律可依。
作者: coolker    时间: 2006-01-07 16:38
Translate:
优先规则为了解C 声明
步骤A: 声明被读取由名字和读取优先次序开始。
步骤B: 优先次序, 从高到低依次是:
      步骤B.1: 用圆括号将声明的部分进行分组
      步骤B.2: postfix 操作符: 圆括号() 表明一个函数, 并且方括号[ ] 表明数组。
      步骤B.3: 前缀操作符: 星号表示 "指针指向" 。
步骤C: 如果const  (和或) 不稳定的关键词是类型指定成分(例如:int, long  等)它适用于类型指定成分。否则const  (和或) 不稳定关键词适用于星号在它的直接左边。

[ 本帖最后由 coolker 于 2006-1-7 16:43 编辑 ]
作者: ldj2285    时间: 2006-01-07 21:51
谢谢3楼翻译!!
作者: duke_gun    时间: 2006-01-09 09:01
3楼是个好心人。语句通顺的问题暂且抛开,有两处改善建议:
1、"不稳定的关键词"请保留volatile,不必翻译;
2、"类型指定成分"(type specifier)请翻译成"类型限定符",比较专业;
以上,请确认。
作者: shaver    时间: 2006-01-09 11:40
工具翻译的吧

看到有些中文版的书籍就头晕,原来以为是自己的问题,后来才知道是书籍的问题。
作者: duke_gun    时间: 2006-01-10 10:30
中文的说明也补上了。希望对大家有帮助。
作者: duke_gun    时间: 2006-01-11 16:18
干这行,E文是必备基础。
作者: wanhuachao    时间: 2009-01-07 11:01
very good!
thanks!
作者: ggff112    时间: 2009-01-07 12:29
原帖由 duke_gun 于 2006-1-11 16:18 发表
干这行,E文是必备基础。


要学的东西太多了,看倒E文就烦,根本就学不来
作者: eveson    时间: 2009-01-07 12:34
lz这个主题不错
作者: 自由建客    时间: 2009-01-07 16:05
很羡慕懂英文的!
我英文太菜,当年硬靠n个例子去悟。
作者: smallstar001    时间: 2009-01-07 16:14
这是什么书里面的??
作者: smallstar001    时间: 2009-01-07 16:31
使用这条口诀我们甚至可以理解这个声明:
char * const *(*next)(int a, int b);

  我们从变量名开始,这个例子是“next”.这是被声明的名称.我们看在圆括号里的表达式有一个星号,因此我们可以断定“next是一个指向…的指针”. 又看圆括号外面有一个星号在左边,和一个函数原型在右.使用规则2.B.1我们以原型继续. “next是一个指向有两个参数的函数的指针”.再看星号:"next是一个指向有两个参数的返回一个指向…指针的函数的指针",最后我们加上char *const,就是:"next是一个指向有两个参数的返回一个指向一个指向一个字符型常量的指针的指针的函数的指针"或next是一个指向有两个参数的返回一个指向一个常量指针的函数的指针,常数指针指向一个字符型常量".

折磨阿




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2