while()循环中的“ - ”运算符

时间:2010-10-09 19:35:00

标签: c

我正在阅读K& R书,第63页有一行

while (--lim > 0 && (c=getchar()) != EOF && c != '\n')

其中lim是int等于1000

我的问题是,为什么 lim 在后续运行while循环后没有减少? 在我看来, - lim 相当于“lim = lim - 1”

=============================================== ====================

感谢所有答案!

6 个答案:

答案 0 :(得分:6)

--lim表示“从lim的值中取一个并使用结果”。

替代lim--将“使用lim的值,然后取走一个”。

因此,如果lim在第一次循环执行时从1000开始,那么在检查它是否大于0之前,它将具有值999。如果它是lim--那么将要检查的值为1000,但在循环迭代结束时它仍然具有值999。这在循环的开始和结束时很重要。

MSDN作为此Prefix Increment and Decrement Operators

上的页面
  

当运算符出现在其操作数之前时,操作数会递增或递减,其新值是表达式的结果。

答案 1 :(得分:1)

你确定吗?

#include <stdio.h>

int main()
{
        int lim = 10;
        while (--lim > 0 && printf("%d\n",lim));
}

输出:

9
8
7
6
5
4
3
2
1

答案 2 :(得分:1)

Lim 正在减少,你可能在其他地方犯了错误。但是,--limlim = lim - 1不完全相同。

有两个运算符用于执行变量的递增/递减:预递增(或递减)和后递增(或递减)。

++x(pre-inc)和x++(post-inc)都会将x的值修改为+1。那有什么区别?

当您在表达式中使用x++时,表达式将考虑x以使其具有当前值,并且之后相应地评估所有内容,将该值递增1。所以......

int x = 5;
printf("%d", x++);

...将打印出来5.但是,在printf()行之后,x的值将为6。

预增量以相反的方式工作:x的值首先递增,然后考虑评估围绕它的表达式。所以......

int x = 5;
printf("%d", ++x);

...将打印出6,当然,之后x的值将为6。

当然,这同样适用于递减运算符。

现在,赋值操作(x = x + 1)在赋值发生后计算分配的值,因此其行为实际上与++x相似,而不是x++

答案 3 :(得分:1)

尝试编译并运行此代码。它应该有点启发。

#include <stdio.h>

int main()
{
        int lim = 10;
        while (--lim > 0 && 1 > 32)
             printf("I should never get here\n");
        printf("%d\n",lim); // lim is now 9
}

哦,看,lim现在是9,即使我从未真正进入循环,因为1不大于32。

答案 4 :(得分:0)

--limlim--lim = lim - 1的简写,所以也许作者想要使用这种语法来更好地澄清!

答案 5 :(得分:0)

排除大卫的例子(其中'c'的初始测试导致循环体永远不会执行,因此lim不会减少),以及lim最初小于或等于1的可能性(在这种情况下, getchar()不会被执行),代码等同于以下内容:

c=getchar();
while (lim > 1 && c != EOF && c != '\n')
{
    lim = lim - 1;

    /* Original body of loop */

    c=getchar();
}

这两个例外都不太可能,而且可能无关紧要,所以如果更容易理解,你可以使用上面的代码。