了解这个C程序的行为

时间:2014-02-28 11:53:43

标签: c printf main

我开始为什么输出产生002?  感谢编辑和答案,但我仍然感到困惑。 这是代码:

#include <stdio.h>
 int t[3],i;
 int main()
 { 
     for(i=0;i<3;i++)
         t[i]=i++;
     for(i=0;i<3;i++) 
         printf("%d",t[i]);
 }

002 任何人都可以帮助我理解为什么会这样吗?

3 个答案:

答案 0 :(得分:1)

这是因为您在for循环中增加了i计数器两次(一次在t[i] = i++,一次在for循环的结束语句中{{1 }})。这样,for循环执行两次(不是三次),一次为i = 0,一次为i = 2.因此输出。

要说服自己,请尝试按照

添加打印件
i++

并查看for循环执行的次数以及for(i=0;i<3;i++) { printf("%i ", i); t[i]=i++; } 的值。

答案 1 :(得分:0)

下载C标准的副本(例如,谷歌N1570,它将为您提供最新的免费版本)。在该文档中,查找“序列点”并阅读它所说的内容。

简而言之:由于本文档中解释的原因,您的程序很垃圾,可以随心所欲。 (基本上,语句t [i] = i ++;调用未定义的行为。这是C标准中一般规则集的一个非常特殊的情况.C ++和Objective-C具有相同的规则)。

答案 2 :(得分:0)

您在每次迭代中递增两次。在第一次迭代i = 0中,t[0] = 0,那么您正在执行i++两次。在第二次迭代中i=2所以t[2] = 2现在循环结束了。 t[1]未初始化。

您得到002因为:

  • 来自0的第一个t[0] < / li>
  • 第二个0garbage valuenull value,其中t[1]存储在内存中(在您的情况下为{{1} }})

  • 和来自0的最后2