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

以下C语言代码运行输出结果为0,请问是什么原因导致的?

你给出的代码如下:

int main(){
int x = 0x80000000;
x = x<<1 + x;
printf("%d \n",x);
}

问题原因分析

核心问题是C语言运算符优先级规则导致运算顺序和你的预期不符,具体推导如下:

  1. C语言中加法运算符+的优先级高于移位运算符<<,因此你写的表达式x << 1 + x的实际执行顺序是x << (1 + x),而非你预期的(x << 1) + x。
  2. 具体运算过程:
    • 你定义的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 03:06:00