假设我们有这段代码:
#include <iostream>
int foo(int &x, int& y)
{
return x * y;
}
int main()
{
int x = 10;
int y = 5;
std::cout << foo(++x, x+=y);
}
您能否解释一下为什么此表达式给出输出256?这是参数赋值的确切顺序,还是由编译器定义的。即使在第一种情况下(当x ++在x + = y之前求值时)我们都考虑参数的两种评估顺序情况,逻辑输出应该是176,在第二种情况下240。 我真的不明白结果输出的逻辑。
答案 0 :(得分:1)
您正在做的是:-
foo(++x, x+=y);
让我们打破这个
x = 10;
y = 5;
现在++x
,这里++
是预递增运算符,这意味着第一个x
将被递增然后使用。另一方面,x++
意味着第一个{{ 1}}将被使用,然后将被递增。所以这里发生的是
x
简而言之,您要发送给函数的是
++x // turns x = 11 and then
x+=y // turns x = 16 , which also changes first parameter to x to 16
foo(16,16)
学习此主题:- 一元和二元运算符 以及前增量和后增量
答案 1 :(得分:0)
int&x和int&y成为从函数调用中求值x的引用。 函数调用之前x = 16。
换句话说,这就是您要做的(不保证对参数求值的顺序):
int main()
{
int x = 10;
int y = 5;
++x;
x+=y; // => x
std::cout << foo(x, x);
}
答案 2 :(得分:-1)
写时:
foo(++ x,x + = y);
当x = 10且y = 5时,您的第一个参数(++ x)用作x = x + 1且x现在为11。 您的第二个参数x + = y等于x = x + y,即x = 11 + 5等于16。
因此,您的x现在为16。 您正在将2 x传递给函数foo 和16 * 16 = 256,这是定义的行为。
答案 3 :(得分:-2)
int& x = y;
将x的 ADDRESS 设置为y的 ADDRESS (x是y的引用)
所以这里发生的是int x=10;
和int y=5;
。当您将参数传递给函数时,对于++x
,x的值变为x=11
,对于{{ 1}}(表示x+=y
)的值x=x+y
从x
变为x=11
,即x=11+5
。现在我们两个参数都为x=16
,即:
16
所以16 * 16是256。这是输出;
该程序中实际上没有参考。(如果我错了,请纠正我)