关于产品在功能变量定义
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一个;部分的工作方式与在for函数之外定义的int a不同,为什么static int b;只是定义了一次,主值为a;但为什么printf中的(a ++)部分会影响一个?难道我们不重新定义一个int;每次for函数运行?提前致谢。关于产品在功能变量定义
内部'a'变量未初始化,所以它的值在技术上每次通过循环都未定义。
我知道它是未初始化的,但是我看到a的未初始化值随着printf函数中++的增加而增加。这是因为我的编译器还是使用C++语言才能够更改“未初始化”值? – 2010-04-01 20:18:11
请看James的回答。这完全正确。 – JayM 2010-04-01 21:47:07
您不会为内部a
分配值,因此结果未定义。
即使你改变你的代码分配的东西a
,你的代码无法编译,因为你试图给一个变量分配给本地静态在这条线:
static int b=a;
编译器输出:
test.c: In function `main':
test.c:9: error: initializer element is not constant
哇,我甚至没有意识到这在C中是无效的。即使只使用C风格编码,还有一个使用C++的理由。 – 2010-04-02 02:01:39
inner a是未定义的,因此编译器可以使用它喜欢的任何值。它喜欢的值显然是字节“a”占据的当前值。通过循环第二次,你会得到一个全新的inner-a,它恰好与前一个inner-A位于相同的位置,并且假定它是有价值的。
但是,这只是巧合 - 如果以其他方式更容易做到这一点,编译器会(并合法地)。
还要注意,a的值在第二个a ++之后永远不会被读取。如果你打开优化,编译器很可能会认为它不需要做这个增量,而a的内部值总是为零。
需要'家庭作业'标签吗? – 2010-04-01 20:08:57
@ all-editors:太多的时候编辑不好;) – 2010-04-01 20:13:04
这不是家庭作业。我为全国比赛学习C谜题。 – 2010-04-01 20:13:42