C编译器在表达式中的前/后递增评估

时间:2015-01-25 01:52:48

标签: c visual-c++ gcc expression evaluation

今天我发现了一些让我对C ++或基本编程技巧非常焦虑的东西。问题是使用post / pre增量进行C ++表达式评估。

让我们检查一下,让我说一下代码的简单例子:

int a = 5;
int d = a++ + a;

据我所料,左右操作数为' ='标志将独立地进行calucalted,最终结果是(a ++)5 +(a)5,其中后递增' a'价值6以下' d'计算。

但是,这是我在两个流行的C编译器下得到的东西:

MinGW: d == 11;
MSVC:  d == 10;

同样的情况是:

int a = 5;
int d = a-- + a;

编译器给出的地方:

MinGW: d == 9;     // 5 + 4  , a=4 after 'a--', before '+a'?
MSVC:  d == 10;    // 5 + 5  , a=4 after 'a-- + a'?

MSVC out与我的预期完全一致。问题是这里真的发生了什么?哪个编译器更接近标准定义的行为?

2 个答案:

答案 0 :(得分:2)

有趣的是,您应该询问“定义为标准的行为”;事实上,两个编译器完全符合标准,因为您的程序会调用未定义的行为

简而言之,+(以及大多数其他二元运算符)的操作数相对于彼此未序列:它们可以按任意顺序进行评估,具体取决于特定的顺序(通过副作用)调用未定义的行为。

当然,对于未定义的行为,符合标准的编译器可以选择合法地执行任何操作。

答案 1 :(得分:0)

表达式a++ + a的执行顺序未由C ++标准指定,因此每个编译器都可以自由地评估它想要的表达式。由于两个编译器都是正确的,因此您需要将表达式重写为两个单独的语句,以获得所需的特定行为。