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

📅  最后修改于: 2021-10-19 05:20:12             🧑  作者: 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;
}

在打印语句之后添加了额外的循环。这些额外的循环将运行 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 基础课程