((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(即使用逗号运算符)右侧表达式的评估类型和值。因此,iupdated 值将用作函数参数。

    相当于写

    return reverse(++i);    //pre-inrement
    

    将使用 i 更新 值。


在你的第二个代码中,

  int l = (y++, x++) ? y : x;

按以下顺序进行评估

  • y++ 已评估,结果已忽略。 y 递增。
  • x++ 评估,考虑三元运算符的结果。这是错误的。 (记住,post 递增)。然后,x增加(post-增量)。
  • 根据三元运算符的规则,如果第一个操作数(表达式)为 FALSE(计算结果为 0),则第三个(操作数)表达式将被计算并返回值。
  • 它returns将x递增值存储在l中,即1