C语言运算符优先级容易让人误解问题

优先级问题表达式人们可能误以为的结果实际结果
.的优先级高于*。 ->操作符用于消除这个问题*p.fp所指对象的字段f (*p).f对 p 取 f 偏移,作为指针,然后进行解除引用操作。*(p.f)
[]高于*int *ap[]ap是个指向int数组的指针 int(*ap)[]ap是个元素为 int 指针的数组 int *(ap[])
函数 () 高于*int *fp()fp是个函数指针,所指函数返回int。int(*fp)()fp是个函数,返回int* int *(fp())
== 和 != 高于位操作符(val & mask != 0)(val & mask) != 0val & (mask != 0)
== 和 != 高于赋值符c = getchar()!=EOF(c = getchar() )!= EOFc = (getchar() != EOF)
算术运算高于移位运算符msb<<4 + lsb(msb << 4) + lsbmsb<<(4 + lsb)
逗号运算符在所有运算符中优先级最低i=1,2i=(1,2)( i= 1 ),2

这些运算符中的大部分,如果坐下来好好想下,就会变得明了。尽管有些涉及逗号的情况有时会让程序员歇斯底里。例如,当下面代码执行时:

i= 1, 2;

i 的最终结果将是什么? 对,我们知道逗号运算符的值就是最右边操作数的值。但在这里,赋值符的优先级更高,所以实际情况应该是:

(i = 1),2;      /* i的值为1 */

i 赋值为1,接着执行常量2的运算,计算结果丢弃。最终,i 的结果是1而不是2。

本文引自《C专家编程》,在此仅作笔记记录。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值