gpt4 book ai didi

c++ - 调用约定和求值顺序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:56 26 4
gpt4 key购买 nike

我知道 C++ 不指定参数传递给函数的顺序。但是如果我们写下面的代码:

void __cdecl func(int a, int b, int c)
{
printf("%d,%d,%d", a,b,c);
}
int main()
{
int i=10;
func(++i, i, ++i);
}

自从 __cdecl 以来,我们能否可靠地说输出将是 12,11,11确保参数传递顺序是从右到左?

最佳答案

根据标准,您需要了解和区分两件事:

  1. C++ 没有指定参数传递到函数(正如你自己所说,这是真的!)

  2. C++ 未指定函数参数求值 [expr.call] 的顺序。

现在,请注意,__cdecl 只确保第一个,而不是第二个。 Calling conventions 决定如何传递函数参数,从左到右从右到左它们仍然可以按任何顺序进行评估!

希望这能澄清您对调用约定的疑虑。

但是,由于这些约定是 Microsoft 编译器对 C++ 的扩展,因此您的代码是不可移植的。在这种情况下,您可以看到 MSVC++ 编译器如何评估函数参数,并且如果您不想在其他平台上运行相同的代码,请放心!


func(++i, i, ++i);

请注意,此特定代码会调用未定义的行为,因为 i没有任何干预任何序列点的情况下递增了不止一次。

关于c++ - 调用约定和求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4401929/

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