Как ((a++,b)) работает?
В приведенном выше блоке кода, я пытаюсь понять, как строка return reverse((i++, i))
работает.
#include <stdio.h>
void reverse(int i);
int main()
{
reverse(1);
}
void reverse(int i)
{
if (i > 5)
return ;
printf("%d ", i);
// return reverse(i++); -- stack overflow
return reverse((i++, i));
}
Я также нашел следующий фрагмент кода, который работает аналогично.
#include <stdio.h>
int main()
{
int y = 1, x = 0;
int l = (y++, x++) ? y : x;
printf("%d\n", l);
}
Прошу прощения, если вопрос очень простой. Мне было очень трудно это понять. Если кто-то может объяснить, это будет полезно.
1 ответ
В вашем первом коде
Случай 1:
return reverse(i++);
вызовет переполнение стека как значение без изменений
i
будет использоваться в качестве аргумента функции (так как эффект последующего приращения будет секвенироваться после вызова функции), а затемi
будет увеличено. Итак, это в основном вызываетreverse()
с неизменным аргументом и приведет к бесконечной рекурсии.Случай 2:
Ото,
return reverse((i++, i));
является магическим оператором запятой, который в основном оценивает левое выражение, отбрасывает значение и, наконец, возвращает (т. е. результат использования оператора запятой) тип и значение вычисления выражения правой части. Итак, обновленное значение
i
будет использоваться в качестве аргумента функции.Это эквивалентно написанию
return reverse(++i); //pre-inrement
где обновленное значение
i
будет использоваться.
Во втором коде
int l = (y++, x++) ? y : x;
оценивается в следующем порядке
y++
оценивается, результат игнорируется.y
увеличиваетсяx++
оценивается, результат рассматривается для троичного оператора. Это ЛОЖЬ. (Помните, пост увеличение). Затем,x
увеличивается (постинкремент).- Согласно правилу троичного оператора, если первый операнд (выражение) - ЛОЖЬ (оценивается как 0), то третье (операнд) выражение будет оценено, и значение будет возвращено.
- Возвращает увеличенное значение
x
храниться вl
, который1
,