A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魑魅魍魉121 中级黑马   /  2014-6-6 18:37  /  1751 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 魑魅魍魉121 于 2014-6-7 07:32 编辑

#include <stdio.h>
int main()
{

    int a = 20;
        int        score = a + 100;
        printf("%d\n",score);//120

        {
                int score = 50;
                {
                        score = 10;
                        printf("%d\n",score);//10
                }
                a = 10;
        }

        {
                score = a + 250;
                int score = 30;
                printf("%d\n",score);//30
        }

        printf("%d\n",score);//260

    return 0;
}
为什么最后的score的输出是260???,求大神指点

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

7 个回复

倒序浏览
{
                score = a + 250;
                int score = 30;
                printf("%d\n",score);//30
        }

        printf("%d\n",score);//260
里面的sorce 跟 外面的sorce 不是一个数。。。因为作用域不一样  里面的是{} 这个块内的局部变量 所以 里面的sorce不会影响外面sorce的值
回复 使用道具 举报
你好,我手里没有编译器,没法调试程序,但我可以试着用程序回答一下。
  1. #include <stdio.h>
  2. int main()
  3. {

  4.     |--->int a = 20;
  5.     |    int score = a + 100; <---------------------------------------------------------------------|
  6.     |                                                                                               |
  7.     |     printf("%d\n",score);//120                                                                |
  8.     |                                                                                               |
  9.     |     { // ----------------------------------------                                             |
  10.     |             int score = 50;                      |                                            |
  11.     |             {                                    |                                            |
  12.     |                     score = 10;                  |                                            |
  13.     |                                                   ---> 这里面的score在执行到                  |
  14.     |                     printf("%d\n",score);//10    |     达括号结束时就被销毁了。               |
  15.     |             }                                    |     但是外面a的值被修改为10                |
  16.     |------------>a = 10;                              |                                            |
  17.          } // ----------------------------------------                                              |
  18.                                                                                                     |
  19.          {                                                                                          |
  20.     |-----------> score = a + 250; // -----------------> 当进入这个语句块时,语句块中没有声明score,  |
  21.     |                                                   所以程序就到外面寻找名叫score的变量,        |
  22.     |                                                   程序找到之前有声明过score,                 |
  23.     |                                                   所以就修改了第一个声明的score变量的值为260<-|
  24.     |            int score = 30; // -------------> 这个score在代码块中声明,代码块执行结束销毁。
  25.     |            printf("%d\n",score);//30
  26.     |    }
  27.     |
  28.     |----> printf("%d\n",score);//260 // ---------------> 这里输出的score就是程序
  29.                                                         第一次声明的那个score变量的值
  30.                                                         此时这个score已经被第二个代码块中的
  31.                                                         第一句代码修改成了260                                                        

  32.      return 0;
  33. }
复制代码


希望我的回答能够帮助到你。

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报 4 0
#include <stdio.h>
int main()
{

    int a = 20;                                         //a已经在主函数定义,应用于整个函数。
        int        score = a + 100;                //score已经在主函数定义,应用于整个函数。        printf("%d\n",score);//120

        {
                int score = 50;                     //这个score再次被定义,但它只在这个函数里有效。
                {
                        score = 10;                //这次赋值跟上边这个score有关系,它不应用于整个函数。
                        printf("%d\n",score);//10
                }
                a = 10;                  //a在这个函数里面没被再次定义,所以这次赋值应用于整个函数。
        }                           

        {
                score = a + 250;               //在这个函数里面,score==120,a==10,这次赋值应用于整个函数。
                int score = 30;                //在此,score在此被定义,接下来的score只应用于这个函数
                printf("%d\n",score);//30
        }

        printf("%d\n",score);//260
   return 0;
}



希望能给您带来帮助

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
XCodeRush 发表于 2014-6-6 19:30
你好,我手里没有编译器,没法调试程序,但我可以试着用程序回答一下。

真不愧是有图有真相啊{:2_34:}
回复 使用道具 举报
其实你还是局部变量和全局变量给油搞清楚,局部变量随着所在代码块的结束而销毁,也就在内存中回收,但是全局变量是在整个程序的生命周期中都是有效的。程序中的a就是全局变量,score=a+250;这个语句中a的值已经变成了10,而score在这个语句块中并没有声明,要依据就近原则,找到最近声明score而且没被销毁的score,也就是在内存中是分配了空间的,因此就找到了int score=a+100;这个score,这个score是全局变量,会在程序结束时才会消亡,因此打印出来的260
希望我的解答能给你提供帮助
回复 使用道具 举报
哦哦,谢谢大神
回复 使用道具 举报
XCodeRush 发表于 2014-6-6 19:30
你好,我手里没有编译器,没法调试程序,但我可以试着用程序回答一下。

看懂了,谢谢大神
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马