3

再一次,我们最喜欢“i=i--”之类的问题。在 C99 中,我们有:

6.5 表达式#2:在前一个和下一个序列点之间,对象的存储值最多修改一次

70) 这一段呈现 !!undefined!! 语句表达式,例如

i = ++i + 1;

但是对于未定义的行为,可以有从随机输出到“以记录方式执行程序”(c99 3.4.3)的变体

所以,问题:

gcc 是否记录i=i++、i=i-- 等语句的行为?

实际代码是

int main(){int i=2;i=i--;return i;}
4

4 回答 4

5

GCC 没有记录这种行为。警告选项页面在中提到了序列点问题-Wsequence-point,但没有暗示明确定义的违规语义。

GCC 确实有一个很好的C Implementation Defined Behavior列表,但我在这里也找不到对这个问题的任何参考。

于 2010-08-25T15:24:17.093 回答
1

它留给后端实现来决定它的作用。您可以使用-S和检查生成的代码来确定确切的事件顺序。

于 2010-08-25T15:16:45.007 回答
1

它没有记录,但即使它是,我也不想阅读它。当遇到未定义的行为时,您永远不应该依赖特定的实现。

于 2010-08-25T15:27:51.970 回答
0

你到底为什么要那样做?严重地。我很好奇。

于 2010-08-25T15:54:36.100 回答