黑马程序员技术交流社区

标题: 【作用域的问题】请问这些打印结果 [打印本页]

作者: neobug    时间: 2015-7-21 23:27
标题: 【作用域的问题】请问这些打印结果
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[]) {
  3.     int a = 20;
  4.     int  score = a+100;
  5.     printf("%d\n",score);
  6.    
  7.     {
  8.    
  9.         score = a + 250;
  10.         int score = 30;
  11.         printf("%d\n",score);
  12.    
  13.     }
  14.     printf("%d\n",score);
  15.    
  16.    
  17.     return 0;
  18. }
复制代码

作者: neobug    时间: 2015-7-21 23:28
结果是  120   30  270
最后一个270是怎么得来的啊?  作用域有点没搞清楚啊
作者: neobug    时间: 2015-7-21 23:29
完整代码其实是这样
  1. int main(int argc, const char * argv[]) {
  2.     int a = 20;
  3.     int  score = a+100;
  4.     printf("%d\n",score);
  5.    
  6.     {
  7.    
  8.         int score = 50;
  9.         {
  10.         
  11.             score = 10;
  12.             printf("%d\n",score);
  13.         
  14.         
  15.         }
  16.         a = 10;
  17.     }
  18.     {
  19.    
  20.         score = a + 250;
  21.         int score = 30;
  22.         printf("%d\n",score);
  23.    
  24.     }
  25.     printf("%d\n",score);
  26.    
  27.    
  28.     return 0;
  29. }
复制代码

作者: 慕名黑马生    时间: 2015-7-21 23:35
120     30    270前面两个都懂吧,第三个printf时,它代表的score还是main中的score,而不是{}中的score,那个只是局部重新定义的变量,但{}中语句-score=a+250在重新定义的变量之前,所以全局score为270.你如果调换{}中1、2句,结果为120、280、120
作者: lclofty    时间: 2015-7-21 23:40
270=20(a)+250(score)  大括号中定义的变量会在大括号结束后释放 但是之前赋值会改变score的值 score= a+250 =20+250=270
作者: 13817049701    时间: 2015-7-21 23:42
这个问题是全局变量和局部变量的问题,如果搞不懂建议再看看如意大师的《黑马程序员_iOS基础视频_最适合初学者入门video》中第二天中的变量的作用域。多看看几遍就可以了,我觉得讲得相当的好:loveliness:
作者: lclofty    时间: 2015-7-21 23:43
关键是看清大括号中是先定义还是先赋值 先定义不改变最初的变量的值 先赋值会改变。
作者: qq103613    时间: 2015-7-22 00:32
120  30    270
作者: chensc    时间: 2015-7-22 06:20
学习学习!
作者: lychae    时间: 2015-7-22 07:16
#include <stdio.h>
   
    int main(int argc, const char * argv[]) {
        int a = 20;
        int  score = a+100;//这是一个全局变量,作用域是定义开始到文件末尾
        printf("%d\n",score);//120
        
        {
            
            score = a + 250;//270,查找向上最近的score变量然后赋值
            int score = 30;//定义变量,这是全局变量,作用域是从定义开始到所在}结束,局部变量作用时,会暂时替代全局变量
            printf("%d\n",score);//30,
            
        }//在次位置局部变量score释放
        printf("%d\n",score);//270,此处的score是全局变量
        
        
        return 0;
    }
作者: neobug    时间: 2015-7-22 12:04
谢谢各位的解答 我弄懂了
作者: zhuozhuo    时间: 2015-9-13 19:35
可能是编译器的问题,我在VS2012上操作,打印的结果是 120,30,30.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2