((a++,b)) 是如何工作的?
How does ((a++,b)) work?
在上面的代码块中,我试图了解行 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);
}
如果问题很基础,我很抱歉。我觉得很难理解。如果有人能解释一下,那将会很有帮助。
在您的第一个代码中,
案例一:
return reverse(i++);
将导致堆栈溢出,因为 不变 i
的值将用作函数参数(因为 post 增量的效果将被排序在函数调用之后),然后 i
将增加。所以,它基本上是用不变的参数调用 reverse()
并且会导致无限递归。
案例二:
OTOH,
return reverse((i++, i));
是comma operator的神奇之处,它基本上对左边的表达式求值,舍弃值,最后returns(即使用逗号运算符)右侧表达式的评估类型和值。因此,i
的 updated 值将用作函数参数。
相当于写
return reverse(++i); //pre-inrement
将使用 i
的 更新 值。
在你的第二个代码中,
int l = (y++, x++) ? y : x;
按以下顺序进行评估
y++
已评估,结果已忽略。 y
递增。
x++
评估,考虑三元运算符的结果。这是错误的。 (记住,post 递增)。然后,x
增加(post-增量)。
- 根据三元运算符的规则,如果第一个操作数(表达式)为 FALSE(计算结果为 0),则第三个(操作数)表达式将被计算并返回值。
- 它returns将
x
的递增值存储在l
中,即1
。
在上面的代码块中,我试图了解行 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);
}
如果问题很基础,我很抱歉。我觉得很难理解。如果有人能解释一下,那将会很有帮助。
在您的第一个代码中,
案例一:
return reverse(i++);
将导致堆栈溢出,因为 不变
i
的值将用作函数参数(因为 post 增量的效果将被排序在函数调用之后),然后i
将增加。所以,它基本上是用不变的参数调用reverse()
并且会导致无限递归。案例二:
OTOH,
return reverse((i++, i));
是comma operator的神奇之处,它基本上对左边的表达式求值,舍弃值,最后returns(即使用逗号运算符)右侧表达式的评估类型和值。因此,
i
的 updated 值将用作函数参数。相当于写
return reverse(++i); //pre-inrement
将使用
i
的 更新 值。
在你的第二个代码中,
int l = (y++, x++) ? y : x;
按以下顺序进行评估
y++
已评估,结果已忽略。y
递增。x++
评估,考虑三元运算符的结果。这是错误的。 (记住,post 递增)。然后,x
增加(post-增量)。- 根据三元运算符的规则,如果第一个操作数(表达式)为 FALSE(计算结果为 0),则第三个(操作数)表达式将被计算并返回值。
- 它returns将
x
的递增值存储在l
中,即1
。