c++ - 使用MSVC编译器和GCC编译器得到不同的结果

标签 c++ language-lawyer order-of-execution sequence-points compiler-specific

我有这个简单的小代码:

#include <iostream>

int Add (int x, int y) {
    std::cout << "In Add(), received " <<x<< " and " <<y<< "\n";
    return (x+y);
}

int main () {
    std::cout << "In main ()\n";
    std::cout << "\nCalling Add ()\n";
    std::cout << "value: " << Add (3,4);
    std::cout << "\nback to main ().\n";
    std::cout << "\nout..\n\n";
    return 0;
}

如果我用 MSVC 编译器编译它,结果是:

In main ()

Calling Add ()
In Add(), received 3 and 4
value: 7
back to main ().

out..

但是在 GCC 中,结果是:

In main ()

Calling Add ()
value: In Add(), received 3 and 4
7
back to main ().

out..

为什么输出不一样?我还想知道是否有办法让两个编译器具有相同的输出。

最佳答案

在 c++17 之前,运算符 <<不是排序点,因此std::cout << "value: " << Add (3,4);可以按任何顺序进行评估。

C++17 保证从左到右求值,这在您的情况下是错误的行为。

我的猜测是您使用的编译器的特定版本具有不同的默认 C++ 版本,并且 MSVC 从右到左计算表达式。

您应该将表达式拆分为多个语句。一般来说,我的建议是将计算与报告分开,即在日志记录或其他条件(如 assert )部分中不要进行任何计算。

关于c++ - 使用MSVC编译器和GCC编译器得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77253370/

相关文章:

c++ - 从大括号初始化列表直接初始化中的复制省略

c - write 和 printf 乱序输出

c++ - 多个 vtables,在打电话时以错误的方式结束

c++ - 重写 push_back C++

c++ - 哪个 << 是我在这条语句中的重载运算符?

c++ - 基于对准要求的优化

c++ - 在两个线程之间共享一个 int 时可能会出现什么问题?

c++ - `y=++y`,这个标准符合吗? [出现在微软的测试中]

c++ - 继承中调用构造函数/析构函数的顺序

python - python类的执行顺序