如何将此嵌套三元 if-else 示例转换为 if-else 循环

How to convert this example of nested ternary if-else to if-else loop

如何将这个嵌套三元构造函数示例转换为 if-else 循环。我是一个初学者,对我来说很复杂。

    int bill = 2000;
    int qty = 10;
    int days = 10;
    int discount = (bill > 1000)? (qty > 11)? 10 : days > 9? 20 : 30 : 5;
    System.out.println(discount);

TL;DR: 请参阅最后一个代码块以获取问题的答案。


首先,if-else 语句不是“循环”。
forwhiledo-while 是循环。
if 是条件语句。

? : 三元条件运算符的运算符优先级非常低,您很少需要为这 3 个部分使用括号,除非您嵌入了赋值运算符。例如。 (bill > 1000) ? 30 : 5 是不必要的,bill > 1000 ? 30 : 5 意味着同样的事情。

此外,为了便于阅读,始终在运算符周围使用空格。
A? B : C 是错误的。应该是 A ? B : C.

现在,由于三元运算符是右结合的,嵌套时不需要括号,即
A ? B ? C : D : E 表示 A ? (B ? C : D) : E
A ? B : C ? D : E 表示 A ? B : (C ? D : E)
嵌套的 ? : 运算符保持不变。

不需要括号,但是请记住这一点。 A ? B : (C ? D : (E ? F : G)) 就像一个 if-elseif-elseif-else 语句,所以下面是等价的:

// single line
x = A ? B : C ? D : E ? F : G;

// wrapped for readability, to show structure
x = A ? B :
    C ? D :
    E ? F : G;

// using if statement
if (A) {
    x = B
} else if (C) {
    x = D
} else if (E) {
    x = F
} else {
    x = G
}

如果使用足够的 wrapping/indentation,则不需要括号来阐明三元运算符。

相比之下,A ? (B ? C : D) : E 是一个嵌套的 if 语句,所以应该有括号来说明:

// single line
x = A ? B ? C : D : E;

// wrapped for readability, to show structure
x = A ? (B ? C
           : D)
      : E;

// using if statement
if (A) {
    if (B) {
        x = C
    } else {
        x = D
    }
} else
    x = E
}

好了,长话短说。来看问题代码:

// from question
int discount = (bill > 1000)? (qty > 11)? 10 : days > 9? 20 : 30 : 5;

// normalized to have parenthesis only around nested operators
int discount = bill > 1000 ? (qty > 11 ? 10 : (days > 9 ? 20 : 30)) : 5;

// refactored for better structure (using only tail-nesting)
int discount = bill <= 1000 ? 5 : (qty > 11 ? 10 : (days > 9 ? 20 : 30));

// wrapped for readability
int discount = bill <= 1000 ? 5 :
               qty > 11 ? 10 :
               days > 9 ? 20 : 30;

// using if statement
int discount;
if (bill <= 1000) {
    discount = 5;
} else if (qty > 11) {
    discount = 10;
} else if (days > 9) {
    discount = 20;
} else {
    discount = 30;
}