猿问

使用STD:cout计算参数的顺序

嗨,我今天偶然发现了这段代码,我搞不懂到底发生了什么,更具体的是按照什么顺序:

代码:

#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;}

产出如下:

Value of test is :      1       Return value of function is : 1 Value of test : 0

看到这一点,我会假设,在调用函数之前,会以某种方式打印正确的大多数参数。所以这是正确的左评估?但是,在调试期间,函数似乎是在输出之前调用的,这正是我所期望的。我正在使用Win 7和MSVS 2010。任何帮助都是非常感谢的!


慕森卡
浏览 485回答 3
3回答

富国沪深

表达式中元素的计算顺序未指定(除了一些非常特殊的情况,例如&&和||运算符和三元算子,其中引入了序列点因此,我们不能保证test将在此之前或之后进行评估。foo(test)(修改它)。如果您的代码依赖于特定的计算顺序,最简单的方法就是将表达式拆分成几个分开的语句。

扬帆大鱼

这个问题的答案在C+17中改变了。对重载运算符的评估现在以与内置运算符相同的方式排序(C+17[over.medi.per]/2)。此外,<<,&nbsp;>>而订阅运算符现在有左操作数。前序函数调用的右侧和后缀表达式是前序对论点的评价。(其他二进制运算符保留其先前的顺序,例如:+仍未排序)。所以问题中的代码现在必须输出Value of test is : &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; Return value of function is : 1 Value of test : 1..但是,“不要这样做”的建议仍然是合理的,因为每个人都需要一段时间才能更新到C+17。
随时随地看视频慕课网APP
我要回答