C中有趣的增量运算符(在while循环中)

时间:2011-03-31 17:57:46

标签: c

我想实现阶乘算法,以下代码给出了阶乘(5)的错误结果

int factorial(int n)
{
    int i = 1, ret = 1;
    while(i++<=n)
        ret *= i;
    return ret;
}

看起来即使i = 6,代码也会继续运行,我不明白为什么while循环没有停止。

5 个答案:

答案 0 :(得分:4)

您正在使用后增量运算符,这意味着i <= n的最终检查发生在i最后一次递增之前。换句话说,当i为5时,您的代码为:

check if i <= 5 -> true

increment i -> i is now 6

execute loop -> executes for i = 6

check if i <= 5 -> false (i is now 6)

您应该更改为:

while(++i <= n)

答案 1 :(得分:3)

尝试每个陈述做一件事。

int factorial(int n)
{
    int i = 1, ret = 1;
    while(i<=n)
    {
        i++;
        ret *= i;
    }
    return ret;
}

检查本文上方和下方版本之间的差异。

int factorial(int n)
{
    int i = 1, ret = 1;
    while(i<=n)
    {
        ret *= i;
        i++;
    }
    return ret;
}

答案 2 :(得分:0)

i++会返回i的值,然后才会递增i。 (与++i相对,其中第一个incerements i并返回递增的值)

答案 3 :(得分:0)

这就是i++的工作方式。你需要++i

答案 4 :(得分:0)

你正在进行一次额外的循环迭代。

而不是(i++<=n),您真正想要的是(i<=n),然后在i++;之后添加ret*=1

这实际上使用for循环恕我直言更加干净。