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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

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

1  //变量在代码中的作用域
2  #include <stdio.h>
3  int main()
4  {
5  int a = 100;
6     {
7         int a = 200;
8           {
9              a = 50;
10         }
11        printf("a=%d\n",a);
12    }
13    printf("a=%d\n",a);
14   
15    return 0;
16 }
//为什么输出结果是50 ,100,而不是200,100?11行中的printf 输出就近原则怎么就先找括号中的呢?不应该是从上往下找么?不应先找同在一个括号的么?若真是先找括号中的,那么13行输出为什么不是50?谁能帮我分析下?我是理解不了

评分

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

查看全部评分

11 个回复

倒序浏览




这是我画的内存过程图,简单了些,右边的应该画在左边的图里面,但是为了你看到main,所以分开画,a=100你是没有问题的,就是为什么输出的是50,而不是200,因为就近原则,输出的时候寻找最近的a,找到的是50,我是这么理解的。因为a=50并没有输出,只是初始化。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 【王者伟业】 于 2014-4-23 21:34 编辑

C:\Users\Administrator\Desktop\捕获.JPG  中间的大括号,有跟没有完全没差,没有起到任何作用。

捕获.JPG (88.93 KB, 下载次数: 42)

捕获.JPG
回复 使用道具 举报
复制过来是 50,100.

1.gif (46.02 KB, 下载次数: 38)

1.gif
回复 使用道具 举报

  1.   //变量在代码中的作用域
  2.   #include <stdio.h>
  3.     int main()
  4.    {
  5.    int a = 100;
  6.     {
  7.         int a = 200;
  8.         a = 50;
  9.         printf("a=%d\n",a);
  10.     }
  11.    printf("a=%d\n",a);
  12.     // 楼主的代码等价于以上,现在容易理解了吧。
  13.     return 0;
  14. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
马凯文 发表于 2014-4-23 11:51
为了说明,我用a1,a2,a3代表你这里面的a
不知道说的明不明白,有不明白的可以联系我

谢谢解答!明白了,就是中间括号中的重新定义上面的内容。
回复 使用道具 举报

厉害!简单明了!一眼就读懂了。
回复 使用道具 举报
blz01003hm 发表于 2014-4-23 11:53
复制过来是 50,100.

谢谢哦,不过你这没回答问题哦。
回复 使用道具 举报
.Drenched 发表于 2014-4-23 16:56
这是我画的内存过程图,简单了些,右边的应该画在左边的图里面,但是为了你看到main,所以分开画,a=10 ...

老师的视频上是说就近原则,但是和这道题的答案没有太大关联。老师的就近原则也把我误导了,所以我上来提问。这道题的答案为什么是50,原因是:最中间括号中的50 重新定义了a  也就是把上面200的内容抹去了。如果最中间的a=50 括号内有 int a = 50 那么这道题的答案就是 200 , 100.:lol看我理解的对不对
回复 使用道具 举报
变量用的是最接近的大括号中定义的变量的
现在这层(大括号)中找定义.找不到再找上一层 直到找到为止. 如果没有找到就出现为未定义的错误

第一个在这个大括号中定义了变量啊,然后再子大括号中赋了50的值
所以是值是50

第二个是在他的作用域是在main函数 在当前层作用域中只有一个变量a,值是100.
回复 使用道具 举报
251638256 发表于 2014-4-24 22:16
变量用的是最接近的大括号中定义的变量的
现在这层(大括号)中找定义.找不到再找上一层 直到找到为止. 如果 ...

很详细,我又把知识点过了一遍。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马