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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大龄产妇 中级黑马   /  2014-4-27 23:42  /  1324 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 大龄产妇 于 2014-4-28 16:02 编辑

#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;//a定义范围不止于上面括号?这里如果用int a 是不是下面再计算就不是这里的a值?
    }
        {
       score = a + 250;
        int score = 30;
        printf("%d", score);//30
    }
   
    printf("%d\n", score);//这句为什么输出的是上面括号里的score,
    return 0;
}
//老师的练习题,答案是  123;10;30260,我现在搞不清楚为什么最后一句printf输出的是上面括号里的score,不应该是输出最上面大括号外面的最先定义的score么?我认为最后一句输出的值应该是120.也就是最上面int score = a+100;(回过头复习之前的知识,还是一堆问题。零基础是硬伤啊!麻烦好心人帮忙解答)

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

5 个回复

倒序浏览
在main方法里定义的起始变量也就是局部变量,作用域看main的{},从"{"开始到"}"结束,另外变量的使用是采取的“就近原则”。注释的第一问中,a = 10,相当于最先定义的a值变成10,如果int a = 10;下面a的值依然是20,因为在代码块中定义,2个a的作用域不同。注释的第二问中,就是“就近原则”的使用,int score = 30;只作用到当前代码块,这里score = a+250;而a = 10;所以输出结果:score = 260 。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
EchoWill 发表于 2014-4-28 00:10
在main方法里定义的起始变量也就是局部变量,作用域看main的{},从"{"开始到"}"结束,另外变量的使用是采取 ...

就近不是先找同括号中的么?上面最开始定义的score,和最后一句输出语句是同一括号。再者,计算机读码不都从上到下依次么?
回复 使用道具 举报
先看这个代码块
  1. {
  2.        score = a + 250;
  3.         int score = 30;
  4.         printf("%d", score);//30
  5. }
复制代码

第一句score = a + 250;这个score是260,因为a在上一个代码块中被赋值成10,所以加上250是260。
这个score在这个代码块中并不是新定义的而是在main函数开始时定义的。所以这个score占用的是外部score的存储空间,和外部score是一个变量,外部的score变量到了这里值就改成了260。
第二句又定义了一个score变量,这是一个新的变量,与外部的无关。在这个代码块结束后,在这个代码块中定义的变量就回收了。但是score = a + 250;这句的作用并不会因为这个代码块的结束而结束。它的作用域在于它被定义的代码块中,main函数结束时它才结束,main函数不结束score等于260的值就不会被局部的代码块结束而释放掉。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报 1 0
a定义范围不止于上面括号?这里如果用int a 是不是下面再计算就不是这里的a值?
a = 10;是一个赋值过程,完成最近一个变量int a赋值就结束了,不论是不是在括号里
换成int a 那么赋值过程仅在括号内完成然后就结束了 和大括号外的变量没有关系

为什么最后一句printf输出的是上面括号里的score,不应该是输出最上面大括号外面的最先定义的score么?
最后一句printf输出的还是最上面的score,只不过最上面的score经过score = a + 250;赋值发生了变化,变成了
int score = a +250;这里a也经过赋值变成了10,所以输出结果就是260.

就近不是先找同括号中的么?上面最开始定义的score,和最后一句输出语句是同一括号。再者,计算机读码不都从上到下依次么?
就近原则应该服从于从上到下的原则 就是说先从上往下读 然后就上面的不就下面的 因为读的时候下面还没出现
不知道你明白了没有啊
我也是零基础



建议再看看作用域范围视频那个讲内存小方块的部分
回复 使用道具 举报
Freedam 发表于 2014-4-28 00:27
先看这个代码块

第一句score = a + 250;这个score是260,因为a在上一个代码块中被赋值成10,所以加上250 ...

谢谢解释,非常详细。明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马