黑马程序员技术交流社区

标题: 局部变量作用域问题 [打印本页]

作者: 黑马李果    时间: 2012-7-3 22:29
标题: 局部变量作用域问题
如图所示,
当for语句执行完之后,在if语句里面声明同名变量row,col,从下面的局部变量窗口可以看到,在初始化之前,这两个变量保留了之前在for语句中赋的值,而不是0。 为什么会这样呢,两个作用域中的row和col分别是不同的变量啊。


作者: 王玲星    时间: 2012-7-4 00:26
你断点设置在这里,这里的代码根本没有执行,怎么会变呢。
你在for中不是声明了还给赋了值,后面不知道楼主为什么要再声明一次
你按F11就会变了
作者: 肖琦    时间: 2012-7-4 00:47
程序语法有问题:
  if 中定义的 row,col 与 for中定义的row,col相冲突;
  因为在此表达式中,for 是 if 的父级,子级和父级都声明了同名的变量,编译器就辨认不了到底是哪一个,因此编译就会报错;
  就这个表达式而言有漏洞,根本就不会执行if中的代码;
希望对你有帮助
作者: 杨正    时间: 2012-7-4 01:05
在初始化之前,这两个变量保留了之前在for语句中赋的值,而不是0。 为什么会这样呢,两个作用域中的row和col分别是不同的变量啊。



你好,不是太明白你的目的,你的代码其实可以写的更规范些,如上图:
if 整个语句块实际上是for循环的一个语句,你在for循环的语句块中重复定义一个变量,默认值确实是为0的,如下图:

但是在你的调试里,已经执行到了这一步“row = col = 250; ”实际上这时已经对“int row, col;”进行了新的赋值,覆盖了原来的。

总的说:你在for循环语句中和在if判断语句中分别定义了两个同名变量,但if语句是for循环下的一个执行语句,会依次执行,故运行到了你那一步,row和col分别重新赋了值,即你在for循环中赋的值。不知道你明白了没有。

作者: 许庭洲    时间: 2012-7-4 09:19
本帖最后由 许庭洲 于 2012-7-4 09:23 编辑

for(int row=17,col=71;false;);//很直观的看出循环for语句没有执行,原因在于循环条件为false,但 col和row被初始化了,所以快速监视窗口或局部变量窗口会显示row=17,col=71.
作者: 秦永辉    时间: 2012-7-4 09:31
上面的那个佛如循环等价与下面:
  1. int row=17,col=71;
  2. for(false);
复制代码
row所在的作用域包括if的作用域,所以你在if里面再定义row和col的话就会与父级的冲突!你应该是以为row的作用域就是for语句,那是错的!
作者: 黑马李果    时间: 2012-7-4 09:53
晕,你们没看到for(...)后面有个分号吗?这就表示for循环下的执行语句为空,if语句显然不是for的子级,而是与for语句相独立的,for语句结束了再执行if.  所以它们是两个独立的作用域,不存在包含与被包含关系。
如果if是for的执行语句的话,for中的判断语句为false,这样根本就不会执行if,而程序调试时在if里面的断点处停下来了,说明if执行了;而且如果if是for的执行语句的话,那两个变量就不能在if中再声明,IDE直接会将错误指出来,更不会运行了。

写这段小代码只是一时好奇想看一下同一个方法中两个不存在包含与被包含关系的不同作用域中声明的同名变量有没有什么联系,虽然从宏观上来看,它们是没有什么关系的,可以放心地声明同名变量。但是这里发现后者在声明之后赋初值之前保留了前者的值(也许是内存上沿用了前者的内存空间,但是我在《Essential C#》还是《Beginning VS C#2010》中看到,局部变量在声明时并未为其分配内存空间,而是在初始化时才分配的内存空间),不过这对实际编程没有影响,只需从宏观上来看就可以了。

其实我也很想改掉这种钻牛角尖的习惯。
作者: 杨正    时间: 2012-7-4 11:41
惭愧,晚上没看清你的问题,不过我照你说的测试了,居然也遇到了同样的困惑,两个同名变量之间按理是无联系的,但是在监视时发现两个值却又随着彼此相互变化,这可能是关系到变量值的存储问题,也正求解!和你类似,我也有点爱牛角,哈。




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