Почему возвращаемое значение функции удовольствия 8 вместо 7? [Дубликат]

На этот вопрос уже есть ответ:

Со ссылкой на Разделенные запятыми возвращаемые аргументы в функции C [duplicate] ,

x=x+2,x+1;

будет оцениваться как

x=x+2; 

Однако, в случае следующего кода

#include
#include

int fun(int x)
{
    return (x=x+2,x+1); //[A]
}

int main()
{
   int x=5;
   x=fun(x);
   printf("%d",x); // Output is 8
}

Не следует указывать строку [A], оценивать как

x=x+2;

дает x = 7

33
задан John Kugelman 16 September 2019 в 02:04
поделиться

7 ответов

Оператор return (x = x + 2, x + 1); эквивалентен:

x = x + 2; // x == 7
return x + 1; // returns 8
56
ответ дан 27 November 2019 в 06:37
поделиться

При записи return (x=x+2,x+1), первое выражение оценено сначала, таким образом x=x+2 оценен, заставив x равняться 7 как побочный эффект. Тогда второе выражение оценено и возвращено, следовательно функция возвращается, x+1 следовательно возвращается 8.

, Если бы Вы записали return (x+2,x+1);, результат был бы 6, потому что первое выражение x+2 не имеет никакого побочного эффекта.

15
ответ дан 27 November 2019 в 06:37
поделиться

QA Вы удобно связали состояния

оператор запятой, оценивает ряд выражений. Значение группы запятой является значением последнего элемента в списке.

, таким образом, значение [1 111]

x+2,x+1;

x+1 и нет никаких побочных эффектов.

<час>

Пример кода:

#include<stdio.h>
int main(int argc, char * argv){
    int x;
    x = 0;
    x = (x+2, x+1);
    printf("%d\n", x);
    return 0;
}

результаты в 1, когда выполнено.

<час>

Однако, когда Вы делаете

return (x=x+2, x+1)

, у Вас действительно есть побочный эффект : x увеличен двумя первыми, тогда x увеличен 1, и результат возвращается.

6
ответ дан 27 November 2019 в 06:37
поделиться

Обе части в эти return оценены соответственно, и результат последней инструкции возвращается:

Сначала мы имеем:

x = x + 2 // 7

Теперь x обновляется к 7 перед второй оценкой, которая дает:

x + 1 // 7 + 1 = 8

и наконец возвращаются 8.

Для лучшего понимания рассматривают случай промежуточной переменной следующим образом:

return (y = x + 2, y + 1);
12
ответ дан 27 November 2019 в 06:37
поделиться

Это - вопрос приоритета оператора.

x=x+2,x+1 оценен как (x=x+2), (x+1) и не как x=(x+2,x+1)

3
ответ дан 27 November 2019 в 06:37
поделиться

Оператор запятой представляет точку последовательности в Вашем коде. Операторы оценены в этом порядке:

  1. x = x + 2, в которой точке локальное x в fun равняется 7.

  2. x + 1, который оценивает к 8 и возвращается.

Для разъяснения вот заключенный в скобки приоритет оператора показа версии:

return (x=x+2),x+1;

левое выражение оценено, и его значение выброшено. Значение правого выражения - то, что возвращается.

0
ответ дан 27 November 2019 в 06:37
поделиться

Как другие пользователи заявили, поток команды идет слева направо, и в случае return, он отдаст значение в самом правом операторе. То, что записано перед этим оператором и разделено запятыми, не отличается от строки записанные выражения. Пример:

return (x = x + 2, x = x - 5, x + 1);

код ниже приводит к тому же результату:

x = x + 2;  
x = x - 5;
return x + 1;

Для x = 0, это возвратилось бы -2. Заметьте, что, для обоих кодов, если мы изменяемся x = x - 5 на x - 5, т.е., мы вычитаем 5 от x, но не сохраняем его результат где угодно, возвращаемое значение x изменится на [1 110] и, поэтому, подтверждая эквивалентность.

3
ответ дан 27 November 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: