1.先讲讲代码块
- 定义:代码快就是 { ... } ,语言描述就是被大括号括起来的算一个代码块 例如:
{
//这是一个代码块,这里定义的变量,在代码块结束后,会被销毁
}
- 代码块可以嵌套,一个代码块中可以包含多个代码块,子代码块亦可以继续包含代码块
{
//父代码块
{
//子代码块
}//执行完这一行后,子代码块结束,里面定义的变量会被释放
//父代码块
}
2.说说作用域
- 作用域可以认为是变量的生命周期,从变量定义的那一行代码开始,到所在的代码块结束为变量的作用域
- 子代码块内的变量优先级比父代码块内的同名变量优先级要高.也就是说,如果父代码块和子代码块内都定义了同名变量,那么子代码块内优先访问子代码块内的变量.
** 请看题:**
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
int score = 100;
{
int score = 200;
{
score = 50;
printf("%d\n",score);//输出 50
}
printf("%d\n",score);//输出 50
}
printf("%d\n",score);//输出 100
return 0;
}
原因:
为了便于讲解
int score = 100;这个score我们认为是score1
int score = 200,这个score我们认为是score2
- score = 50;
这句话中score对应的是score2,因为这行代码所在代码块没有定义变量score,所以会向它的父代码块查询,然后就找到了score2,然后将score2修改为50 - 第一次打印
printf所在的代码块,没有定义score变量,向父代码块查询,查询到 score2,score2已被修改为50;所以输出50; - 第二次打印
printf 所在代码块已经有定义的变量score2,直接输出结果为50,输出完成后,下一行代码块就结束了,因此score2会被释放掉 - 第三次打印
printf 所在代码块定义有score1,直接输出100
作用:
当然是节约内存了
例如:
int main()
{
{
//定义了跟多变量,申请了很多内存
}
//这里又用不到上面代码块中的数据,那么就把上面的一堆东西放入一个代码块
}