background image

 

难记住赋值运算符为什么比三目运算符的优先级低了! 第六、逗号运算符是分割各个子
语句的(感觉这么说有点不准确,不过我想大家会明白我的意思的),自然优先级最低

 

了,我想这个应该不是很容易混淆的。 总结一下,

按运算符优先级从高到低:单目运

算符 ->双目运算符 ->三目运算符 ->赋值运算符 ->

 

逗号 运算符 特别在 双目运算 符

中 ,  

按 运算符优先 级从高到 低 :算术运算符->移位运算符->关系运算符(其中 == 

 

和 !=优先级又较低)->逻辑运算符(按位与-〉按位异或-〉按位或-〉逻辑与-〉逻辑
或)!

 运算符的结合性指同一优先级的运算符在表达式中操作的组织方向, 即: 当一个运

算对象两侧运算符的优先级别相同时, 运算对象与运算符的结合顺序, C 语言规定了各种
运算符的结合方向( 结合性) 

。大多数运算符结合方向是 自左至右 , 即: 先左后右, 例如

a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合方向, b 先与减号结合,
 执行 a- b 的运算, 再执行加 c 的运算。除了自左至右的结合性外, C 语言有三类运算符参
与运算的结合方向是从右至左。即: 

单目运算符条件运算符以及赋值运算符

。关于结

合性的概念在其他高级语言中是没有的, 这是 C 语言的特点之一。
    ++a 或 a++和--a 或 a--分别称为前置加或后置加运算和前置减或后置减运算,都是
单目运算符。值得注意的是, 前置、后置运算只能用于变量, 不能用于常量和表达式, 且结
合方向是从右至左。如当 i=6 时, 求- i++的值和 i 

的值。由于 - ”(负号) “++”为同一个优

先级, 故应理解为- (i++), 又因是后置加, 所以先有-i++的值为-6, 然后 i 增值 1 为 7, 即
i=7。
例 1 main()
{

int a=3,b=5,c;

c=a*b+++b;
printf ( “c=%d”, c);

}

要得出 c 的值, 首先要搞清+++的含义。++运算符的结合方向是自右向左的, 如果将表
达式理解为:c=a*b+(++b);实际上 C 编译器将表达式处理为:c=(a*b++)+b, 

因为 

编译器总是从左至右尽可能多地将若干个字符组成一个运算符

, 如 i+++j 等价于

(i++)+j。接下来是解决 a*b++的问题, 因为++运算符的运算对象只能是整型变量而不
能是表达式或常数, 所以 a*b++显然是 a*(b++)而非(a*b)++, 因此整个表达式就是
c=(a*(b++))+b,结果为 c=20。
例 2 main()
{

int i=1,j;

j=i+++i+++i++;
printf( “i=%d,j=%d\n”, i,j);