gpt4 book ai didi

c++ - 结果中看不到析构函数更改的全局变量

转载 作者:太空狗 更新时间:2023-10-29 20:37:29 27 4
gpt4 key购买 nike

我在网站上看到了以下程序,但我无法理解输出。 http://codepad.org/T0qblfYg

#include <iostream>
using namespace std;

int i;

class A
{
public:
~A()
{
i=10;
}
};

int foo()
{
i=3;
A ob;
return i;
}

int main()
{
cout <<"\n 1) Before calling i is "<<i;
cout <<"\n 2) i = "<<i << " & the function return value = "
<< foo() << " and now i is " << i << endl;

return 0;
}

输出是:

 1) Before calling i is 0
2) i = 10 & the function return value = 3 and now i is 10

现在 i 是一个全局变量,A 的破坏应该在调用返回到 main 之前将其更改为 10。建议 A 的破坏发生在调用返回到 main 之后,但作为调用者,当我调用函数时,我总是希望结果是最终的。这里的函数返回值不是 10 而是 3 。

我的问题是为什么我会看到这个以及调用 destruction 的确切位置。

最佳答案

评估的顺序不是您所期望的。调用函数时,函数的参数可以按任何顺序计算,甚至可以交错。所以如果你打电话

f( g(), h(), i() );

g() 的顺序, h()i()被调用取决于编译器。 这也适用于运算符。当您有一个

形式的表达式时
expr1 << expr2 << expr3 << expr4;

表达式的计算顺序是任意的。你只知道,operator<<调用将从左到右计算,因为运算符是从左到右关联的,您可以将表达式重写为

((expr1 << expr2) << expr3) << expr4;

语法树看起来像这样:

              <<
/ \
<< expr4
/ \
<< expr3
/ \
expr1 expr2

语法树的叶子可以按任何顺序求值,甚至可以交错。在对运算符或函数调用的所有叶子求值后,将调用函数本身。

在你的情况下 foo()似乎在 i 之前被调用过第一次被打印出来,这是完全有效的(尽管是意外的)行为。

关于c++ - 结果中看不到析构函数更改的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34569249/

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