Неожиданный вывод с использованием выражений в списке параметров - PullRequest
0 голосов
/ 08 сентября 2018

Предположим, у нас есть этот кусок кода:

#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 голосов
/ 08 сентября 2018

int& x = y; устанавливает x ADDRESS для y ADDRESS (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. Это вывод;


на самом деле ссылка не имеет ничего общего с этой программой (если я ошибаюсь, поправьте меня)

0 голосов
/ 08 сентября 2018

Когда вы пишете:

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, что является определенным поведением.

0 голосов
/ 08 сентября 2018

что вы делаете это: -

foo(++x, x+=y);

давай сломаем это x = 10; y = 5;

сейчас ++x, здесь ++ - это оператор преинкремента, что означает, что сначала 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 голосов
/ 08 сентября 2018

int & x и int & y, которые становятся ссылкой на вычисленный x из вызова функции. x = 16 перед вызовом функции.

Другими словами, это то, что вы делаете (порядок вычисления аргументов не гарантируется):

int main()
{
   int x = 10;
   int y = 5;
   ++x;
   x+=y; // => x 

   std::cout << foo(x, x); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...