为什么这不是无限循环?它是如何工作的?
Why this isn't an infinite loop? How is it working?
尝试使用此代码,根据我的书,输出是 -10 到 -1。这是如何打印的真的让我感到困惑。
#include <stdio.h>
void main()
{
int var = -10;
for(; var; printf("%d\n ", var++));
}
由于以下原因它正在工作
- if条件中的
var
作为布尔表达式,对其值进行求值,任何非零值作为true 和 zero 值作为 false.
var++
in printf("%d\n ", var++)
是应用于 var
的后缀运算符。它采用当前值,然后将 var
递增 1。
- 最终
var
归零(连同第一点一起阅读)
通常在编程中,除了 0 之外的每个整数(到布尔值)都被解释为布尔值 true
。
只有 0 被解释为 false
,因此循环在 var = 0
处中断并且不会打印 0。
另外:如果您将任何正整数放入 var
和 运行 同一个循环中,循环将无限次计数,因为它永远不会达到 0,除非您等待溢出。也就是当你给2,147,483,647加1(增量)得到一个-2,147,483,648。从那以后 var
再次为负数但仍在向上计数,最终你达到 0 并且循环将中断。
这里你的代码有点格式化。请注意,以下代码与您的完全相同:
#include <stdio.h>
int main()
{
int var;
for (var=-10; var!=0 ;var++) {
printf("%d\n ", var);
}
return 0;
}
条件 var!=0
也会在您的代码中自动求值。在 C 中,所有 !=0
都是 true
并且 0
是 false
.
首先,var++表示var = var + 1;
这意味着循环从 -10 到 -1。
因此 printf("%d\n ", var++) 会将 var 递增 1 并打印 var。
var++ 和 ++var 之间的区别在于,在 var++ 中,printf 先发生,而不是 +1,因为你看到从 -10 到 -1 的输出。
其次,C中的0表示false。然后 var 变为 0 循环停止。
循环也可以是 for(int var = -10;var;printf("%d\n ", var++)) ;这与 for(;var;printf("%d\n ", var++)) ;
相同
让我们一步步来了解这个:
int var
变量初始化为-10
。到目前为止,还不错。
现在我们进入有趣的部分:for
循环。我们有一个具有以下形式的强大构造:
for (/* initialisation-statement */ ; /* condition */ ; /* iteration-statement */)
/* statement or block of code */
对于您的代码,我们没有任何初始化语句(int var = -10
可以放在此处)、var
条件和 printf("%d\n ", var++)
迭代语句。
如果您不熟悉 for
的循环方式,这里有一个更原始(但仍然等效)的形式:
{
/* initialisation-statement */;
startloop:
if (/* condition */) {
/* statement or block of code */
/* iteration-statement */;
goto startloop;
}
}
将 for(int var = -10; var; printf("%d\n ", var++));
代入其中,我们得到:
{
int var = -10;
startloop:
if (var) {
;
printf("%d\n ", var++);
goto startloop;
}
}
执行printf("%d\n ", var++);
语句时,会将var++
的值打印到stdout
。 ++
运算符的后缀版本递增该值,但求值为原始值。
因为 var
控制循环,所以只要计算结果为 true
(非零),它就会继续循环。由于 var
从 -10
递增,它将最终达到 0
并结束循环。
旁注:void main()
不是标准的。请改用 int main(void)
或 int main(int argc, char *argv[])
。
尝试使用此代码,根据我的书,输出是 -10 到 -1。这是如何打印的真的让我感到困惑。
#include <stdio.h>
void main()
{
int var = -10;
for(; var; printf("%d\n ", var++));
}
由于以下原因它正在工作
- if条件中的
var
作为布尔表达式,对其值进行求值,任何非零值作为true 和 zero 值作为 false. var++
inprintf("%d\n ", var++)
是应用于var
的后缀运算符。它采用当前值,然后将var
递增 1。- 最终
var
归零(连同第一点一起阅读)
通常在编程中,除了 0 之外的每个整数(到布尔值)都被解释为布尔值 true
。
只有 0 被解释为 false
,因此循环在 var = 0
处中断并且不会打印 0。
另外:如果您将任何正整数放入 var
和 运行 同一个循环中,循环将无限次计数,因为它永远不会达到 0,除非您等待溢出。也就是当你给2,147,483,647加1(增量)得到一个-2,147,483,648。从那以后 var
再次为负数但仍在向上计数,最终你达到 0 并且循环将中断。
这里你的代码有点格式化。请注意,以下代码与您的完全相同:
#include <stdio.h>
int main()
{
int var;
for (var=-10; var!=0 ;var++) {
printf("%d\n ", var);
}
return 0;
}
条件 var!=0
也会在您的代码中自动求值。在 C 中,所有 !=0
都是 true
并且 0
是 false
.
首先,var++表示var = var + 1; 这意味着循环从 -10 到 -1。 因此 printf("%d\n ", var++) 会将 var 递增 1 并打印 var。 var++ 和 ++var 之间的区别在于,在 var++ 中,printf 先发生,而不是 +1,因为你看到从 -10 到 -1 的输出。
其次,C中的0表示false。然后 var 变为 0 循环停止。
循环也可以是 for(int var = -10;var;printf("%d\n ", var++)) ;这与 for(;var;printf("%d\n ", var++)) ;
相同让我们一步步来了解这个:
int var
变量初始化为-10
。到目前为止,还不错。
现在我们进入有趣的部分:for
循环。我们有一个具有以下形式的强大构造:
for (/* initialisation-statement */ ; /* condition */ ; /* iteration-statement */)
/* statement or block of code */
对于您的代码,我们没有任何初始化语句(int var = -10
可以放在此处)、var
条件和 printf("%d\n ", var++)
迭代语句。
如果您不熟悉 for
的循环方式,这里有一个更原始(但仍然等效)的形式:
{
/* initialisation-statement */;
startloop:
if (/* condition */) {
/* statement or block of code */
/* iteration-statement */;
goto startloop;
}
}
将 for(int var = -10; var; printf("%d\n ", var++));
代入其中,我们得到:
{
int var = -10;
startloop:
if (var) {
;
printf("%d\n ", var++);
goto startloop;
}
}
执行printf("%d\n ", var++);
语句时,会将var++
的值打印到stdout
。 ++
运算符的后缀版本递增该值,但求值为原始值。
因为 var
控制循环,所以只要计算结果为 true
(非零),它就会继续循环。由于 var
从 -10
递增,它将最终达到 0
并结束循环。
旁注:void main()
不是标准的。请改用 int main(void)
或 int main(int argc, char *argv[])
。