我们已经研究了“ for循环”的工作原理。看下面的程序:
int main(){
int i;
for(i = 0; i < 128; i++){
printf("I am %d\n", i);
}
return 0;
}
在上面的循环中,printf()语句将执行128次。现在,看下面的程序:
int main()
{
char i;
for(i = 0; i < 128; i++){
printf("I am %d\n", i);
}
return 0;
}
现在,您可以猜测上述“ for”循环中的printf()语句将执行多少次吗?您是否认为此循环还将运行128次?答案是不”。它将无限期地运行。让我们调查一下该程序,以了解其背后的真相。让我们运行该程序并查看其输出。但是每一行的打印速度都非常快,您甚至看不清它。让我们通过添加一些虚拟循环来减慢其执行速度。看下面的程序:
int main(){
char i;
for(i = 0; i < 128; i++){
printf("I am %d\n", i);
for(int j=0; j < 1000; j++)
for(int k=0; k < 1000; k++)
}
return 0;
}
在print语句之后添加了其他循环。这些额外的循环将运行1000×1000次并消耗一些时间。这将减慢程序的整体速度,现在您将可以清楚地看到每条输出行,如下所示:
I am 0
I am 1
...
...
...
I am 126
I am 127
I am -128
I am -127
I am -126
...
...
...
...
您在上面的输出中注意到了什么吗?从程序看来,128将在127之后出现,并且循环将终止。但是-128在127之后出现,并且-128小于128,这满足条件,因此循环不会停止。但是问题是为什么-128在127之后。
说明:通常,一个字符变量占用1个字节(8位)的内存来存储一个字符。在这8位中,最高有效的最左位是符号位,其余的7位代表幅度。如果符号位为0,则表示+ ve值,否则为-ve值。所以
Value of "i" Binary representation
0 0000 0000
1 0000 0001
2 0000 0010
...
...
...
126 0111 1110
127 0111 1111
现在添加1。
0111 1111
+ 1
---------
1000 0000
因此,现在,我们的字符变量“ i”将保存为“ 1000 0000”。现在,符号位为1,表示这是一个-ve数。可能您知道负整数是使用2的补码格式表示的,并且-128的2的补码表示形式是“ 1000 0000”。因此,“ i”的值变为-128而不是+128。因此,0、1、2,…,127,-128,-127,…,-1、0、1、2 …将继续。
但是在“ i”是整数变量的第一个程序中不会发生类似的情况。因为根据您的操作系统,整数变量的大小为2字节或4字节。如果整数变量的大小为2个字节(16位),那么您能否确定“ n”的最小值将使以下循环成为无限循环?
int main(){
int i;
for(i = 0; i < n; i++){
printf("I am %d\n", i);
}
return 0;
}
可以使用16位表示的最大+ ve整数是“ 0111 1111 1111 1111”或65535。当“ i”等于该最大值时,下一个增量使其变为-65536,而不是+65536。因此,“ n”的最小值为65536。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。