gpt4 book ai didi

c++ - 优化后的 VS2008 中 "<<"和 "++"的运算符优先级

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

我遇到了一个奇怪的 VS2008 C++ 问题,看起来好像没有遵守运算符优先级。

我的问题是这个输出是什么:

int i = 0;  
std::cout << ((i != 0) ? "Not zero " : "zero ") << ++i << std::endl;

通常是 ++优先于 << , 正确的?或者是 <<被认为是一个函数调用,赋予它比 ++ 更高的优先级? 100% 正确的标准答案是什么?

为了检查,我创建了一个新的空项目(VS2008 控制台应用程序),仅将这段代码粘贴到主目录中,结果如下:

Debug|Win32: “zero 1”  
Release|Win32: “zero 1”
Debug|x64: “zero 1”
Release|x64: “Not zero 1”

顺便说一句,下面的例子产生了完全相同的结果:

i = 0;  
printf("%s %d\n", ((i != 0) ? "Not zero" : "zero"), ++i);

并且在发布中更改优化类型也没有效果,但禁用优化会像其他配置一样输出“0 1”。

最佳答案

这与运算符优先级无关。
您正在使用 << 这是函数调用的语法糖:

std::cout << ((i != 0) ? "Not zero " : "zero ") << ++i << std::endl; 

// Equivalent too:

operator<<(operator<<(operator<<(std::cout, ((i != 0) ? "Not zero " : "zero ")), ++i), std::endl);

这里唯一的规则是在调用函数之前必须对参数进行完整评估。对参数的评估顺序没有限制,即使它们的评估与调用交错(甚至部分评估)也是如此。

解释一:

1) ((i != 0) ? "Not zero " : "zero "))
2) ++i
3) operator<<(std::cout, (1));
4) operator<<((3), (2));
5) operator<<((4), std::endl);

解读2:

1) ++i
2) ((i != 0) ? "Not zero " : "zero "))
3) operator<<(std::cout, (2));
4) operator<<((3), (1));
5) operator<<((4), std::endl);

解释3:

1) ((i != 0) ? "Not zero " : "zero "))
2) operator<<(std::cout, (1));
3) ++i
4) operator<<((2), (3));
5) operator<<((4), std::endl);

看解释1作为引用:
必须应用的规则:

 A) (1) happens before (3)
B) (2) happens before (4)
C) (3) happens before (4)
D) (4) happens before (5)

关于c++ - 优化后的 VS2008 中 "<<"和 "++"的运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463261/

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