gpt4 book ai didi

C 编译器在表达式中的前/后增量求值

转载 作者:行者123 更新时间:2023-11-30 18:55:16 30 4
gpt4 key购买 nike

今天我发现了一些东西,让我对我的 C++ 或基本编程技能感到非常焦虑。问题是带有后/前增量的 C++ 表达式求值。

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

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

正如我所料,“=”号的左右操作数会独立计算,最终结果是(a++) 5 + (a) 5,其中后自增的“a”值为6after计算 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 输出与我的预期完全一致。问题是这里到底发生了什么?哪个编译器更接近标准定义的行为?

最佳答案

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

简而言之,+(以及大多数其他二元运算符)的操作数彼此之间无序:它们可以按任意顺序进行计算,并且取决于特定的顺序(通过副作用)会调用未定义的行为。

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

关于C 编译器在表达式中的前/后增量求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28132405/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com