int main(void) {
int i = 2, k = 3, a;
i++;
++k;
{
int i = 0;
i = k++;
printf("%d,%d,", i, k);
}
printf("%d,%d", i, k);
getchar();
return 0;
}
为什么这段代码产生输出“4,5,3,5”为什么不是“4,5,4,5”?为什么当我通过f7键c ++跟踪代码时,它首先是printf然后是第二个printf()。所以根据这个变量值必须保持4,那么为什么它在第二个printf()函数中给出i变量3的值?
答案 0 :(得分:2)
第二个printf
没有“看到”i
声明为int i =0;
,因为i
位于由花括号创建的另一个范围内。
因此,第二个printf
获取第一个i
,它被声明(和定义)为int i =2
,并在下一行中增加到3
{{1} }}
顺便说一句,代码缩进是你的朋友(也是我们的朋友:)。
答案 1 :(得分:2)
因为花括号分隔块,而C变量是块的本地。
因此第二个i
对于内部块是本地的,并且与函数main
的第一个main(){
int i =2,k=3,a;
i++; // i = 3
++k; // k = 4
{
int i =0; // Lets call it i', then i' = 0 (it is different to i)
i=k++; // i' = k = 4, then increment k so k = 5
printf("%d,%d,",i,k); // Prints i', k: "4,5,"
}
printf("%d,%d",i,k); // Prints i, k: "3,5"
getch();
}
不同。
请查看代码的评论版:
{{1}}
答案 2 :(得分:1)
C
中的大括号定义块范围。因此,花括号分隔的块中的i
与其外部的// main should return int. void type should be explicit in the parameter list
int main(void) {
int i = 2, k = 3, a;
i++; // i is 3
++k; // k is 4
{ // block scope starts
int i = 0; // not the same as the previous i
i = k++; // block level i is 4 as k is 4
printf("%d, %d", i, k); // prints 4, 5
} // block scope ends
printf("%d, %d", i, k); // prints 3, 5
getchar(); // getch is nonstandard. use getchar instead
}
不同。我正在调整你的代码并在有用的地方添加评论。
{{1}}