黑马程序员技术交流社区

标题: 关于if语句的问题 [打印本页]

作者: 严旭晟    时间: 2015-9-29 22:13
标题: 关于if语句的问题
关于if语句不加语句块而直接跟【声明语句】或【定义语句】。
  1. int a = 10;
  2. if( a > 5)
  3.   int x;
  4. 编译出错,为什么?
  5. 它的底层的原因是什么?
  6. 不要复制粘贴,Myeclipse的报错信息。
  7. 如果引用了其他资料,请给出该资料的原始链接。
复制代码



作者: kangyang    时间: 2015-9-29 22:13
我其是也不是很清楚,就知道局部变量必须初始化,但是为什么要初始化,我在网上搜了下貌似是跟底层虚拟机对于速度和安全性的考虑,所规定的。以下是大神的原话,可以参考一下。不过我觉得楼主这种刨根问底的精神值得发扬。
    局部变量运行时被分配在栈中,量大,生命周期短,如果虚拟机给每个局部变量都初始化一下,是一笔很大的开销,但变量不初始化为默认值就使用是不安全的。出于速度和安全性两个方面的综合考虑,解决方案就是虚拟机不初始化,但要求编写者一定要在使用前给变量赋值。
作者: 0.oo~Heart    时间: 2015-9-29 23:18
编译出错应该是if小括号后边没加分号
作者: 饰演自己    时间: 2015-9-30 00:55
严旭晟 发表于 2015-9-29 22:13
关于if语句不加语句块而直接跟【声明语句】或【定义语句】。

要初始化变量
作者: 饰演自己    时间: 2015-9-30 01:00
int x=0;初始化一下吧
作者: 肖天长    时间: 2015-9-30 08:04
局部变量x必须初始化  
作者: kangyang    时间: 2015-9-30 08:53
本帖最后由 kangyang 于 2015-9-30 08:55 编辑


帮你顶~~
作者: 穆帆    时间: 2015-9-30 09:04
1.局部变量X需要初始化。2.if后面的大括号必须加上
作者: kangyang    时间: 2015-9-30 09:48
穆帆 发表于 2015-9-30 09:04
1.局部变量X需要初始化。2.if后面的大括号必须加上

if后如果只跟一个语句是可以省略{}的
作者: kangyang    时间: 2015-9-30 09:50
0.oo~Heart 发表于 2015-9-29 23:18
编译出错应该是if小括号后边没加分号

if后如果只跟一个语句是不用加{}的
作者: 阿加斯冬季    时间: 2015-9-30 10:06
if语句后面只有一句执行语句的话,大括号可以省略,这个就不用说了。具体底层其实我也不太懂,我就是靠自己的瞎理解。我的理解是这样的:运行程序的顺序是,定义一个变量a为10,开始判断,如果a大于5的话,我们满足这个条件,那就继续运行,定义一个x。那定义x干嘛?x等于几?根本没有意义呀。这你让虚拟机如何给你搞,把这个x给你存在哪?因为这又是个局部变量,一出if语句,x就没有了,存等于没存。就跟for()语句里一样,如果你是int x而没有赋值的话,那如果你打for(x;x<10;x++)这就肯定是个错的了。
作者: snowimba    时间: 2015-9-30 11:45
显而易见,Java的机制和C语言还是有区别的,C语言允许不初始化变量,可是Java是不行的,要切记啊!
作者: 维维轩    时间: 2015-9-30 15:14
int x=0;要初始化吧
作者: meijunwei6275    时间: 2015-9-30 17:06
局部变量X需要初始化吧
作者: 严旭晟    时间: 2015-9-30 17:49
即使初始化了还是错误的,只不过两种错误的类型不一样而已。
作者: 严旭晟    时间: 2015-9-30 17:52
再者
  1. if(true)
  2.   new Person().show();
  3. 对于引用型变量,匿名的Person()对象此处即使,调用了show()方法,即该对象已经使用了
  4. 还是会报错。
复制代码

作者: Cloud丶    时间: 2015-9-30 19:49
首先如果只有这个语句是没有编译错误的,你可以不借助编写软件 在doc下直接运行
int a=10;
if(a>5)
int x;
是不会报错了
由于你没有给全代码 我可以做这个判断 你在后面是使用了X的 但是由于是if语句 X可能就没有被定义
而后面又用了X 这样就会导致报错 因为X没有定义
作者: Cloud丶    时间: 2015-9-30 19:50
无论a是否大于5  java是不会进行判断的 它只会去判断后文的X是否有可能没有被定义
作者: 卫博生    时间: 2015-10-1 08:33
好吧,在这里又学会了一点呢:”局部变量必须初始化“
作者: 认真的雪    时间: 2015-10-1 14:01
没有加花括号,int的值没有初始化
作者: 哐啷    时间: 2015-10-2 09:13
变量x就没定义 怎么使用
作者: 浩润2015    时间: 2015-10-2 11:02
int x;在if语句块里面,属于局部变量,需要初始化。。。
作者: yangxuqiang    时间: 2015-10-2 18:07
int x;为初始化
作者: Mona33    时间: 2015-10-2 21:28
如果if语句后面不加语句块,需要在if( a > 5)后面加";"
作者: 斯文阿昊    时间: 2015-10-2 21:29
初始化变量x试试
作者: 前进……    时间: 2015-10-2 23:48
x不用定义初始化值吗?
作者: Alex_zou83    时间: 2015-10-3 00:47
局部变量是运行时调用的,会出现在栈中.编译器为了确保运行时数据类型会不出错,会在编译时确认局部变量是否合法,如果局部变量没有初始化,编译器无法确认会抛出异常.
作者: ly631960324    时间: 2015-11-15 00:30
if语句中,如果没有加{},则默认紧接的后一句为其语句体,在for语句中出现的变量为局部变量,局部变量的出现必须是要有定义和初始化的动作,否则会报错
作者: 袁有福123    时间: 2015-11-17 19:34
因为if结构体不完整,后面少了一对大括号!




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