har*_*der 7 c loops local-variables
#include <stdio.h>
int a;
void myproc()
{
int a = 2;
while (a == 2)
{
int a = 3;
printf("a = %d\t", a);
break;
}
printf("a = %d\t", a);
}
int main()
{
a = 1;
myproc();
printf("a = %d\t", a);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
我期望上面的代码打印:a = 3 a = 3 a = 1然而,它打印:a = 3 a = 2 a = 1有人可以提供有效的解释吗?
是的,它们是本地自动变量,当你进入和退出给定的范围时,它会被推入并弹出堆栈,除非编译器决定进行某些优化(例如将它们存储在寄存器中等).但是对于给定的变量,访问它时使用该变量的大多数本地范围版本.例如,在C89中,如果您决定在for循环声明中声明循环计数器,则以下通常会产生编译器错误:
for (int i=0; i < N; i++)
for (int i=0; i < J; i++)
printf("%d", i);
Run Code Online (Sandbox Code Playgroud)
print的值i将始终是i内部for循环中声明的值,因为这是本地范围最大的版本i.
这是一个解释 - 见下面的评论.
#include <stdio.h>
int a;
void myproc()
{
int a = 2; // (1) a = 2
while (a == 2) // true
{
int a = 3; // (2) new scope, new a = 3
printf("a = %d\t", a); // (X) prints 3 as it gets the 'nearest a' in the scope
break;
} // throws away a=3 from (2)
printf("a = %d\t", a); // (Y) Uses (1) i.e. 2 and print it
}
int main()
{
a = 1;
myproc();
printf("a = %d\t", a); // (Z) Just prints 1 as the scope is not effected by myproc
return (0);
}
Run Code Online (Sandbox Code Playgroud)
所以这将打印(X)(Y)和(Z)
即3 2 1
| 归档时间: |
|
| 查看次数: |
4979 次 |
| 最近记录: |