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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lj61785636 中级黑马   /  2015-5-4 12:03  /  1675 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

#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是怎么得出来的。求解答

14 个回复

倒序浏览
作用域的问题吧。
main函数里面的最后一个大括号里,
开始是score = a + 250;这里的a在上一个大括号里面已经变成10了,所以全局变量score的结果为260。
然后又重新定义了一个新的局部变量score = 30,打印的时候会优先找最近的score,局部变量score生效,所以那个大括号里面打印出来的score还是30。
大括号结束,局部变量score已经没有作用域了,所以打印的还是原来的那个全局变量score为260。
哥们儿你大括号弄太多了。。
回复 使用道具 举报 2 0
作用域的问题
回复 使用道具 举报
其实主要是面定义的int score = 30;这里定义的时局部变量,就不改变score的属性,因此score = 250 + a,a新赋值为10,所以score最后的值是260;
回复 使用道具 举报
a=10               
回复 使用道具 举报
输出的应该是score=a+250,a=10;作用域有就近原则
回复 使用道具 举报
赞二楼,注意局部变量的作用域。
回复 使用道具 举报
变量作用域的问题
回复 使用道具 举报
要注意作用域,上面说的是正确的
回复 使用道具 举报
作用域。
在main函数中,对象的作用域为他所在的最近的一对花括号内,全局的对象的作用域为声明之后的整个文件。
第一个  int score = a + 100; 是全局变量,在整个main方法中有效。而第三个 int score = 30;是局部变量,作用域为包含他的最近一对大括号,在此括号中的输出会优先输出当前的局部变量即为30。
该段执行完毕,回到方法最外层,就超过了int score = 30;领地范围。
输出score 为第一次声明的全局变量,即为10+250=260.
回复 使用道具 举报
其实这个问题你自己只要按照李明杰老师视频画内存框图很容易就能知道,很基本的问题 作用域! 个人给你个 好办法 把 score = 10; 和 score = a + 250;  分别注释 或是改值 就能知道问题所在,有些时候不知道分析程序 结果不和答案不对时, 利用注释 能很好的找到问题。 这才是授人以渔啊!
回复 使用道具 举报
作用域问题
回复 使用道具 举报
理解代码块,和就近原则就很简单了,,
回复 使用道具 举报
括号太多,差点看晕了
回复 使用道具 举报
这个是作用域的问题
#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;
}
代码块内的标识符若没有新定义,会自动引用外部的定义,并且在代码块结束后,将结果保留

希望可以帮到你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马