【问题标题】: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++) [closed]在 C 编程中,for(int i=0; st[i]; i++) 和 for(int i=0; i<st[数组长度];i++) 有什么区别 [关闭]
【发布时间】:2019-06-25 09:37:57
【问题描述】:

在下面的程序中,在 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

#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 编译器

【问题讨论】:

  • st[i] 是一个条件。而i&lt;8 是一个条件。当s[i] 不为零时,前者为真。后者 - 当i 小于8 时。差别很大。
  • 在第一个尝试int st[] ={1,2,3,4,5,6,7,8, 0};,看看你会得到什么。
  • 您的第一个程序运行超过st[] 的末尾,给出未定义的行为。将st[] 的定义更改为int st[] ={1,2,3,4,5,6,7,8,0};,看看会发生什么。零会阻止它,但我不确定你为什么要那样做。
  • 如果您在某处看到过第一个循环,您几乎可以肯定该代码正在处理 C 字符串。这是因为 C 字符串总是以 NUL 字符结尾,其值为 0。此技术 not 对任何数组都有效,仅适用于结尾为 0 的数组,其他任何地方都没有零。

标签: c arrays for-loop conditional-statements garbage


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      st[i] 可能会在某些不可预知的迭代中变为零(这在 C 中表示为 false),因为您读取数组末尾的元素。这是一个 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;
      }  
      

      它会按预期工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2023-03-29
        相关资源
        最近更新 更多