黑马程序员技术交流社区

标题: 今天学的这道题我弄的云里雾里的 [打印本页]

作者: 安逸丶    时间: 2015-6-15 21:52
标题: 今天学的这道题我弄的云里雾里的
#include <stdio.h>

int main()
{
    int a = 20;
    int score = a + 100;
    printf("%d\n", score);
   
    {
        int score = 50;
        {
            score = 10;
            printf("%d\n", score);
        }
        a = 10;
    }
   
    {
        score = a + 250;
        int score = 30;
        printf("%d", score);
    }
   
    printf("%d\n", score);
    return 0;
}

作者: 洋柿子    时间: 2015-6-15 22:03
看解析吧......
作者: 安逸丶    时间: 2015-6-15 22:04
洋柿子 发表于 2015-6-15 22:03
看解析吧......

解析是看了 看完更混乱 你能给仔细解答一下么
作者: XiaoBaoMi    时间: 2015-6-15 22:08
第一个120没问题吧,第二个10没问题吧,第三个是30因为作用域,第四个260因为score = 10 + 250,去看看有关变量作用域的视频吧
作者: Dast    时间: 2015-6-15 22:20
看几遍视频,看下百度百科。慢慢就理解了
作者: d18819042875    时间: 2015-6-15 22:38
教你一个死办法,暂时不懂的就直接默下来,多弄几遍就明白了

作者: 小小羊    时间: 2015-6-15 22:53
#include <stdio.h>

int main()
{
    int a = 20;
    int score = a + 100;   //这个sorce的作用域是整个main函数
    printf("%d\n", score);//这个sorce的作用域也是

   
    {                    //这个大括号我们编号为1
        int score = 50;   //这个sorce重新定义的,作用域为大括号1——2
        {
            score = 10;    //这个sorce为刚才定义的sorce,此时值为10
            printf("%d\n", score);  //sorce=10
        }
        a = 10;
    }               //这个大括号我们编号为2,它与1对应
   
    {               //这个大括号我们编号为3
        score = a + 250;   //这个sorce为最初开始定义的那个sorce
        int score = 30;    //新定义的sorce,作用域为大括号3——4
        printf("%d\n", score);
    }              //这个大括号我们编号为4
   
    printf("%d\n", score);  //这个sorce为最初定义的那个sorce,sorce=260
    return 0;
}
作者: 日薄星回    时间: 2015-6-15 23:04
120、10、270、30、120对了没有?
作者: 弹剑    时间: 2015-6-15 23:11
我们知道两件事,一是函数的执行是从上到下依次执行的,二是括号后会释放括号内的重新定义的变量空间.
所以再不借助XCODE软件的提示作用域帮助下,你可以选择从下往上看,找每个printf对应的变量,应该会有所收获.
作者: aludiba    时间: 2015-6-16 11:27
作用域的问题,搞清楚各个变量的作用域也就弄明白了,结果是120 10 30 260,尝试解释一下吧
#include <stdio.h>

int main()
{
     int a = 20;//定义整型变量a并初始化为20
     int score = a + 100;//定义整型变量score并初始化
     printf("%d\n", score);//打印score,打印结果是20和100的和120
     
    {//定义了一个代码块,这是一个新的作用域
         int score = 50;//在该代码块中定义并初始化一个新的变量score,与之前的同名变量score无关,二者作用域不同
         {//再次定义一个新的代码块
             score = 10;//此处没有定义新变量,而是找到离它最近的一个代码块中的变量score并将它的值改为10
             printf("%d\n", score);//就近找,打印结果为10
         }//代码块结束,在内存中销毁,后面可以无视这段代码
         a = 10;//就近寻找a,找到后将它的值改为10
     }//代码块结束在内存中销毁
     
    {//又定义了一个新的代码块
         score = a + 250;//未定义新的变量score而是将它上一级作用域中的score改为260
         int score = 30;//这行代码开始定义并初始化一个新的变量score,与上一行代码的score无关
         printf("%d", score);//打印它就近代码块中的score的值30
     }//代码块结束在内存中销毁
     
    printf("%d\n", score);//将最后一个未被内存销毁的变量score的值打印出来结果为260
     return 0;
}
作者: 50mmf1.0    时间: 2015-6-16 12:42
作用域的问题吧。这个你看大括号就是了,不同的大括号里可以定义同名的变量,但是该变量只会在当前作用域有用。
打印的语句在哪个大括号里你就只看那个大括号里该变量的变化就是了,其他的括号不要管。
名字一样只是误导你的。
作者: venn    时间: 2015-6-16 13:11
   难点就是局部变量的作用域问题 好好打基础,,,,
作者: talent123    时间: 2015-6-16 15:25
代码块的问题
遇到大括号 就要小心一点
作者: 李言    时间: 2015-6-16 21:10
每个大括号里定义的只能用到大括号结束,其他的用上一级代码快定义的变量
作者: 小龙女的萝卜    时间: 2015-6-16 21:39
这不是有答案吗?自己画个图不就完了
作者: Dove丶凡    时间: 2015-6-16 22:19
只要没有int的 就一直往下走。int之后的在}结束之后,内存清零就没有了。




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