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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© iOS 中级黑马   /  2014-5-20 18:19  /  2251 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 iOS 于 2014-5-20 18:49 编辑
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int a,b;
  5.     a=5;
  6.     b=10;
  7.     printf("%d,%d\n",a,b);
  8.     {
  9.         double a=1.5;
  10.         b=20;
  11.         printf("%lf,%d\n",a,b);
  12.         {
  13.             char a='k';
  14.             b=30;
  15.             printf("%c,%d\n",a,b);
  16.         }
  17.         printf("%lf,%d\n",a,b);
  18.     }
  19.     b=40;
  20.     printf("%d,%d\n",a,b);
  21.     return 0;
  22. }
复制代码
正确的输出结果为:
5,10
1.500000,20
k,30
1.500000,30
5,40


为什么不是:

5,10
1.500000,20
k,30
1.500000,20
5,40


请问:倒数第二行,哪里错了?如何理解?






评分

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

查看全部评分

10 个回复

倒序浏览
这个事代码块啊
回复 使用道具 举报
无尽可能 来自手机 中级黑马 2014-5-20 18:39:06
藤椅
本帖最后由 无尽可能 于 2014-5-20 19:08 编辑

就近原则,

b一直都只有一个存储空间,
而a,在代码块内的开的存储空间执行完代码块就消失了。

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int a,b;   //定义变量,a和b,开辟了a和b的存储空间。
  5.     a=5;    //赋值
  6.     b=10;  //赋值,此时 b=10
  7.     printf("%d,%d\n",a,b);
  8.     {
  9.         double a=1.5;  //定义变量a 这个a是代码块里的另外一个存储空间                                                                                                            
  10.           b=20;              //就近原则,找到代码块外层的b,赋值为20,此时b=20
  11.         printf("%lf,%d\n",a,b); //就近原则,代码块里有a=1.500000,b代码块内没有,则向外层最近的地方找,找到b=20
  12.         {
  13.             char a='k';   //定义变量a 这个a是本代码块里的一个存储空间,与之前的都无关。
  14.             b=30;         //就近原则,找到代码块外层的b,赋值为30,此时b=30
  15.             printf("%c,%d\n",a,b);
  16.         }                   //该代码块执行完,代码块里的存储空间消失,此时a的值就近往上层代码块内找,是a=1.500000,b=30,
  17.         printf("%lf,%d\n",a,b);         //a=1.500000,b=30
  18.     }                    //代码块执行完,本代码块内a存储空间消失。此时a往上找到a=5,b只有一个存储空间还是30
  19.     b=40;          //b的值被修改为40.
  20.     printf("%d,%d\n",a,b);          //a=5,b=40
  21.     return 0;
  22. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
傘が咲く + 2 代码格式规范,注释很详细,有研究加分规则.

查看全部评分

回复 使用道具 举报 1 0

不理解。

请详细解释倒数第二行的输出结果?!

谢谢!
回复 使用道具 举报
先从开始给你分析吧,我也是前几天刚学的
   第一个打印就不说了,a=5,b=10,往下就进入第一个代码块中的第一个打印,首先会给这个代码块在内存中重新分配一块内存,这里面要打印a和b的值,a的值在这里面有定义也就是在代码块中重新分配一块内存给double类型的变量a使用,所以a=1.50000,那么要打印b的时候会在这个代码块里面寻找变量b,结果找不到,根据就近原则,往上找,找到了变量b的内存分配空间,把b=10改为b=20;接下来这个代码块的分析思路和上面的一样,char类型的a=‘k’但是b往上找找到了b=20,把它改为b=30,然后就是楼主要问的打印a=1.5000,b的值已经修改就是别30。

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报 1 0
不着急,慢慢分析哈,都能出来。
回复 使用道具 举报
iOS 中级黑马 2014-5-20 18:48:50
7#
wanzhu159 发表于 2014-5-20 18:43
先从开始给你分析吧,我也是前几天刚学的
   第一个打印就不说了,a=5,b=10,往下就进入第一个代码块中的第 ...

受教了~  感谢版主精彩解答!

应该给版主加分。^_~
回复 使用道具 举报
记得问题解决后,记得把帖子改为提问结束哦!
回复 使用道具 举报 1 0
iOS 中级黑马 2014-5-20 18:53:17
9#
wanzhu159 发表于 2014-5-20 18:52
记得问题解决后,记得把帖子改为提问结束哦!

好的,已改~
回复 使用道具 举报
iOS 中级黑马 2014-5-20 19:14:53
10#
无尽可能 发表于 2014-5-20 18:39
就近原则,

b一直都只有一个存储空间,

这个也能看懂~

感谢指导!:handshake
回复 使用道具 举报
分析的好清晰啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马