黑马程序员技术交流社区

标题: c语言的题目 [打印本页]

作者: 魑魅魍魉121    时间: 2014-6-6 18:37
标题: c语言的题目
本帖最后由 魑魅魍魉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???,求大神指点


作者: 夏沫的黄昏′    时间: 2014-6-6 19:08
{
                score = a + 250;
                int score = 30;
                printf("%d\n",score);//30
        }

        printf("%d\n",score);//260
里面的sorce 跟 外面的sorce 不是一个数。。。因为作用域不一样  里面的是{} 这个块内的局部变量 所以 里面的sorce不会影响外面sorce的值
作者: XCodeRush    时间: 2014-6-6 19:30
你好,我手里没有编译器,没法调试程序,但我可以试着用程序回答一下。
  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    时间: 2014-6-6 19:39
#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;
}



希望能给您带来帮助
作者: 光辉岁月    时间: 2014-6-6 20:26
XCodeRush 发表于 2014-6-6 19:30
你好,我手里没有编译器,没法调试程序,但我可以试着用程序回答一下。

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

看懂了,谢谢大神




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