【问题标题】:How does ((a++,b)) work? [duplicate]((a++,b)) 是如何工作的? [复制]
【发布时间】:2015-09-08 20:11:09
【问题描述】:

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

如果问题是非常基本的问题,我很抱歉。我觉得很难理解。如果有人能解释一下,那会很有帮助。

【问题讨论】:

  • 阅读the comma operator。顺便说一句,reverse((i++, i)) 表达式实际上与 reverse(++i) 相同。
  • 感谢@JoachimPileborg

标签: c function recursion comma-operator


【解决方案1】:

在您的第一个代码中,

  • 案例 1:

    return reverse(i++);
    

    将导致堆栈溢出,因为 unchanged 的值 i 将用作函数参数(因为后递增的效果将在函数调用之后排序),然后 i会增加。所以,它基本上是调用reverse(),参数不变,会导致无限递归。

  • 案例 2:

    哦,

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

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

    相当于写

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

    将使用i更新值。


在您的第二个代码中,

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

按以下顺序进行评估

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

【讨论】:

  • 是的,我错过了什么?
  • 非常感谢@Sourav Ghosh。我从来没有实时研究过逗号运算符。因此,很难将这种用法与普通函数调用区分开来。现在理解正确了。
  • @Denise 不客气。 :-) 顺便说一句,这是“天哪”,而不是 “天哪”。 :-)(别担心,你不是第一个打错字的人,我几乎已经习惯了。)你可以考虑accepting一个对你有帮助的答案。
  • 完成。谢谢:) @Sourav Ghosh
猜你喜欢
  • 2015-02-09
  • 2017-07-11
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2021-08-15
  • 2021-10-06
相关资源
最近更新 更多