【问题标题】:purpose of multiple else/if statements? NOT single if then else statement多个 else/if 语句的目的?不是单一的 if then else 语句
【发布时间】:2018-03-31 15:01:23
【问题描述】:

我只是想知道写 else if 是否有任何目的,或者这是否纯粹是为了更好的代码可读性而编写的。例如,这段代码取自 oracle java 教程:

class IfElseDemo {
public static void main(String[] args) {

    int testscore = 76;
    char grade;

    if (testscore >= 90) {
        grade = 'A';
    } else if (testscore >= 80) {
        grade = 'B';
    } else if (testscore >= 70) {
        grade = 'C';
    } else if (testscore >= 60) {
        grade = 'D';
    } else {
        grade = 'F';
    }
    System.out.println("Grade = " + grade);
}
}

确定用 just if 来写“else if”部分会做同样的事情吗?如果有人可以帮助向我解释这一点,我将不胜感激。谢谢

【问题讨论】:

  • 试试看。
  • 啊。在这种情况下,我可以看到为什么它不起作用,因为 76 大于所有高于 D 的值,但肯定有一些场景不需要 else/if?
  • 这是另一个练习:删除else 语句,并计算出修复testscore 的任何输入值的输出需要什么。

标签: java if-statement logic operand


【解决方案1】:

这主要与性能有关,但也与您想要表达的内容有关!想象一下,testscore >= 90,那么等级变量将设置为“A”,并且不会评估其他 if 语句。

重写代码

class IfElseDemo {
  public static void main(String[] args) {

  int testscore = 76;
  char grade;

  if (testscore >= 90) {
    grade = 'A';
  } 
  if (testscore >= 80) {
    grade = 'B';
  }
  if (testscore >= 70) {
    grade = 'C';
  } 
  if (testscore >= 60) {
    grade = 'D';
  } else {
    grade = 'F';
  }
  System.out.println("Grade = " + grade);
  }
}

还会检查测试分数是否 >= 80 并将等级设置为“B”,然后检查 >= 70 并将其设置为“C”等...

因此,在您的示例中,您不仅会得到错误的结果,还会进行更多检查!

【讨论】:

    【解决方案2】:

    正如@schneida 已经提到的else if 跳过条件检查,如果先前的条件已经为真。如果条件在 if 情况下发生更改,那么跳过以下条件检查至关重要:

    if (value > 100)
    { 
        value *= 2.0; // get some big bonus
    } 
    else if (value > 50)
    {
        value *= 1.5;
    }
    

    【讨论】:

      【解决方案3】:

      假设 testScore 是 93。 使用上面提到的代码,输出将是

      等级 = A

      但是如果将“else if”替换为“if”,它将执行所有if语句,因为哪个等级首先设置为A,然后设置为B,然后设置为C,最后将设置为 D。 所以最终答案是Grade = D 希望能帮助你理解。

      【讨论】:

        【解决方案4】:

        您可以完全消除 ifelse if 分支。加载一个Map<Integer, Character>,其值涵盖十进制等级范围(0-10 作为 F-A)。然后将给定的测试分数除以10 以确定正确的成绩。喜欢,

        Map<Integer, Character> map = new HashMap<>();
        for (int i = 0 ; i < 6 ;i++) {
            map.put(i, 'F');
        }
        map.put(6, 'D');
        map.put(7, 'C');
        map.put(8, 'B');
        map.put(9, 'A');
        map.put(10, 'A');
        
        for (int testscore = 100; testscore >= 0; testscore--) {
            int v = (int) (testscore / 10.0);
            System.out.printf("%d %c%n", testscore, map.get(v));
        }
        

        输出所有可能的分数及其结果,不带任何if(s)。

        【讨论】:

          最近更新 更多