gpt4 book ai didi

赋值运算符中的 C++ 函数求值顺序

转载 作者:可可西里 更新时间:2023-11-01 17:35:44 25 4
gpt4 key购买 nike

int& foo() {
printf("Foo\n");
static int a;
return a;
}

int bar() {
printf("Bar\n");
return 1;
}

void main() {
foo() = bar();
}

我不确定应该先评估哪个。

我在 VC 中尝试过先执行 bar 函数。然而,在 g++ (FreeBSD) 的编译器中,它首先给出 foo 函数。

从上面的问题衍生出很多有趣的问题,假设我有一个动态数组(std::vector)

std::vector<int> vec;

int foobar() {
vec.resize( vec.size() + 1 );
return vec.size();
}

void main() {
vec.resize( 2 );
vec[0] = foobar();
}

根据先前的结果,vc 计算 foobar(),然后执行 vector 运算符 []。在这种情况下没有问题。但是,对于 gcc,由于正在评估 vec[0] 并且 foobar() 函数可能会导致更改数组的内部指针。 vec[0] 可以在 foobar() 执行后失效。

这是否意味着我们需要将代码分开以便

void main() {
vec.resize( 2 );
int a = foobar();
vec[0] = a;
}

最佳答案

在那种情况下,评估的顺序是未指定的。不要写这样的代码

类似的例子here

关于赋值运算符中的 C++ 函数求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8295205/

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