黑马程序员技术交流社区
标题:
作用域问题
[打印本页]
作者:
星河鹭起
时间:
2014-4-6 12:04
标题:
作用域问题
int main()
{
if ()
int a=1;
printf("%d",a);
}
这段代码是错误的,MJ说a的作用域不明确,我也听懂了。但是我想请问下,这个在内存中是怎么执行的。准确的说机器语言是怎么进行判断的。谢谢。
作者:
于清扬
时间:
2014-4-6 13:00
if()
int a = 1;
这两行其实就是
if()
{
int a = 1;
}
那么这相当于一个代码块,if执行时,int a = 1会在内存中创建一个占4字节的存储空间,if执行完毕后,这个存储空间就没了,所以printf("%d",a);这句里面的a就没有定义
作者:
王雪冬
时间:
2014-4-6 13:19
int main()
{
if ()
int a=1;
printf("%d",a);
}
复制代码
是省略了 if 语句的{},其实是下面这样
int main()
{
if ()
{
int a=1; //a的范围仅仅是if 后面的大括号内
}
printf("%d",a);
}
复制代码
当执行到
int a=1;
复制代码
电脑会为a开辟一块空间,当执行完if(){......}着里面的"}"时,a的生命周期就结束了
所以下面的
printf("%d",a);
复制代码
就找不到 a 了
作者:
远人
时间:
2014-4-6 13:30
楼上解释的都很到位,我就不多做解释
我这里是MJ老师讲解,我补充做的笔记,你看看注释,这个代码你完全懂了,作用域就不是问题了
/*
1.代码块的作用:手机内存有限,为了提高手机内存的及时释放,为了提升性能。
2.变量的作用域:从定义变量的哪一行代码开始,一直到所在的代码块结束
*/
#include <stdio.h>
int main(int argc, const char * argv[])
{
/*{
int a = 10;//这里的代码块只能在这个{}中有效使用,其作用域是不能逃出此{}
}//这个}执行代表这块{}函数执行完毕,将在内存中被释放消失
printf("a = %d",a);//所以这里的printf函数不能使用变量a
*/
int score = 100;
{
int score = 200;
{
int score = 50;//这样函数输出结果score =200 ,score = 100
/* score = 50;//这将score赋值改变为50,这样函数输出是score = 50 ,原因是这里的socre没有定义,需要到外面找定义的代码进行修改使用。score =100 */
}
printf("score = %d",score);//这里能调用外面的score变量(注释此代码块中的int score做实验),但是因为代码块存在,所以这里的printf输出采取就近原则,而不是给score赋值两次,(如果赋值两次,那么第二个printf输出也是200,但结果是100,充分证明了代码块中的就近原则)
}
printf("score = %d",score);
return 0;
}
复制代码
作用域也就是内存分析的问题,学习C弄清楚内存分析是关键。老师画得图你也要画出来和文档存在一起。
加油!
作者:
戴文婷
时间:
2014-4-6 14:38
本帖最后由 戴文婷 于 2014-4-6 15:56 编辑
int main()
{
if ()
int a=1;
printf("%d",a);
}
复制代码
等同于
int main()
{
if (){
int a=1;
}
printf("%d",a);
}
复制代码
就是他们上面说的这样,int a出了{}后内存就被释放掉了。所以后面printf();使用时就找不到变量a了。
if()
后面不加括号的话默认就是if语句块只包含紧跟它的后面一句语句,第二第三行都不算在if语句块里了。
所以一般为了不犯这种bug,if()后就算只有一句话也要用{}括起来。不然以后修改时一不注意,指不定就要找bug找半天了。
更何况有时候写的代码还要让其他人改的时候。更加要加~
作者:
星河鹭起
时间:
2014-4-7 11:56
戴文婷 发表于 2014-4-6 14:38
等同于
谢谢。现在弄明白了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2