黑马程序员技术交流社区

标题: 这是我看基础视频偶然发现的问题 [打印本页]

作者: 次长风    时间: 2013-12-19 22:24
标题: 这是我看基础视频偶然发现的问题
class Test4 {
public static void main(String[] args) {

  for ( int x = 10;x < 20 ;x++ ) {
   System.out.println(x);
  }
  System.out.println(x);
}
}
这样编译不能通过,但是如果把int x = 10 放到for语句外边就能编译通过,为什么呢?

作者: 张利星    时间: 2013-12-19 22:30
你的x是在for语句中声明的,是局部变量,它的生命周期只在for语句内有效,你的第二个输出语句是在for语句外的,所以编译不能通过。当你把int x = 10的声明放在for语句外,它的有效范围就是在main函数内了,这样第二个输出语句就能访问到了
作者: 伍艳雄    时间: 2013-12-19 22:36
  1. class Test4 {
  2. public static void main(String[] args) {

  3.    for ( int x = 10;x < 20 ;x++ )//这里的X只在for循环中有效
  4. {
  5.     System.out.println(x);
  6.    }
  7.    System.out.println(x);//访问不到for里面的x。所以会编译失败
  8. }
  9. }
复制代码

作者: 次长风    时间: 2013-12-19 22:47
张利星 发表于 2013-12-19 22:30
你的x是在for语句中声明的,是局部变量,它的生命周期只在for语句内有效,你的第二个输出语句是在for语句外 ...

按你说的x是在for语句内有效,将把int x =10放到外边,结果他不应该打印出来10吗,但是最后结果却是20
作者: 伍艳雄    时间: 2013-12-19 22:57
次长风 发表于 2013-12-19 22:47
按你说的x是在for语句内有效,将把int x =10放到外边,结果他不应该打印出来10吗,但是最后结果却是20 ...

当我把X提到外面的时候是这样的
  1. class Test4 {
  2. public static void main(String[] args)
  3. {
  4. int x = 10 ;//当x=10时
  5.    for ( ;x < 20 ;x++ )//条件满足。x<20,然后打印x,再自增,直到x=20时,条件不满足,循环结束。
  6. {
  7.     System.out.println(x);
  8.    }
  9.    System.out.println(x);//然后打印这个x=20.
  10. }
  11. }
复制代码

作者: 夏德宇    时间: 2013-12-19 22:59
for循环里对x运算,就好比
x = 10;
x = x + 10;
syso(x);
当然是20。
作者: 夏德宇    时间: 2013-12-19 23:05
  1. int x = 10;
  2.                 System.out.println(x);//结果是10
  3.                 for(x = 10; x < 20; x ++){}//只要顺利运行到下面,不管for循环里面进行了什么,对x的影响就相当于对x加了10
  4.                 System.out.println(x);//结果是20
复制代码

作者: 夏德宇    时间: 2013-12-19 23:06
  1. int x = 10;
  2. System.out.println(x);//结果是10
  3. for(x = 10; x < 20; x ++){}//只要顺利运行到下面,对x的影响就相当于对x加了10
  4. System.out.println(x);//结果是20
复制代码

作者: 张利星    时间: 2013-12-19 23:16
次长风 发表于 2013-12-19 22:47
按你说的x是在for语句内有效,将把int x =10放到外边,结果他不应该打印出来10吗,但是最后结果却是20 ...

当然应该打印20呀!怎么能是10呢?不晓得你是怎么理解的,我再解释一遍吧:当把int x =10放到外边时,经过for循环当x的值变成了20(因为不满足x<20的条件而跳出for循环),接下来再打印x,不就应该是20
作者: 任亚俊    时间: 2013-12-19 23:27
这个很简单啊,在for语句中定义的x,只能在for语句中引用,第二句输出语句在for外面,引用了for里面的变量,导致出错。
作者: 城市儒侠    时间: 2013-12-19 23:50
class Test4 {
public static void main(String[] args) {

for (int x = 10; x < 20; x++) {
System.out.println(x);//这里的x是局部变量,出了FOR循环,这个x就消失了。
}
System.out.println(x);//这里的x是成员变量,而你的类里面没有定义这个变量,所以会出错。
}
}

程序不执行是因为你打印了一个没有定义的变量。
for循环定义的x变量,只有在for循环内部可以使用。叫做局部变量。
而你最后打印的那个x是所属于类的成员变量。这个变量,你并没有定义。
也就是说你打印了一个没有定义的变量,所以程序出错。
作者: 恨死我了    时间: 2013-12-20 09:12
for循环里的x是局部变量,在执行完for语句后,内存中的x变量就会消除,第二句System.out.println(x)定义的是成员变量,在main方法中没有定义,所以不会编译成功。
作者: 张天昊76    时间: 2013-12-20 10:30
这就是局部变量的使用范围问题了。




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