((a ++,b))如何运作?

时间:2015-06-23 06:55:22

标签: c function recursion comma-operator

在上面的代码块中,我试图了解行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);
    }

如果问题非常基本,我很抱歉。我觉得很难理解。如果有人可以解释,那将会有所帮助。

1 个答案:

答案 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++增加(后增量)。
  • 根据三元运算符的规则,如果第一个操作数(表达式)为FALSE(计算结果为0),则将评估第三个(操作数)表达式并返回值。
  • 它返回<{> 1}}的递增值,以存储在x中,x