Fai*_*Dev 12 c++ stdout visual-studio language-lawyer
大家好我今天偶然发现了这段代码,我对于究竟发生了什么以及更具体的顺序感到困惑:
代码:
#include <iostream>
bool foo(double & m)
{
m = 1.0;
return true;
}
int main()
{
double test = 0.0;
std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << foo(test) << "\tValue of test : " << test << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Value of test is : 1 Return value of function is : 1 Value of test : 0
Run Code Online (Sandbox Code Playgroud)
看到这一点,我会假设在调用函数之前打印出最正确的参数.那么这是对的评价吗?在调试期间,虽然似乎在输出之前调用该函数,这是我所期望的.我正在使用Win7和MSVS 2010.任何帮助表示赞赏!
Mat*_*lia 22
表达式中元素的评估顺序是未指定的(除了一些非常特殊的情况,例如&&
和||
运算符和引入序列点的三元运算符); 所以,不保证test
会在之前或之后foo(test)
(修改它)进行评估.
如果您的代码依赖于特定的评估顺序,获取它的最简单方法是将表达式拆分为多个单独的语句.
这个问题的答案在C ++ 17中已更改。
现在,重载运算符的评估与内置运算符的排序方法相同(C ++ 17 [over.match.oper] / 2)。
此外,<<
,>>
和下标操作现在有左操作之前测序的权利,以及函数调用的后缀表达式是之前测序的参数评价。
(其他二进制运算符保留其先前的顺序,例如+
仍未排序)。
因此,现在必须输出问题中的代码Value of test is : 0 Return value of function is : 1 Value of test : 1
。但是建议“不要这样做”仍然是合理的,因为每个人都需要一些时间才能更新到C ++ 17。