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