这种类型的循环如何工作:`for(;x++;);`
这种类型的循环如何工作以及为什么要打印x=1;相反x=3?
#include <stdio.h>
#include <stdlib.h>
int main() {
char x = 2;
for (; x++;);
printf("x=%d", x);
}
回答
后Int修正为int,循环for(;x++;);将执行空语句;,直到x++计算结果为假(零)。
由于x从 2 开始,它会增加到 3,然后是 4,依此类推。这一直持续到x达到 a 的最大值char。然后加一产生一个char无法表示的值。1这个数字然后被转换char为存储在 中x。
如果char是无符号的,则此转换将换行为零,因此零存储在x. 如果char是有符号的,则转换的结果是实现定义的(或引发信号)。一个典型的结果是环绕到最小值char,通常是 ?128。在这种情况下,循环会继续递增x?127、?126 等,直到达到零。
因此,在上述任何一种常见情况下,x最终都会达到零。然后下一个x++增量评估x为 1 并评估为 0。然后循环退出,并printf("x=%d",x);打印“x=1”。
其他行为是可能的。例如,C 实现可以定义将超出范围的值转换char为生成 127,然后循环不会终止。(有趣的是,C 2018 6.8.5 6 中的规则允许编译器假设循环终止,即使实际执行它不会。)
脚注
1算术是在int类型中完成的,因此它不会溢出(除了在char与 宽度相同的假设奇异 C 实现中int)。在指定后缀++运算符时,C 2018 6.5.2.4 2 指的是加法和赋值运算符,它们将char操作数提升为int。