You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:37:30