如何将此嵌套三元 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
语句不是“循环”。
for
、while
和 do-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;
}
如何将这个嵌套三元构造函数示例转换为 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
语句不是“循环”。
for
、while
和 do-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;
}