以下C语言代码运行输出结果为0,请问是什么原因导致的?
你给出的代码如下:
int main(){ int x = 0x80000000; x = x<<1 + x; printf("%d \n",x); }
问题原因分析
核心问题是C语言运算符优先级规则导致运算顺序和你的预期不符,具体推导如下:
- C语言中加法运算符
+的优先级高于移位运算符<<,因此你写的表达式x << 1 + x的实际执行顺序是x << (1 + x),而非你预期的(x << 1) + x。 - 具体运算过程:
- 你定义的
int x = 0x80000000在32位有符号int环境下,对应十进制值为-2147483648,也就是32位有符号int的最小值。 - 优先计算
1 + x,结果为1 + (-2147483648) = -2147483647。 - C语言标准明确规定:移位运算符的右操作数如果为负数,或者右操作数大于等于左操作数的类型位宽,属于未定义行为。你当前的运行环境中,该未定义行为的表现为移位结果返回0,因此最终x的输出为0。
- 你定义的
解决方法
如果要得到你预期的结果,有两种可行方案:
- 用临时变量拆分运算,也就是你测试过的方案:
int y = x << 1; x = y + x;
- 手动添加括号强制指定运算顺序:
x = (x << 1) + x;
内容的提问来源于stack exchange,提问作者Lilac09
相关产品推荐
相关产品推荐

