在 C 编程中,for(int i=0; st[i]; i++) 和 for(int i=0; i<st[length of the array];i++) 有什么区别

In C programming, what is the difference between for(int i=0; st[i]; i++) and for(int i=0; i<st[length of the array];i++)

在下面的程序中,在 for 循环条件中使用 st[i] 时:

#include<stdio.h> 
int main() 
{ 
     int st[] ={1,2,3,4,5,6,7,8}; 
     int i; 
     for(i=0; st[i]; i++) 
         printf("\n%d %d %d %d", str[i], *(str+i), *(i+str), i[str]); 
     return 0;
}   

输出:

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 8 8 8
-874149648 -874149648 -874149648 -874149648
32764 32764 32764 32764

在下面的程序中,在 for 循环条件下使用 i<8 时:

#include<stdio.h> 
int main() 
{ 
     int str[8] ={1,2,3,4,5,6,7,8}; 
     int i; 
     for(i=0; i<8; i++) 
         printf("\n%d %d %d %d", str[i], *(str+i), *(i+str), i[str]); 
     return 0;
}  

输出: 输入

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 8 8 8

谁能解释一下 st[i] 那边发生了什么。如果它是垃圾值意味着为什么它在打印那两次额外的迭代后停止。

编译器:onlinegdb.com -c 编译器

只要中间表达式的计算结果为真,即非零值,for 循环就会继续。所以在这种情况下:

for(i=0; st[i]; i++) 

只要 st[i] 不为 0,循环就会继续。由于数组中没有包含 0 的元素,因此最终会读取到数组末尾。这样做会调用 undefined behavior,在本例中表现为正在打印的不确定数量的看似随机的值。

在 C 中,如果计算结果为非零,则条件为真,如果计算结果为零,则为假。

在条件只是st[i]的情况下,它隐式地将st[i]的值与零进行比较,以确定条件是真还是假。在处理长度未知的字符串(即,如果它作为指针传递)时,这是很常见的事情,因为空终止符的数值为零。

在你的情况下,比较没有意义,因为你的 int 数组没有以零值结尾,而且你已经知道它的长度。为什么不直接通过 8? st[i] 的条件将调用未定义的行为,因为您可以保证超出该数组的范围,因为其中没有值为零的元素。

st[i] 可能会在某些不可预测的迭代中变为零(这在 C 中意味着错误),因为您读取数组末尾的元素。这是一个UB,任何事情都可能发生。

修改

#include<stdio.h> 
int main() 
{ 
     int st[] ={1,2,3,4,5,6,7,8,0}; 
     int i; 
     for(i=0; st[i]; i++) 
         printf("\n%d %d %d %d", str[i], *(str+i), *(i+str), i[str]); 
     return 0;
}  

它会按预期工作