作用域说的是不是不对,内部的变量是重新定义的,而不是覆盖外部的变量?

作用域说的是不是不对,内部的变量是重新定义的,而不是覆盖外部的变量?

    int a = 1;

    @autoreleasepool {

        float a  = 1;

        NSLog(@"%f",a);

    }


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
axiba 2018-06-24 18:01:45

http://img1.sycdn.imooc.com//climg/5b2f6be4000195bc03580173.jpg

输出结果:1;

希望能解答你的疑惑

提问者 MLeo 2018-06-21 10:11:12

http://img1.sycdn.imooc.com//climg/5b2b078f00019c1904550620.jpg


调试时看到两个相同类型的变量a,这个怎么说?

就好比子类和父类一样,子类重写了父类的属性,括号内是访问的子类的属性,而括号外访问的是父类的属性,并不是覆盖(重点)

imoocLovers 2018-06-20 14:55:55

①当我们在函数中或者代码块中定义的变量跟外部变量一样时,那么在函数或代码块中的变量是会将外部的变量给覆盖掉,只能使用函数中变量的值。

②在你的代码中,@autoreleasepool 中定义了一个float a  = 1;虽然变量名也是a,因为作用域不同,所以在@autoreleasepool 中使用的是float a  = 1;这个a的值。在这里实际上定义的是两个不同类型的变量。

③而在老师讲解的作用域中,是在@autoreleasepool大括号中又定义了一个int a ,与外部的变量是一样的,这个时候在内部使用的a的值将会覆盖掉外部的a的值。

  • 提问者 MLeo #1
    int a = 5;//声明变量a; @autoreleasepool { int a = 2;//声明变量a int b = 3;//声明变量b NSLog(@"%d",a); } NSLog(@"%d",a);//访问的是外部变量,如果是覆盖,值因该是2,而不是5; // NSLog(@"%d",b);//外部访问不到内部的变量 就好比,类中声明的变量,和在类-方法中声明的变量,会是同一个吗?如是不是同一个,怎么会有覆盖? int a = x,是声明一个新的变量的表达式,内部产生一个新的变量 a 作用域说的是变量的有效访问范围,内部能访问外部的,而外部的不能访问内部的变量
    2018-06-20 18:53:23
  • imoocLovers 回复 提问者 MLeo #2
    @autoreleasepool 中声明的变量a和b的作用域出了大括号就被释放了,而一开始定义的变量int a = 5;//声明变量a; 它的作用域是出了main方法的大括号才会被释放,所以在autoreleasepool的外部使用的变量a就是一开始那个变量a的值,而这个时候变量b已经不存在了,那么就访问不到了。
    2018-06-20 19:05:21
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
iOS入门:基础语法与常用控件
  • 参与学习       1337    人
  • 提交作业       712    份
  • 解答问题       1878    个

很多人都在疑问没有基础该怎么学习iOS开发?不用担心,本路径采用游戏关卡式的教学模式,并且以经典OC与最新Swift双重结合的教学内容,帮助大家快速掌握两种iOS开发语言基础,去掉“零”标签。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师