for循环执行机制:下述C语言代码中的循环为何会无限执行?
For循环的执行机制详解
咱先把C语言里for循环的执行流程拆成4个核心步骤,一步一步来:
- 初始化阶段:执行for循环第一个分号前的表达式,这一步只会在循环启动时执行一次。要是这个位置空着(就像你代码里那样),那就直接跳过这一步。
- 条件判断阶段:每次循环开始前,都会执行第一个分号和第二个分号之间的表达式。C语言里判断真假的规则很简单:非0值为真,0为假。如果表达式结果为真,就进入循环体;为假,直接终止循环。
- 循环体执行阶段:条件判断通过后,执行循环体里的代码(就是for循环括号后面的语句,或者大括号包裹的代码块)。
- 更新阶段:循环体执行完后,执行第二个分号后面的表达式,执行完后回到条件判断阶段,开启下一轮循环。如果这个位置空着,就直接跳过更新步骤,直奔条件判断。
你的代码为何会无限执行?
先把你的代码贴出来方便分析:
#include <stdio.h> int main() { int i; for (; scanf("%d", &i); printf("%d\n", i)); return 0; }
咱把这个for循环拆成三个部分拆解:
- 初始化部分:空的,所以啥也不做,直接进入条件判断环节。
- 条件判断部分:这里用的是
scanf("%d", &i)的返回值。划重点:scanf的返回值是成功读取的输入项数量:- 如果你输入一个有效的整数,
scanf成功读取1个输入项,返回1(非0,条件为真),进入循环体执行输出。 - 只有当你输入无法被解析为整数的内容(比如
abc、@这类),scanf读取失败返回0(条件为假),循环才会终止。 - 如果遇到EOF(比如Unix下按
Ctrl+D,Windows下按Ctrl+Z),scanf返回EOF(这是一个宏,值通常为-1,属于非0值),条件依然为真,会继续执行循环体,之后再次调用scanf依然返回EOF,陷入无限循环。
- 如果你输入一个有效的整数,
- 更新部分:空的,所以执行完循环体的
printf后,直接回到条件判断阶段,重复上述流程。
所以只要你持续输入有效整数,或者输入流触发EOF,这个循环就会一直跑下去,形成无限执行的状态。
内容的提问来源于stack exchange,提问作者Shadab
相关产品推荐
相关产品推荐

