示例代码一:
#include <stdio.h>
int main()
{
int score = 100;
{
int score = 200;
{
score = 50;
}
printf("score=%d\n", score);
}
printf("score=%d\n", score);
return 0;
}
输出结果:score=50
score=100
变量的作用域:从定义变量的那一行代码开始,一直到所在的代码块结束。代码块结束时,代码块内所定义的变量(存储空间)将被回收,所以第二个printf函数的输出结果为:score=100,而不是score=200。在代码块{ score = 50; }中,由于该代码块中没有定义score变量,所以在进行赋值操作时,会到该代码块外面(上一层代码块中)找score变量,并进行赋值操作。所以,此时上一层代码块中的score变量的值已经变为50,而不是原来的200了。又由于就近原则,第一个printf函数访问score变量时,就在其所在的代码块中找score变量。而此时该代码块中score的值为50,所以第一个printf函数的输出结果为:score=50。若把代码块{ score = 50; }改为:{ int score = 50; },此时不会修改上一层代码块中score的值,因为该代码块内定义了自己的score变量,所以赋值操作只会对该代码块内的score起作用,该代码块结束时,其中的score变量会被回收,此时,第一个printf函数的输出结果将会变为:score=200。
示例代码二:
#include <stdio.h>
int main()
{
if (10 > 6)
{
int a = 5;
}
printf ("%d\n", a);
return 0;
}
此时编译器会报错,因为变量a的作用域只限于其所在的代码块内部,该代码块结束时,变量a将会被回收。所以printf函数访问不到变量a,编译报错。
示例代码三:
#include <stdio.h>
int main()
{
if (10 > 6)
int a = 5;
return 0;
}
此时编译器也会报错,因为此时变量a的作用域不明确,编译器不知道变量a的作用域,会直接报错,应将if后面的代码用大括号包住。(如果在if语句后面定义新的变量,必须用大括号。)
示例代码四:
#include <stdio.h>
int main()
{
char c = '+';
int a = 10;
int b = 20;
switch (c)
{
case '+':
int sum = a + b;
printf("和是%d\n", sum);
break;
case '-':
int minus = a - b;
printf("差是%d\n", minus);
break;
}
return 0;
}
这段代码编译时同样会报错,犯的错误与示例代码三一样,都是变量作用域不明确,代码中变量sum与变量minus的作用域不明确,应将case后面的代码用大括号包住。(如果要在case后面定义新的变量,必须用大括号{}包住。)