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

标签 c visual-c++ gcc expression evaluation

今天我发现了一些东西,让我对我的 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/

相关文章:

c - SHV ID : 79856 Can not create validator

c - 如何裁剪加载 SOIL 的图像

c++ - MSVC : explicit template instantiation fails while implicit instantiation succeeds

c - gcc: 无法从目标文件创建 .so

linux - 无法编译包含 <linux/leds.h> 的 C 程序

c - 防止 gcc 中错误的宏扩展

c++ - fstat() 在预加载的 mmap() 系统调用中无法按预期工作

c++ - C++中如何访问基类的成员变量?

c++ - 将源文件的一些头依赖项添加到 cmake 目标的解决方案资源管理器

c - LLVM和GCC,不同的输出相同的代码