C++ 用“调用函数”;";“a”中的声明;";陈述

C++ 用“调用函数”;";“a”中的声明;";陈述,c++,function,cout,C++,Function,Cout,我在处理代码时遇到了这种相当模糊的行为,下面是一个例子: #include <iostream> using namespace std; int print(void); int main(void) { cout << "The Lucky " << print() << endl; //This line return 0; } int print(void) { cout << "No

我在处理代码时遇到了这种相当模糊的行为,下面是一个例子:

#include <iostream>

using namespace std;


int print(void);

int main(void)
{
    cout << "The Lucky " << print() << endl;     //This line
    return 0;
}

int print(void)
{
    cout << "No : ";
    return 3;
}
#包括
使用名称空间std;
整版印刷(作废);
内部主(空)
{

cout函数参数的求值顺序未指定。您的代码行在编译器看来如下:

operator<<(operator<<(operator<<(cout, "The Lucky "), print()), endl);
所以,要回答你的问题:

什么导致了这种行为?这是否与C++标准有关,或者它的行为从一个编译器到另一个编译器不同?
它可能因编译器而异。

让我们在我的编译器中调用
操作符否:幸运3是输出…这意味着它的行为因编译器而异。

为什么你认为你的期望而不是实际结果更符合逻辑?你能解释你的推理吗?旁注:你的
原则t
函数是具有副作用的函数的一个很好的例子。除了计算返回值外,它还改变全局程序状态。这类函数通常更难推理。通常,努力实现计算值或改变状态的函数,但不能同时计算值和改变状态。这是完全可能的,我可能开始查看;)@atamanroman:在下面的表达式中:
operator@atamanroman:为了精确起见,您可能需要注意“未定义”和“未指定”之间的区别行为。粗略地说,未定义的行为意味着任何事情都可能发生;未指定的行为意味着发生的事情取决于实现(但实现不需要记录它们所做的事情)@atamanroman:行为不是未定义的,它是未指定的——这是有区别的。编译器可以按照它认为最好的顺序(包括随机顺序)计算参数,而不能完全不计算参数或炸掉你的烤面包机。@atamanroman:
cout
operator<<(operator<<(cout, "The Lucky "), print())
operator<<(cout, "The Lucky ")
cout << "The Lucky"
operator(cout, "The Lucky")
operator(operator(cout, "The Lucky"), print() )
The Lucky No : 3