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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 星河鹭起 中级黑马   /  2014-4-6 12:04  /  1023 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

   int main()
{
if ()
int a=1;
printf("%d",a);
}

这段代码是错误的,MJ说a的作用域不明确,我也听懂了。但是我想请问下,这个在内存中是怎么执行的。准确的说机器语言是怎么进行判断的。谢谢。

评分

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

查看全部评分

5 个回复

倒序浏览
if()
int a = 1;
这两行其实就是
if()
{
    int a = 1;
}
那么这相当于一个代码块,if执行时,int a = 1会在内存中创建一个占4字节的存储空间,if执行完毕后,这个存储空间就没了,所以printf("%d",a);这句里面的a就没有定义
回复 使用道具 举报

  1.    int main()
  2. {
  3. if ()
  4. int a=1;
  5. printf("%d",a);
  6. }
复制代码

是省略了  if  语句的{},其实是下面这样

  1.    int main()
  2. {
  3. if ()
  4. {
  5. int a=1; //a的范围仅仅是if 后面的大括号内
  6. }
  7. printf("%d",a);
  8. }
复制代码


当执行到
  1. int a=1;
复制代码

电脑会为a开辟一块空间,当执行完if(){......}着里面的"}"时,a的生命周期就结束了
所以下面的
  1. printf("%d",a);
复制代码

就找不到 a 了

评分

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

查看全部评分

回复 使用道具 举报
楼上解释的都很到位,我就不多做解释
我这里是MJ老师讲解,我补充做的笔记,你看看注释,这个代码你完全懂了,作用域就不是问题了
  1. /*
  2. 1.代码块的作用:手机内存有限,为了提高手机内存的及时释放,为了提升性能。
  3. 2.变量的作用域:从定义变量的哪一行代码开始,一直到所在的代码块结束
  4. */
  5. #include <stdio.h>

  6. int main(int argc, const char * argv[])
  7. {
  8.     /*{
  9.         int a = 10;//这里的代码块只能在这个{}中有效使用,其作用域是不能逃出此{}
  10.     }//这个}执行代表这块{}函数执行完毕,将在内存中被释放消失
  11.     printf("a = %d",a);//所以这里的printf函数不能使用变量a
  12.     */
  13.     int  score = 100;
  14.    
  15.     {
  16.         int score = 200;
  17.         {
  18.             int score = 50;//这样函数输出结果score =200 ,score = 100
  19.            /* score = 50;//这将score赋值改变为50,这样函数输出是score = 50 ,原因是这里的socre没有定义,需要到外面找定义的代码进行修改使用。score =100  */
  20.         }
  21.         printf("score = %d",score);//这里能调用外面的score变量(注释此代码块中的int score做实验),但是因为代码块存在,所以这里的printf输出采取就近原则,而不是给score赋值两次,(如果赋值两次,那么第二个printf输出也是200,但结果是100,充分证明了代码块中的就近原则)
  22.     }
  23.    
  24.     printf("score = %d",score);
  25.     return 0;
  26. }
复制代码


作用域也就是内存分析的问题,学习C弄清楚内存分析是关键。老师画得图你也要画出来和文档存在一起。
加油!

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 戴文婷 于 2014-4-6 15:56 编辑
  1.    int main()
  2. {
  3. if ()
  4. int a=1;
  5. printf("%d",a);
  6. }
复制代码

等同于
  1.    int main()
  2. {
  3. if (){
  4. int a=1;

  5. printf("%d",a);
  6. }
复制代码


就是他们上面说的这样,int a出了{}后内存就被释放掉了。所以后面printf();使用时就找不到变量a了。

if()
后面不加括号的话默认就是if语句块只包含紧跟它的后面一句语句,第二第三行都不算在if语句块里了。

所以一般为了不犯这种bug,if()后就算只有一句话也要用{}括起来。不然以后修改时一不注意,指不定就要找bug找半天了。

更何况有时候写的代码还要让其他人改的时候。更加要加~


评分

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

查看全部评分

回复 使用道具 举报

谢谢。现在弄明白了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马