再一次,我们最喜欢“i = i--”般的问题。在C99,我们有:
6.5表达式#2:在前一个和下一个序列点之间a 对象应具有其存储值 最多修改一次
70)本段提出 !未定义!语句表达式 比如
i = ++i + 1;
但是对于未完成的行为,可以存在从随机输出到“以文档化方式执行程序”的变体(c99 3.4.3)
所以,问题是:
gcc是否记录了i = i ++,i = i--等行为的行为?
实际代码是
int main(){int i=2;i=i--;return i;}
答案 0 :(得分:5)
GCC不会记录此行为。 Warning Options page提到-Wsequence-point
中的序列点问题,但没有暗示明确定义的违规行为。
GCC确实有一个很好的C Implementation Defined Behaviour列表,但我在这里找不到任何对这个问题的引用。
答案 1 :(得分:1)
由后端实现决定它的作用。您可以使用-S
并检查生成的代码以确定事件的确切顺序。
答案 2 :(得分:1)
没有记录,但即便如此,我也不想阅读它。在运行未定义的行为时,您永远不应该依赖于特定实现的功能。
答案 3 :(得分:0)
为什么你想要这样做呢?认真。我很好奇。