C编译器&x27;表达式中的s递增前/后求值 今天我发现了一些东西,这让我非常担心我的C++或基本的编程技巧。问题是C++表达式的后/增量增量评价。

C编译器&x27;表达式中的s递增前/后求值 今天我发现了一些东西,这让我非常担心我的C++或基本的编程技巧。问题是C++表达式的后/增量增量评价。,c,visual-c++,gcc,expression,evaluation,C,Visual C++,Gcc,Expression,Evaluation,让我们检查一下,让我说一下,一个简单的代码示例: int a = 5; int d = a++ + a; 如我所料,'='符号的左操作数和右操作数将被独立计算,最终结果是(a++)5+(a)5,其中后递增的“a”在计算“d”后的值为6 但是,下面是我在两个流行的C编译器下得到的: MinGW: d == 11; MSVC: d == 10; 同样的情况也发生在: int a = 5; int d = a-- + a; 其中编译器给出: MinGW: d == 9; // 5 +

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

int a = 5;
int d = a++ + a;
如我所料,'='符号的左操作数和右操作数将被独立计算,最终结果是(a++)5+(a)5,其中后递增的“a”在计算“d”后的值为6

但是,下面是我在两个流行的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输出和我预期的完全一样。问题是这里到底发生了什么?哪个编译器更接近定义为标准的行为?

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

简而言之,
+
(和大多数其他二进制运算符)的操作数是相对不排序的:它们可以按任意顺序求值,并根据特定顺序(通过副作用)调用未定义的行为


当然,对于未定义的行为,合格的编译器可以选择合法地执行任何操作代码> A+++A//>是由C++标准未指定的,因此每个编译器都可以自由地评估它想要的表达式。由于这两个编译器都是正确的,您需要将表达式重写为两个单独的语句,以获得所需的特定行为。

a--+a
是未定义的行为,在堆栈溢出方面有很多问题,只需搜索序列点即可。