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);
    }

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

4

1 回答 1

4

在您的第一个代码中,

  • 情况1:

    return reverse(i++);
    

    将导致堆栈溢出,因为未更改 i的值将用作函数参数(因为后递增的效果将在函数调用之后排序),然后i将增加。因此,它基本上是在reverse()参数不变的情况下调用 ,并且会导致无限递归。

  • 案例二:

    哦,

    return reverse((i++, i));
    

    逗号运算符的神奇之处,它基本上计算左侧表达式,丢弃值并最终返回(即使用逗号运算符的结果)右侧表达式计算的类型和值。因此,更新后的值i将用作函数参数。

    相当于写

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

    将使用更新后的值i


在您的第二个代码中,

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

按以下顺序进行评估

  • y++评估,结果被忽略。y递增。
  • x++评估,考虑三元运算符的结果。这是错误的。(记住,发布增量)。然后,x增加(后增量)。
  • 根据三元运算符的规则,如果第一个操作数(表达式)为 FALSE(计算为 0),则将计算第三个(操作数)表达式并返回值。
  • 它返回要存储的增量 值,即。xl1
于 2015-06-23T07:00:21.560 回答