cdsfiui 发表于 2016-07-04 10:19

*号到底是左结合的还是右结合的?

例如,
int main()
{
        int i = 1;
        int* p, q;
        p = &i;
        //q = &i;//q不是指针
        int* buf;//数组的每个元素都是int*
        return 0;
}
第二行声明里面,*好象是右结合的,也就是p是一个*,指向int,而q是普通的int
第五行声明里面,*好象是左结合的,也就是buf是一个数组,有20个元素,每个元素都是int*

那我就不明白了,*号有没有确定的左右结合律呢?
还请指点

fender0107401 发表于 2016-07-04 11:00

我每次都是一行只声明一个变量。

windoze 发表于 2016-07-04 11:15

K&R当年写parser的时候要么是偷懒要么就是脑抽了一下,这么多年过去了还是有人想要试图理解这脑抽背后是不是有什么深意……
我家楼下也有两棵法国梧桐啊。

爻易 发表于 2016-07-04 11:52

*作指针操作时是右结合
*作乘法操作时是左结合,其优先级低于指针操作的*
[]是左结合,且优先级高于所有的*
:lol

codechurch 发表于 2016-07-04 15:54

这是一元运算符,哪有左右结合之说?
在二元运算符里,只有赋值类是右结合,如=+=-= *= /=

形如

int* a [ N ]

只是谁【先】结合的问题,是 *优先还是 [ 优先,这是运算符优先级比较的问题。
按规定,*优先。

      


nswcfd 发表于 2016-07-12 11:24

声明里的 */[] 算是operator么?

action08 发表于 2016-07-12 11:45

楼主在看编译原理,反正你又不研究编译器

纠结什么啊

nswcfd 发表于 2016-07-14 10:49

回复 6# nswcfd


找到一句话,不知道是否可以作为依据?姑且记录一下。

6.7.6 Declarators

Syntax

   declarator:
      pointer/opt direct-declarator
   
   direct-declarator:
      identifier
      ( declarator )
      direct-declarator [ type-qualifier-list/opt assignment-expression/opt ]
      direct-declarator ( parameter-type-list )
      ...

   pointer:
      * type-qualifier-list/opt
      * type-qualifier-list/opt pointer

Semantics

2 Each declarator declares one identifier, and asserts that when an operand of the same
form as the declarator appears in an expression, it designates a function or object with the
scope, storage duration, and type indicated by the declaration specifiers.

不知道是不是可以理解为,尽管声明不是(?)表达式,但是可以按照“同样形式”的表达式来解析,
也就是说,可以利用表达式的操作符优先级,来判断标识符具体代表什么(普通object,指针,数组,函数等)。

例如,对于如下的声明,static int (*a);
其中declartion specifier是static int,declarator是(*a),
按照expression的规则去解析(*a),要求a是一个指针,并且(*a)是个数组,那么a就是一个指向数组的指针。

言外之意,解析declator和解析表达式的逻辑/代码是重用的?

---------------------------------------------------------------------

注,这里主要用到的expression规则为:

primary-expression:
   identifier
   constant
   ( expression )
   ...

postfix-expression:
   primary-expression
   postfix-expression [ expression ]
   postfix-expression ( argument-expression-list/opt )
   ...

unary-expression:
   postfix-expression
   unary-operator cast-expression
   ...

unary-operator:
   *
   ...

cast-express到assignment-expression,略

expression:
   expression , assignment-expression
   ...

(*a)的解析结果为
expression
   -> assignment-expression -> ...
      -> postfix-expression [ expression ]
         -> ( expresion ) [ expression ] -> ...
            -> ( unary-operator cast-expression) [ expression ]
               -> ( * cast-expresion ) [ expression ] -> ...
                  -> ( * identifier ) [ expression ]
                     -> ( * a ) [ expression ] -> ...
                        -> ( * a ) [ primary-expression ]
                           -> ( * a ) [ constant ]
                              -> ( * a ) [ 10 ]

爻易 发表于 2016-07-15 12:01

对,声明中的运算符与表达式中含义有所不同,但优先级与结合性是一致的

tomac_cu 发表于 2016-07-18 16:10

这里*不是运算符,哪来左结合右结合?

int* a, p;指明一个是指针,一个是变量

int * b ; 指明一个指针数组,这里还能怎么个结合法?
页: [1] 2
查看完整版本: *号到底是左结合的还是右结合的?