假设我们有这段代码:
#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,在第二种情况下我真的不明白结果输出的逻辑。
你在做什么: -
foo(++x, x+=y);
让我们打破这个x = 10;
y = 5;
现在++x
,这里++
是preincrement运算符,这意味着第一个x
将增加然后使用。另一方面x++
意味着将使用第一个x
然后它将增加。所以这里发生的是
++x // turns x = 11 and then
x+=y // turns x = 16 , which also changes first parameter to x to 16
简而言之,你发送的功能是什么
foo(16,16)
16*16 = 256
学习这个主题: - 一元和二元运算符和preincrement和postincrement
int&x和int&y这些成为函数调用中评估x的引用。函数调用前x = 16。
换句话说,这就是你所做的(不保证评估参数的顺序):
int main()
{
int x = 10;
int y = 5;
++x;
x+=y; // => x
std::cout << foo(x, x);
}
当你写:
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,这是一个定义的行为。
int& x = y;
将x的ADDRESS设置为y的地址(x是对y的引用)
所以这里发生的是int x=10;
和int y=5;
。当你将参数传递给函数时,对于++x
x的值变为x=11
而对于x+=y
(这意味着x=x+y
),x
的值从x=11
变为x=11+5
,即x=16
。现在我们有16
这两个参数:
int foo(16, 16)
{
return 16 * 16;
}
所以16 * 16是256.这是输出;
实际参考在这个程序中没有任何关系。(如果我错了那么请纠正我)