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

问题描述 投票:1回答:4

假设我们有这段代码:

#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,在第二种情况下我真的不明白结果输出的逻辑。

c++ parameters function-call operator-precedence
4个回答
1
投票

你在做什么: -

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


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); 
}

-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,这是一个定义的行为。


-2
投票

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.这是输出;


实际参考在这个程序中没有任何关系。(如果我错了那么请纠正我)

© www.soinside.com 2019 - 2024. All rights reserved.