初始化变量Java
我正在写一个简单的程序,带有do-while循环和开关,cna接受一个数学运算并对给定的2个数字执行它 我的问题是,为什么要在开始时将操作产生的结果初始化为零 如果我不使ans=0,它会给我错误。如果不满足给定的条件,一些代码部分就不会执行,我不需要“ans”初始化变量Java,java,initialization,Java,Initialization,我正在写一个简单的程序,带有do-while循环和开关,cna接受一个数学运算并对给定的2个数字执行它 我的问题是,为什么要在开始时将操作产生的结果初始化为零 如果我不使ans=0,它会给我错误。如果不满足给定的条件,一些代码部分就不会执行,我不需要“ans” q3包; 导入java.util.Scanner; 公开课Q3{ 公共静态void main(字符串[]args){ 扫描仪输入=新扫描仪(System.in); 字符算子; float no1,no2,ans=0;//这是因为如果没有一
q3包;
导入java.util.Scanner;
公开课Q3{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
字符算子;
float no1,no2,ans=0;//这是因为如果没有一个case的计算结果为true,则不会设置ans
的值。因此不能使用它
您可以通过添加一个默认值
大小写,并将ans
的值设置为0来克服这个问题。您应该初始化ans=0;
因为您没有ans
的默认值,因此需要初始化它。
但是,如果添加default值,则不需要像这样初始化它:
...
case '-':
ans = no1 - no2;
break;
default :
ans = someValue;
break;
嗯,可能是没有一个case语句适用,因此,ans
仍然会被取消初始化。由于局部变量在使用之前必须进行初始化,因此会出现此错误。Java要求在使用所有局部变量之前对其进行初始化
在打印行中,您读取了abs
的值,但并不是所有的控制路径都为其设置了值。(即使您认为您已经涵盖了开关的所有可能性,但考虑到外部if
,编译器将不会这样看:其他线程可能会修改运算符
)
因此,您的IDE/编译器建议您在声明时对其进行初始化。如果您没有对其进行初始化,那么首先会有一个垃圾值
不必对其进行初始化
但是,如果您对程序进行初始化,它将是一个更好的程序。为什么?请重新表述您的问题,使其更有意义。。就Java编译器所能确定的而言,您的switch语句中的所有情况都可能不匹配,并且不会分配ans
。您可能知道这是不可能的,但编译器确实这样做了不知道。如果给定的条件没有满足,这不允许开关或任何其他代码执行,那么初始化有什么意义呢?@laish129是的,但是java编译器无法理解所有这些事情,因为它是在if
构造中,它可能会计算,也可能不会计算!所以我应该在开关中使用默认情况吗?我不会但是如果我去掉if,no1和no2的值就必须被赋值,因为不需要做任何操作。?!是的。你在重新设计时遇到了困难。你应该建立一个函数来计算操作符的算术。这个函数将替换if
。这样你就知道你需要多少参数了。T当你能够区分否定和减法,并且可以处理诸如“代码> 1×1”< /> >的表达式时,表达式分析器往往会变得更复杂。这都是为了将来的需求而设计。这对于C/C++,而不是java是正确的。在C++和C++中,读取未初始化值的行为是未定义的。Java,这样的构造在编译时必须失败。
...
case '-':
ans = no1 - no2;
break;
default :
ans = someValue;
break;