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。

--limlim--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(); } 

这两个例外都不太可能,也可能是无关紧要的,因此如果更容易理解,您可以使用上面的代码。