gpt4 book ai didi

c++ - 为什么不同的 C++ 编译器对此代码给出不同的结果?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:05:19 24 4
gpt4 key购买 nike

我正在编写一些 C++ 代码来娱乐和练习,以了解有关语言功能的更多信息。我想更多地了解静态变量及其在递归函数中的行为。在 g++ 编译器中尝试这段代码,我得到了预期的结果:

#include <iostream>
using namespace std;

int f(const int& value)
{
static int result = 0;
return result += value;
}

int main()
{
cout << f(10) << ", " << f(f(10)) << ", " << f(f(f(10)));
return 0;
}

但我的 friend 在 Microsoft Visual C++ 6 中测试了相同的代码。输出是 50, 80, 90 我用其他 C++ 编译器(g++、Borland、Code::blocks 和 Linux 下的 MingW, Win 和 Mac) 输出为 110, 100, 40。我不明白输出怎么可能是 50, 80, 90 ...

为什么 MSVC 的输出不同?

最佳答案

未指定以下三个子表达式的求值顺序:

f(10)
f(f(10))
f(f(f(10)))

编译器可以按任何顺序评估这些子表达式。您不应依赖程序中的特定求值顺序,尤其是当您打算使用多个编译器进行编译时。

这是因为该表达式中的任何地方都没有序列点。唯一的要求是在需要结果之前(即在打印结果之前)对每个子表达式求值。

在您的示例中,实际上有几个子表达式,我在这里将其标记为 a 到 k:

//   a  b     c       d  e f      g       h  i j k
cout << f(10) << ", " << f(f(10)) << ", " << f(f(f(10)));

调用operator<< ( acdgh )都必须按顺序计算,因为每个都取决于上一次调用的结果。同样,b必须在 a 之前进行评估可以评估,并且k必须在 j 之前进行评估, i , 或 h可以评估。

但是,其中一些子表达式之间没有依赖关系:b 的结果不依赖于 k 的结果, 因此编译器可以自由生成计算 k 的代码然后 bb然后 k .

有关序列点和相关未指定和未定义行为的更多信息,请考虑阅读 Stack Overflow C++ 常见问题解答文章,"Undefined Behavior and Sequence Points" (您的程序没有任何未定义的行为,但本文的大部分内容仍然适用)。

关于c++ - 为什么不同的 C++ 编译器对此代码给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5158014/

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