黑马程序员技术交流社区

标题: 如何理解倒数第二行的输出结果? [打印本页]

作者: iOS    时间: 2014-5-20 18:19
标题: 如何理解倒数第二行的输出结果?
本帖最后由 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


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







作者: wanzhu159    时间: 2014-5-20 18:27
这个事代码块啊
作者: 无尽可能    时间: 2014-5-20 18:39
本帖最后由 无尽可能 于 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. }
复制代码


作者: iOS    时间: 2014-5-20 18:39
wanzhu159 发表于 2014-5-20 18:27
这个事代码块啊

不理解。

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

谢谢!
作者: wanzhu159    时间: 2014-5-20 18:43
先从开始给你分析吧,我也是前几天刚学的
   第一个打印就不说了,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。
作者: wanzhu159    时间: 2014-5-20 18:48
不着急,慢慢分析哈,都能出来。
作者: iOS    时间: 2014-5-20 18:48
wanzhu159 发表于 2014-5-20 18:43
先从开始给你分析吧,我也是前几天刚学的
   第一个打印就不说了,a=5,b=10,往下就进入第一个代码块中的第 ...

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

应该给版主加分。^_~

作者: wanzhu159    时间: 2014-5-20 18:52
记得问题解决后,记得把帖子改为提问结束哦!
作者: iOS    时间: 2014-5-20 18:53
wanzhu159 发表于 2014-5-20 18:52
记得问题解决后,记得把帖子改为提问结束哦!

好的,已改~
作者: iOS    时间: 2014-5-20 19:14
无尽可能 发表于 2014-5-20 18:39
就近原则,

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

这个也能看懂~

感谢指导!:handshake
作者: 秋水红林    时间: 2014-9-11 08:51
分析的好清晰啊




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