📜  在C中使用字符的有趣无限循环

📅  最后修改于: 2021-05-28 03:09:38             🧑  作者: Mango

我们已经研究了“ 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基础课程》。