今天我发现了一些让我对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与我的预期完全一致。问题是这里真的发生了什么?哪个编译器更接近标准定义的行为?
答案 0 :(得分:2)
有趣的是,您应该询问“定义为标准的行为”;事实上,两个编译器完全符合标准,因为您的程序会调用未定义的行为。
简而言之,+
(以及大多数其他二元运算符)的操作数相对于彼此未序列:它们可以按任意顺序进行评估,具体取决于特定的顺序(通过副作用)调用未定义的行为。
当然,对于未定义的行为,符合标准的编译器可以选择合法地执行任何操作。
答案 1 :(得分:0)
表达式a++ + a
的执行顺序未由C ++标准指定,因此每个编译器都可以自由地评估它想要的表达式。由于两个编译器都是正确的,因此您需要将表达式重写为两个单独的语句,以获得所需的特定行为。