使用参数列表中的表达式的意外输出

时间:2018-09-08 06:56:23

标签: c++ parameters function-call operator-precedence

假设我们有这段代码:

#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。 我真的不明白结果输出的逻辑。

4 个答案:

答案 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+yx变为x=11,即x=11+5。现在我们两个参数都为x=16,即:

16

所以16 * 16是256。这是输出;


该程序中实际上没有参考。(如果我错了,请纠正我)