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我现在也在读这方面的文章;)看起来相当微妙。