在上面的代码块中,我试图了解行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);
}
如果问题非常基本,我很抱歉。我觉得很难理解。如果有人可以解释,那将会有所帮助。
答案 0 :(得分:5)
在您的第一个代码中,
案例1:
return reverse(i++);
将导致堆栈溢出,因为未更改 i
的值将用作函数参数(因为后增量的效果将在函数调用之后排序),然后{ {1}}会增加。所以,它基本上是在没有参数的情况下调用i
并且会导致无限递归。
案例2:
OTOH,
reverse()
是comma operator的神奇之处,它基本上评估左表达式,丢弃该值,最后返回(即使用逗号运算符的结果)的类型和值评估右手表达。因此,return reverse((i++, i));
的更新值将用作函数参数。
相当于写作
i
将使用return reverse(++i); //pre-inrement
的更新值。
在你的第二个代码中,
i
按以下顺序进行评估
int l = (y++, x++) ? y : x;
已评估,结果已被忽略。 y++
递增。y
评估,结果考虑为三元运算符。这是假的。 (记住,增加后)。然后,x++
增加(后增量)。x
中,x
。