C ((a&&x2B;&&x2B;,b))是如何工作的?
在上面的代码块中,我试图理解行C ((a&&x2B;&&x2B;,b))是如何工作的?,c,function,recursion,comma-operator,C,Function,Recursion,Comma Operator,在上面的代码块中,我试图理解行返回reverse((I++,I))是如何工作的 #include <stdio.h> void reverse(int i); int main() { reverse(1); } void reverse(int i) { if (i > 5) 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));
}
#包括
无效反向(int i);
int main()
{
反面(1);
}
无效反向(int i)
{
如果(i>5)
回来
printf(“%d”,i);
//返回反向(i++);--堆栈溢出
返回反向((i++,i));
}
我还发现了下面的代码,其工作原理与此类似
#include <stdio.h>
int main()
{
int y = 1, x = 0;
int l = (y++, x++) ? y : x;
printf("%d\n", l);
}
#包括
int main()
{
int y=1,x=0;
int l=(y++,x++)?y:x;
printf(“%d\n”,l);
}
如果这个问题很基本,我很抱歉。我觉得很难理解。如果有人能解释,这会很有帮助。在您的第一段代码中
- 案例1:
将导致堆栈溢出,因为未更改的return reverse(i++);
的值将用作函数参数(因为后增量的效果将在函数调用后排序),然后i
将增加。因此,它基本上是使用不变的参数调用i
,并将导致无限递归reverse()
- 案例2:
奥托return reverse(i++);
是的魔力,它基本上对左侧表达式求值,丢弃值并最终返回(即使用逗号运算符的结果)右侧表达式求值的类型和值。因此,return reverse((i++, i));
的更新值将用作函数参数 这相当于写作i
其中将使用return reverse(++i); //pre-inrement
的更新值i
在第二个代码中
int l = (y++, x++) ? y : x;
按以下顺序进行计算
已计算,结果已忽略<代码>y递增y++
已计算,结果考虑三元运算符。这是错误的。(记住,增量后)。然后,x++
增加(增量后)x
- 根据三元运算符的规则,如果第一个操作数(表达式)为FALSE(计算结果为0),则第三个操作数(表达式)将被计算并返回值
- 它返回要存储在
中的l
的增量值,即x
1
- 案例1:
将导致堆栈溢出,因为未更改的return reverse(i++);
的值将用作函数参数(因为后增量的效果将在函数调用后排序),然后i
将增加。因此,它基本上是使用不变的参数调用i
,并将导致无限递归reverse()
- 案例2:
奥托return reverse(i++);
是的魔力,它基本上对左侧表达式求值,丢弃值并最终返回(即使用逗号运算符的结果)右侧表达式求值的类型和值。因此,return reverse((i++, i));
的更新值将用作函数参数 这相当于写作i
其中将使用return reverse(++i); //pre-inrement
的更新值i
- 在您的第一个代码中
在第二个代码中
int l = (y++, x++) ? y : x;
按以下顺序进行计算
已计算,结果已忽略<代码>y递增y++
已计算,结果考虑三元运算符。这是错误的。(记住,增量后)。然后,x++
增加(增量后)x
- 根据三元运算符的规则,如果第一个操作数(表达式)为FALSE(计算结果为0),则第三个操作数(表达式)将被计算并返回值
- 它返回要存储在
中的l
的增量值,即x
1
reverse((i++,i))
实际上与reverse(++i)
相同。谢谢@joachimpileborgeread。顺便说一下,表达式reverse((i++,i))
实际上与reverse(++i)
相同。谢谢@JoachimPileborgYes,我错过了什么?非常感谢@Sourav Ghosh。我从未实时研究过逗号运算符。因此,我们发现很难将这种用法与普通函数调用区分开来。现在理解正确了。@Denise不客气。:-)顺便说一句,这是“Gosh”,不是“Gosh”。-)(别担心,你不是第一个打字的人,我几乎习惯了。)你可以考虑一个帮助你的答案。谢谢:)@Sourav Ghosh是的,我错过了什么?非常感谢@Sourav Ghosh。我从未实时研究过逗号运算符。因此,我们发现很难将这种用法与普通函数调用区分开来。现在理解正确了。@Denise不客气。:-)顺便说一句,这是“Gosh”,不是“Gosh”。-)(别担心,你不是第一个打字的人,我几乎习惯了。)你可以考虑一个帮助你的答案。谢谢:)@Sourav Ghosh