C++ 通过参考传递。C+中的函数+;。断流

C++ 通过参考传递。C+中的函数+;。断流,c++,C++,你能解释一下为什么我会得到这个输出吗?我希望看到:242399相反,我看到了:242993 #include <iostream> using namespace std; int sq1(int); int sq2(int&); int main() { int x = 2, y = 3; cout<<x<<" "<<sq1(x)<<" "<<x; cout<<end

你能解释一下为什么我会得到这个输出吗?我希望看到:
242
399
相反,我看到了:
242
993

#include <iostream>

using namespace std;

int sq1(int);
int sq2(int&);

int main() {
    int x = 2, y = 3;

    cout<<x<<"  "<<sq1(x)<<"  "<<x;
    cout<<endl;
    cout<<y<<"  "<<sq2(y)<<"  "<<y;

    return 0;
}

int sq1(int n) {
    n *= n;
    return n;
}

int sq2(int &n) {
    n *= n;
    return n;
}
#包括
使用名称空间std;
int sq1(int);
INTSQ2(int&);
int main(){
int x=2,y=3;
不能在同一条线上

cout<<y<<"  "<<sq2(y)<<"  "<<y;
cout在同一行中

cout<<y<<"  "<<sq2(y)<<"  "<<y;

cout这是未定义的行为。无法保证表达式的求值顺序。但是,在这种情况下,求值是从右到左进行的,然后从左到右打印,因此首先计算y到最后一个,即3,然后在函数中将其更改为9,然后再次打印,以便输出

9 9 3  

这是未定义的行为。无法保证表达式的求值顺序。但是,在这种情况下,求值是从右到左进行的,然后从左到右打印,因此首先求值y到最后一个,即3,然后在函数中将其更改为9,然后再次打印,以便输出

9 9 3  

@juanchopanza我想说,这个问题更像是一个骗局,因为它也涉及UB。调用
cout
的顺序是未指定的,而不是未定义的。当您不按顺序修改参数时,它会变得未定义。@vsoftco可能是。请随意重新打开并关闭更好的副本。@juanchopanza不,我相信您是对的。它应该是可能只是“未指明的行为”@vsoftco我要重新打开,因为我不是100%确定。它是一个函数调用和一个值的奇怪组合。如果它涉及两个函数调用,那么它显然是未指定的。@juanchopanza我想说这个问题更像是一个重复,因为它也涉及UB。对
cout
的调用顺序是未指定的,而不是未定义的。它是当您修改参数而不进行排序时,OME是未定义的。@vsoftco可能是。请随意重新打开并关闭更好的副本。@juanchopanza不,我相信您是对的。这可能只是“未指定的行为”@vsoftco我要重新打开,因为我不是100%确定。它是一个函数调用和一个值的奇怪组合。如果它涉及两个函数调用,它显然是未指定的。我不是100%确定UB,我也是这么想的。但是,正如@juanchopanza在一篇评论中提到的。因此,通过
sq2(y)修改
y
。但是,顺序不能保证,在这种情况下,行为是“未指定”(但不是“未定义”)。@vsoftco我修改了我的语句。序列点将位于两个函数调用之间(这将是不确定的序列)我不确定这里发生了什么!@juanchopanza我现在也在读这篇文章;)看起来很微妙。我不是100%确定UB,我也是这么想的。但是,正如@juanchopanza在一篇评论中提到的。因此,通过
sq2(y)
修改
y
似乎是可以的。但是,顺序并不能保证,在这种情况下,行为是正确的“未指定”(但不是“未定义”)@vsoftco我修改了我的语句。序列点将在两个函数调用之间(这将是不确定的序列)。我不确定这里发生了什么!@juanchopanza我现在也在读这方面的文章;)看起来相当微妙。