【问题标题】:The result of (a=a+1)+(a=a+1)+(a=a+1) in c? [duplicate]c 中 (a=a+1)+(a=a+1)+(a=a+1) 的结果? [复制]
【发布时间】:2017-01-30 11:57:29
【问题描述】:

当我用 gcc 编译这段代码并运行时

int a=1;
printf("%d",(a=a+1)+(a=a+1)+(a=a+1));

我希望结果是 2+3+4=9,但输出是 10。

我知道 (++a)+(++a)+(++a) 中存在未定义的行为,因为可以在评估所有 (++a) 之前运行三个 ++ 副作用。

但我认为a=a+1 的值正是a 在评估分配后的值。所以编译器不能先处理三个a=a+1,然后将变量a中的值作为a=a+1的值,毕竟a=a+1被评估了。

我想根据c标准知道哪里错了。

【问题讨论】:

  • 代码没有实际用处。序列点等
  • 我正在研究编译器,我想知道编译器是如何按照c标准工作的
  • “但我认为 a=a+1 的值正是 a 在赋值后的值。”为什么你这么想?为什么这与++a 有什么不同? (提示:不是。)
  • @rici 你不认为必须对这种意外行为做出解释吗?
  • a=a+1 中的每一个都可以顺序或并行或两者兼而有之。缺少序列点会导致结果模棱两可。

标签: c expression undefined-behavior sequence-points


【解决方案1】:

赋值运算符不是序列点。假设a 只是一个标识符(例如,不是可能扩展为更复杂的东西的宏参数)并且没有原子类型(C11),a=a+1 在语义上与@987654323相同 @。

我想将此问题标记为数百个 ++ 运算符序列点问题之一的重复,但您的问题似乎是关于为什么这种形式没有什么不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 2015-08-26
    • 1970-01-01
    • 2014-09-07
    • 2022-12-17
    • 1970-01-01
    • 2013-12-25
    • 2011-04-03
    相关资源
    最近更新 更多