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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李果 中级黑马   /  2012-7-3 22:29  /  1780 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

倒序浏览
你断点设置在这里,这里的代码根本没有执行,怎么会变呢。
你在for中不是声明了还给赋了值,后面不知道楼主为什么要再声明一次
你按F11就会变了

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
程序语法有问题:
  if 中定义的 row,col 与 for中定义的row,col相冲突;
  因为在此表达式中,for 是 if 的父级,子级和父级都声明了同名的变量,编译器就辨认不了到底是哪一个,因此编译就会报错;
  就这个表达式而言有漏洞,根本就不会执行if中的代码;
希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
在初始化之前,这两个变量保留了之前在for语句中赋的值,而不是0。 为什么会这样呢,两个作用域中的row和col分别是不同的变量啊。



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

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

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

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 许庭洲 于 2012-7-4 09:23 编辑

for(int row=17,col=71;false;);//很直观的看出循环for语句没有执行,原因在于循环条件为false,但 col和row被初始化了,所以快速监视窗口或局部变量窗口会显示row=17,col=71.

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
上面的那个佛如循环等价与下面:
  1. int row=17,col=71;
  2. for(false);
复制代码
row所在的作用域包括if的作用域,所以你在if里面再定义row和col的话就会与父级的冲突!你应该是以为row的作用域就是for语句,那是错的!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
晕,你们没看到for(...)后面有个分号吗?这就表示for循环下的执行语句为空,if语句显然不是for的子级,而是与for语句相独立的,for语句结束了再执行if.  所以它们是两个独立的作用域,不存在包含与被包含关系。
如果if是for的执行语句的话,for中的判断语句为false,这样根本就不会执行if,而程序调试时在if里面的断点处停下来了,说明if执行了;而且如果if是for的执行语句的话,那两个变量就不能在if中再声明,IDE直接会将错误指出来,更不会运行了。

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

其实我也很想改掉这种钻牛角尖的习惯。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
惭愧,晚上没看清你的问题,不过我照你说的测试了,居然也遇到了同样的困惑,两个同名变量之间按理是无联系的,但是在监视时发现两个值却又随着彼此相互变化,这可能是关系到变量值的存储问题,也正求解!和你类似,我也有点爱牛角,哈。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马