main()
{
int a;
for(a=1; a<=4 && printf("%d ",a); a++)
{
int a;
static int b=a;
printf("%d ",(a++)-b);
}
getchar();
getchar();
}
在此代码中,打印输出为1 0 2 1 3 2 4 3.我理解为什么int a; part的工作方式不同于在for函数外定义的int a,以及为什么static int b;仅使用a的主值定义一次;但为什么printf中的(a ++)部分会影响a的进行值?我们不要重新定义一个;每次for函数运行?提前致谢。
答案 0 :(得分:4)
内部a未定义,因此,编译器可以使用它喜欢的任何值。它喜欢的值显然是字节“a”的当前值占用。第二次通过循环,你会得到一个全新的内部 - 一个巧合恰好位于与前一个内部A相同的位置,并假设它的价值。
但这只是巧合 - 如果以其他方式更容易做到,编译器会(并且在法律上可以)。
另请注意,在第二个a ++之后永远不会读取a的值。很可能如果你打开优化,编译器将决定它不需要做那个增量,并且a的内部值总是为零。
答案 1 :(得分:3)
内部'a'变量未初始化,因此每次循环时它的值在技术上都是未定义的。
答案 2 :(得分:3)
您没有为内部a
指定值,因此结果未定义。
即使您更改代码以将内容分配给a
,您的代码也应该无法编译,因为您尝试将变量分配给此行上的本地静态:
static int b=a;
编译器输出:
test.c: In function `main':
test.c:9: error: initializer element is not constant