На этот вопрос уже есть ответ:
Со ссылкой на Разделенные запятыми возвращаемые аргументы в функции 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
Оператор return (x = x + 2, x + 1);
эквивалентен:
x = x + 2; // x == 7
return x + 1; // returns 8
При записи return (x=x+2,x+1)
, первое выражение оценено сначала, таким образом x=x+2
оценен, заставив x равняться 7 как побочный эффект. Тогда второе выражение оценено и возвращено, следовательно функция возвращается, x+1 следовательно возвращается 8.
, Если бы Вы записали return (x+2,x+1);
, результат был бы 6, потому что первое выражение x+2
не имеет никакого побочного эффекта.
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, и результат возвращается.
Обе части в эти return
оценены соответственно, и результат последней инструкции возвращается:
Сначала мы имеем:
x = x + 2 // 7
Теперь x
обновляется к 7
перед второй оценкой, которая дает:
x + 1 // 7 + 1 = 8
и наконец возвращаются 8
.
Для лучшего понимания рассматривают случай промежуточной переменной следующим образом:
return (y = x + 2, y + 1);
Это - вопрос приоритета оператора.
x=x+2,x+1
оценен как (x=x+2), (x+1)
и не как x=(x+2,x+1)
Оператор запятой представляет точку последовательности в Вашем коде. Операторы оценены в этом порядке:
x = x + 2
, в которой точке локальное x
в fun
равняется 7.
x + 1
, который оценивает к 8 и возвращается.
Для разъяснения вот заключенный в скобки приоритет оператора показа версии:
return (x=x+2),x+1;
левое выражение оценено, и его значение выброшено. Значение правого выражения - то, что возвращается.
Как другие пользователи заявили, поток команды идет слева направо, и в случае 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] и, поэтому, подтверждая эквивалентность.