C语言中同等级运算的先后顺序

Python013

C语言中同等级运算的先后顺序,第1张

同等级的运算符,先后顺序按结合性来进行。下面的代码有利于理解结合性。

int a,b=1,c=2

a=b=c上面的代码是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。所有的赋值符(包括复合赋值)都具有右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2。

所有优先级相同的操作符,它们的结合性也相同。这是必须如此的,否则结合性依然无法消除歧义,如果在计算表达式的值时需要考虑结合性,那么最好把这个表达式一分为二或者使用括号。

例:

  a=b+c+d=是右结合的,所以先计算(b+c+d),然后再赋值给a

+是左结合的,所以先计算(b+c),然后再计算(b+c)+d

在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的:

1:&&

||

规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,也就是常说的短路。

2:条件表达式的求值顺序是这样规定的:

test

?

exp1

exp2

条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。

3:逗号运算符的求值顺序是从左到右顺序求值,并且整个表达式的值等于最后一个表达式的值,注意逗号','还可以作为函数参数的分隔符,变量定义的分隔符等,这时候表达式的求值顺序是没有规定的!

这要看运算符的优先级。

譬如 *a++ 就是先左后右,因为*优先于++运算。

譬如 ++*a也是先*后++,但是顺序是从右往左了。

所以所谓的左,右,都是取决于运算符号的优先级别的。

具体的列表如下。

1 :: scope Left-to-right

2 () [] . ->++ -- dynamic_cast static_cast reinterpret_cast const_cast typeid postfix Left-to-right

3 ++ -- ~ ! sizeof new delete unary (prefix) Right-to-left

* &indirection and reference (pointers)

+ - unary sign operator

4 (type) type casting Right-to-left

5 .* ->* pointer-to-member Left-to-right

6 * / % multiplicative Left-to-right

7 + - additive Left-to-right

8 <<>>shift Left-to-right

9 <><= >= relational Left-to-right

10 == != equality Left-to-right

11 &bitwise AND Left-to-right

12 ^ bitwise XOR Left-to-right

13 | bitwise OR Left-to-right

14 &&logical AND Left-to-right

15 || logical OR Left-to-right

16 ?: conditional Right-to-left

17 = *= /= %= += -= >>= <<= &= ^= != assignment Right-to-left

18 , comma Left-to-right