while()循环中的“ – ”运算符
我正在阅读K&R的书,第63页有一行
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
其中lim是int等于1000
我的问题是,为什么在相应的循环运行之后, lim不会减少? 在我看来, – lim相当于“lim = lim – 1”
================================================== =================
感谢所有的答案 !
--lim
意味着“从lim
的值中取一个并使用结果”。
替代的lim--
将“使用lim
的价值,然后取走一个”。
因此,如果lim
在第一次循环执行时从1000开始,它将在检查它是否大于0之前具有值lim--
如果它是lim--
那么将被检查的值将是1000
,但它会在循环迭代结束时仍然具有999的值。 这在循环的开始和结束时很重要。
MSDN作为此前缀增量和减量运算符的页面
当运算符出现在其操作数之前时,操作数会递增或递减,其新值将是表达式的结果。
你确定吗?
#include int main() { int lim = 10; while (--lim > 0 && printf("%d\n",lim)); }
输出继电器:
9 8 7 6 5 4 3 2 1
林正在减少,你可能在其他地方犯了错误。 但是, lim = lim - 1
并不等于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++
。
尝试编译并运行此代码。 它应该有点启发。
#include 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。
--lim
或lim--
是lim = lim - 1
的简写,所以也许作者想要使用这种语法来更好地澄清!
排除大卫的例子(其中’c’的初始测试导致循环体永远不会被执行,因此lim不会减少),以及lim最初小于或等于1的可能性(在这种情况下,getchar())不会被执行),代码相当于以下内容:
c=getchar(); while (lim > 1 && c != EOF && c != '\n') { lim = lim - 1; /* Original body of loop */ c=getchar(); }
这两个例外都不太可能,也可能是无关紧要的,因此如果更容易理解,您可以使用上面的代码。