我正在阅读K& R书,第63页有一行
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
其中lim是int等于1000
我的问题是,为什么 lim 在后续运行while循环后没有减少? 在我看来, - lim 相当于“lim = lim - 1”
=============================================== ====================
感谢所有答案!
答案 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 正在减少,你可能在其他地方犯了错误。但是,--lim
与lim = 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)
--lim
或lim--
是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();
}
这两个例外都不太可能,而且可能无关紧要,所以如果更容易理解,你可以使用上面的代码。