关于C语言运算符的疑问:代码运行结果为何是0 0而非0 1?
为什么你的代码输出是
0 0而不是0 1? 别着急,我们一步步拆解这段代码的执行逻辑,把每一步的变量变化都理清楚:
首先先把你的代码贴出来方便分析:
long long int a = 3, *b = &a; int c = !(a+=1, a>>=2, a--, !a); printf ("%11d %d\n", a, c);
核心:逗号表达式的执行规则
C语言里的逗号运算符,是优先级最低的运算符,它会从左到右依次执行每个子表达式,整个逗号表达式的结果是最后一个子表达式的值。我们重点分析赋值给c的那一行:!(a+=1, a>>=2, a--, !a)
步骤1:执行a+=1
初始a=3,执行a += 1后,a的值变为4。
步骤2:执行a>>=2
4的二进制是100,右移2位后变成1(二进制1),所以a的值更新为1。
步骤3:执行a--
这里是后置递减运算符,它的规则是:先返回当前a的值作为这个表达式的结果,再把a的值减1。所以这个表达式的结果是1,但执行完后a的值变成了0。
步骤4:执行!a
此时a=0,逻辑非运算符!对0取反的结果是1(C语言中0表示假,非0表示真,!假就是真,也就是1)。这是整个逗号表达式的最终结果。
最后执行外层的!
现在我们有!(1),逻辑非1的结果是0,所以c被赋值为0。
最终输出
此时a的值是0,c的值也是0,所以printf会输出0 0。
你预期的0 1可能是误以为最后!a的结果是0,但实际上a最后是0,!a是1,外层再取反就变成0了——这就是问题的关键哦。
内容的提问来源于stack exchange,提问作者Giacomo Surace
相关产品推荐
相关产品推荐

