黑马程序员技术交流社区

标题: 实在不知这个输出结果是怎么得出来,有会的请帮忙分析,感激不尽 [打印本页]

作者: 736010695    时间: 2014-10-9 19:46
标题: 实在不知这个输出结果是怎么得出来,有会的请帮忙分析,感激不尽
最近看基础教程,关于代码块的问题,程序是按行由上往下走的,一个代码块运行完这个代码块在内存中就消失了,这么理解是没错的吧?前三个输出我答的跟终端输出一样分别是120、10、30,可是最后一个函数输出终端计算的是260,小弟实在不解释怎么得出来的,还请各位帮忙...
#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/n", score);
    }
   
    printf("%d\n", score); /*(就这一步的输出结果终端计算的是260,小弟实在不解释怎么得出的,还请懂的帮忙分析下,小弟基础差,越详细越好,感激不尽*/
    return 0;
}

作者: 萧雨流风    时间: 2014-10-9 19:49
这个你最好还是把教程再用心看一下 我相信你就会懂了 现在即使跟你说的很详细,你基础不过关 还是是不行的

作者: alpha.huai    时间: 2014-10-9 21:16
scoure 是全局变量,还需要详细说吗?
作者: 赵志文    时间: 2014-10-9 22:17
  都是局部变量      ,两个大括号之间的代码称为代码块,那个a =10 就把a的值由改成10,  score = a + 250,把score变成了260   所以最后 printf("%d\n", score); 就是260了啊
作者: 736010695    时间: 2014-10-9 22:57
赵志文 发表于 2014-10-9 22:17
都是局部变量      ,两个大括号之间的代码称为代码块,那个a =10 就把a的值由改成10,  score = a + 250,把 ...

慢慢的我似乎理解一点了,有时会被一个东西卡住,然后就一直出不来,有人稍微点播下,换换脑子自己可能就慢慢理解了,不管怎样,还是谢谢各位
作者: 736010695    时间: 2014-10-9 22:59
alpha.huai 发表于 2014-10-9 21:16
scoure 是全局变量,还需要详细说吗?

谢谢您的指点
作者: 明天过后1    时间: 2014-10-9 23:00
编译器是如何找变量的?
以下是个人理解啊,

{ // 这个可以说是根代码块吧 ROOT
   // A 和 B 的等级相同的
  {/*代码块A*/} // 这个可以说是字代码块 A
  {/*代码块B*/} // 这个可以说是字代码块 B
}
等级关系 ROOT > A  = B
如果代码块中含有一个变,在该代码块内它这一行前面没有明确的声明和定义,那么它就会去比它高一级代码块(不会去跟他等级相同的代码块中寻找)中寻找,直到找到为止(如果没有的话就报错了),理解这个规律你可以再看以下应该就直到了
作者: 会飞的蜗牛    时间: 2014-10-9 23:12
最后输出的是全局变量score
作者: 736010695    时间: 2014-10-10 00:30
会飞的蜗牛 发表于 2014-10-9 23:12
最后输出的是全局变量score

对的,我没把全局变量和局部变量分清
作者: 米匠    时间: 2014-10-10 15:16
可以理解为,执行完的代码就是走完了,不走那了,并没有消失,,,,代码在内存中是存放在code segment,这块内存是专门存放代码的
作者: duzhong    时间: 2014-10-10 17:16
这段代码很坑爹啊,C语言中,程序块内的变量一边不与程序块外部或者全局变量一样。这样容易引起错误与混乱。在这个结构块中 {
        score = a + 250;
        int score = 30;
        printf("%d/n", score);
    }
    定义了一个常量与全局变量名字一模一样,不是来坑人的么??
作者: zhuohong_xiao    时间: 2014-10-10 20:54
duzhong 发表于 2014-10-10 17:16
这段代码很坑爹啊,C语言中,程序块内的变量一边不与程序块外部或者全局变量一样。这样容易引起错误与混乱 ...

这段代码就是用来调戏我们的。
楼上的有一个说到了问题的根本,学习了。
作者: coyote    时间: 2014-10-10 22:58
最后输出的score是全局变量,score=10+250=260;后面定义那个score在代码块结束就释放了
作者: keep_flying    时间: 2014-10-11 00:50
哪个RD要是写出这种程序代码,别说自己过不去,测试都会鄙视。
作者: QQ920924960    时间: 2014-10-11 07:45
没看到后面a的值变为10了吗,10+250=260呗,最后输出的是全局变量中的score




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