黑马程序员技术交流社区

标题: 问一个很简单的C的问题 [打印本页]

作者: lj61785636    时间: 2015-5-4 12:03
标题: 问一个很简单的C的问题
#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;
}


我运行显示的结果是
120
10
30260

这个最后一个printf的260是怎么得出来的。求解答
作者: 50mmf1.0    时间: 2015-5-4 15:46
作用域的问题吧。
main函数里面的最后一个大括号里,
开始是score = a + 250;这里的a在上一个大括号里面已经变成10了,所以全局变量score的结果为260。
然后又重新定义了一个新的局部变量score = 30,打印的时候会优先找最近的score,局部变量score生效,所以那个大括号里面打印出来的score还是30。
大括号结束,局部变量score已经没有作用域了,所以打印的还是原来的那个全局变量score为260。
哥们儿你大括号弄太多了。。
作者: 冰儿    时间: 2015-5-4 16:00
作用域的问题
作者: shenxian88    时间: 2015-5-4 21:13
其实主要是面定义的int score = 30;这里定义的时局部变量,就不改变score的属性,因此score = 250 + a,a新赋值为10,所以score最后的值是260;
作者: 萌萌小喵喵    时间: 2015-5-4 22:39
a=10               
作者:   张恒宇    时间: 2015-5-4 22:53
输出的应该是score=a+250,a=10;作用域有就近原则
作者: 逆流瞅瞅    时间: 2015-5-4 23:48
赞二楼,注意局部变量的作用域。
作者: greatboygirl    时间: 2015-5-5 12:31
变量作用域的问题
作者: 枫宇翔    时间: 2015-5-5 14:24
要注意作用域,上面说的是正确的
作者: 李鹏宇    时间: 2015-5-5 14:59
作用域。
在main函数中,对象的作用域为他所在的最近的一对花括号内,全局的对象的作用域为声明之后的整个文件。
第一个  int score = a + 100; 是全局变量,在整个main方法中有效。而第三个 int score = 30;是局部变量,作用域为包含他的最近一对大括号,在此括号中的输出会优先输出当前的局部变量即为30。
该段执行完毕,回到方法最外层,就超过了int score = 30;领地范围。
输出score 为第一次声明的全局变量,即为10+250=260.
作者: 梦初醉    时间: 2015-5-6 02:07
其实这个问题你自己只要按照李明杰老师视频画内存框图很容易就能知道,很基本的问题 作用域! 个人给你个 好办法 把 score = 10; 和 score = a + 250;  分别注释 或是改值 就能知道问题所在,有些时候不知道分析程序 结果不和答案不对时, 利用注释 能很好的找到问题。 这才是授人以渔啊!
作者: ydy96315    时间: 2015-5-6 05:55
作用域问题
作者: cogddo    时间: 2015-5-6 09:45
理解代码块,和就近原则就很简单了,,
作者: wusanzhong    时间: 2015-5-6 10:14
括号太多,差点看晕了
作者: wx_BZhrvVik    时间: 2015-5-6 10:24
这个是作用域的问题
#include <stdio.h>
int main()
{
    int a = 20;//a=20
    int score = a + 100;//score=120
    printf("%d\n", score);//打印120
   
    {
        int score = 50;//score=50
        {
            score = 10;//score=10
            printf("%d\n", score);打印10
        }
        a = 10;
    }//这可代码块结束后a=10,socre=10
   
    {
        score = a + 250;//score=260,这个score是之前定义的,代码块结束后,修改的值依然保留
        int score = 30;//这个score的是新定义的,作用域只在这个代码块之内
        printf("%d", score);//打印30
    }
   
    printf("%d\n", score);//260
    return 0;
}
代码块内的标识符若没有新定义,会自动引用外部的定义,并且在代码块结束后,将结果保留

希望可以帮到你




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