如何在Java中的if语句中为变量赋值

时间:2010-08-29 10:53:16

标签: java

我需要做这样的事情,

if (first_var > second_var)
  int difference = first_var - second_var;
if (first_var < second_var)
  int difference = second_var - first_var;

当我尝试编译时,会出现错误,说明变量“差异”可能尚未初始化。使变量“差异”全局也无济于事。

7 个答案:

答案 0 :(得分:25)

您需要了解的问题包括:

  • 变量范围
  • 阻止声明以及如何创建新范围
  • 为什么您更愿意使用{...}阻止if语句
  • 如何保证明确作业
  • 何时使用if-else代替if (something) {...} if (!something) {...}

顺便说一下,找到两个值差异的惯用方法是:

int difference = Math.abs(firstVar - secondVar);

请注意Math.abs有一个极端情况:当参数为Integer.MIN_VALUE时,返回的值为Integer.MIN_VALUE。那是因为-Integer.MIN_VALUE == Integer.MIN_VALUE。这里的问题是数字的32位二进制补码表示。

参考


尝试#1:在if

之前声明

以下是通过在if

之前声明变量来尝试修复代码段的尝试
int difference;
if (first_var > second_var) {
  difference = first_var - second_var;
}
if (first_var < second_var) {
  difference = second_var - first_var;
}

// note: difference is not definitely assigned here!
//           (but at least it's in scope!)

我们现在遇到明确分配的问题:如果first_var == second_var,变量difference仍未分配值。


尝试#2:在声明

处初始化

这是第二次尝试:

int difference = 0;
if (first_var > second_var) {
  difference = first_var - second_var;
}
if (first_var < second_var) {
  difference = second_var - first_var;
}

// note: difference is in scope here, and definitely assigned

初学者倾向于这样做,但是这排除了使difference成为final局部变量的可能性,因为它可能被赋值两次。


尝试#3:if-else

这是一个更好的尝试:

final int difference;
if (first_var > second_var) {
  difference = first_var - second_var;
} else {
  difference = second_var - first_var;
}

// note: difference is in scope, and is definitely assigned here,
//       (and declared final)

仍有办法改善这一点。


尝试#4:三元/条件运算符

一旦您对语言和编程感到满意,您可以使用以下习语:

final int difference = (first_var > second_var) ? first_var - second_var
                                                : second_var - first_var;

这使用?:三元/条件运算符。小心这个操作员;它有一些可能令人惊讶的行为,它肯定会被滥用。小心谨慎,谨慎使用。

参考

答案 1 :(得分:3)

您有两种选择:

  1. 使用三元运算符在一行上执行条件?:

    int difference = first_var > second_var ? first_var - second_var : second_var - first_var;
    
  2. 预先声明变量,然后执行条件。

    int difference = 0;
    if (first_var > second_var)
      difference = first_var - second_var;
    if (first_var < second_var)
      difference = second_var - first_var;
    

答案 2 :(得分:3)

您只能在一个地方声明变量。

基本解决方案是

int difference;
if (first_var > second_var)
  difference = first_var - second_var;
if (first_var < second_var)
  difference = second_var - first_var;

但是在这种情况下,您可以使用内联?:运算符

int difference = (first_var > second_var) ? 
  first_var - second_var : second_var - first_var;

答案 3 :(得分:3)

这是因为变量可能确实没有被初始化。实际上,如果first_varsecond_var彼此相等,则不会初始化。除此之外,即使您添加了第三个if,编译器也可能不够聪明。将声明移到if之外,并将其初始化为该行的值。

int difference = 0;
if (first_var > second_var)
    difference = first_var - second_var;
if (first_var < second_var)
    difference = second_var - first_var;

但是,我只是做

int difference = Math.abs(first_var - second_var);

答案 4 :(得分:1)

首先,您必须在ifs语句之外定义巡视变量“difference”:

int difference;
if (first_var > second_var)
    difference = first_var - second_var;
if (first_var < second_var)
    difference = second_var - first_var;

然后,一旦执行了ifs语句,编译器就无法确定您的变量是否具有值。例如,如果first_var和second_var具有相同的值,则不会分配差异。因此,如果您尝试使用变量,则会出现编译时错误。

要解决此问题,您有两种解决方案:

第一个解决方案是给你的变量一个默认值,如果没有其他条件完成,将使用该值:

int difference = 0;
if (first_var > second_var)
    difference = first_var - second_var;
if (first_var < second_var)
    difference = second_var - first_var;

另一种解决方案是使用else if语句。当使用else if语句时,编译器能够确定是否在所有情况下分配您的变量:

int difference;
if (first_var > second_var) {
    difference = first_var - second_var;
} else if (first_var < second_var) {
    difference = second_var - first_var;
} else {
    difference = 0;
}

答案 5 :(得分:0)

您确实可以在if语句中分配变量,但不能在if语句中初始化它。用简单的英语,您可以在if语句中为变量赋值,但不能在if语句中创建变量。原因是因为如果永远不满足if条件,if语句中的代码可能永远不会运行。

以下是我编写该代码的方法:

int difference = 0;

if (first_var > second_var)
   difference = first_var - second_var;
else if (first_var < second_var)
   difference = second_var - first_var;

答案 6 :(得分:0)

它可能未被初始化的原因是你考虑了A&lt; B,B&lt; A,但不是A == B.考虑到这一点:

if (first_var > second_var)
  int difference = first_var - second_var;
if (first_var < second_var)
  int difference = second_var - first_var;
if (first_var == second_var)
  int difference = 0;