我在C
中有一个小代码#include<stdio.h>
int main()
{
int a=10,b;
b=a++ + ++a;
printf("%d,%d,%d,%d",b,a++,a,++a);
return 0;
}
Turbo C提供以下输出(如预期的那样)
22,13,13,13
但是GCC(在Windows中使用ubuntu和代码块编译器)给出了以下内容
22,13,14,14
我相信Turbo c输出是正确的,但是GCC如何返回不同的输出?
答案 0 :(得分:4)
他们都是正确的!这是未定义的行为,因为您不允许多次在单个调用中更改相同的值。
来自c99 ISO / IEC 9899:TC3 - &gt; Apenndix J:
J.2未定义的行为 1在以下情况下,行为未定义:
[...]
- 在两个序列点之间,对象被多次修改或被修改 并且读取先前值而不是确定要存储的值(6.5)。
修改强>
在参考icepacks评论谁告诉turbo c早于c99时,我还添加了
的引用C89标准编程语言C,X3。??? - 1988:
A.6.2未定义的行为 以下情况中的行为未定义:
[..]
- 对象被多次修改,或者被修改和访问,而不是在两个序列点(3.3)之间确定新值。
答案 1 :(得分:2)
这是一种未定义的行为。与在C中一样,没有函数参数评估的规范,因此编译器可以以任何方式自由地进行。这是不确定和任意的。
C99标准6.5。: -
在前一个和下一个序列点之间,一个对象应该具有它 通过表达式的评估,最多修改一次存储值。 此外,先前的值应只读以确定该值 存储。