为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕森卡 2019-07-13 15:45:23
嗨,我今天偶然发现了这段代码,我搞不懂到底发生了什么,更具体的是按照什么顺序:代码:#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。任何帮助都是非常感谢的!
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

表达式中元素的计算顺序未指定(除了一些非常特殊的情况,例如&&||运算符和三元算子,其中引入了序列点因此,我们不能保证test将在此之前或之后进行评估。foo(test)(修改它)。

如果您的代码依赖于特定的计算顺序,最简单的方法就是将表达式拆分成几个分开的语句。


查看完整回答
反对 回复 2019-07-13
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

这个问题的答案在C+17中改变了。

对重载运算符的评估现在以与内置运算符相同的方式排序(C+17[over.medi.per]/2)。

此外,<<>>而订阅运算符现在有左操作数。前序函数调用的右侧和后缀表达式是前序对论点的评价。

(其他二进制运算符保留其先前的顺序,例如:+仍未排序)。

所以问题中的代码现在必须输出Value of test is :      0       Return value of function is : 1 Value of test : 1..但是,“不要这样做”的建议仍然是合理的,因为每个人都需要一段时间才能更新到C+17。


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 484 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信