为什么 if 语句算作假?
int money = -342;
int reviews 3;
if (!(money > 0 || reviews < 5 || reviews > 0)){}
金钱是假
的,两个评论都是真实的
,并且将它们反转结果与金钱为真,两个评论
为两个错误。
当我使用 || 对于“或”,一个真应该足以使整个陈述变为真。
为什么 if 语句算作假?
int money = -342;
int reviews 3;
if (!(money > 0 || reviews < 5 || reviews > 0)){}
金钱是假
的,两个评论都是真实的
,并且将它们反转结果与金钱为真,两个评论
为两个错误。
当我使用 || 对于“或”,一个真应该足以使整个陈述变为真。
您的if
测试总是评估为,false
因为无论 , 或将是 true 的值如何Reviews
,Reviews < 5
然后Reviews > 0
您否定结果。(的值Money
无关紧要,因为如果任一操作数为 ,则||
计算结果。)我认为您想要的是使这三个为真:true
true
Money
必须大于 0Reviews
必须介于 0 和 5(含)之间这个if
测试将完成这项工作:
if (Money <= 0 || Reviews > 5 || Reviews < 0) {
System.out.println("Something went wrong");
} else {
System.out.println("We're good");
}
或者,您可以测试阳性条件:
if (Money > 0 && Reviews >= 0 && Reviews <= 5) {
System.out.println("We're good");
} else {
System.out.println("Something went wrong");
}
否定符号是对整个语句的否定。因此,如果这些条件中的任何一个为真,则返回假。如果所有条件都为假,则返回真。
因为以下:
if (!(Money > 0 || Reviews < 5 || Reviews > 0))
评估为
if (!(True))
因此,倒置,
if (False)
if (!(Money > 0)){...}
-它说出现问题,因为 Money 整数低于 0。 - 不,它说它低于或等于 0。
(Money > 0 || Reviews < 5 || Reviews > 0)
- 这是true
如果之间的至少一个部分||
是true
,但是:
!(Money > 0 || Reviews < 5 || Reviews > 0)
- 这是false
如果之间的至少一个部分||
是true
。!
使用(negation)会得到相反的结果。
为什么你的价值是假的
钱小于零。那就是false
。
评论少于 5 条。即true
。
然后它会短路,但如果您继续,Reviews 大于 0。即true
.
无论如何,由于 or 运算符的工作方式,括号中的整个语句的计算结果为 true。然后你把它反转,所以它变成false
.
一个解法?
老实说,你想要的似乎是一张钱大于 0、评论小于 5 和评论大于 0 的支票。
这意味着您可能应该拥有类似money > 0 && reviews <= 5 && reviews >= 0
. 我认为这里的评论类似于 0-5 星范围。显然,如果是 1 到 5,那就不同了。
!(Money > 0) == (Money <= 0)
!(Money > 0 || Reviews < 5 || Reviews > 0) == (Money <= 0 && Reviews >= 5 && Reviews <= 0)
最好不要使用!在整个声明之前。
括号优先。
看一下条件:
(!(money > 0 || reviews < 5 || reviews > 0))
首先,评估内括号内的部分:
money > 0 || reviews < 5 || reviews > 0
然后,顺序是从左到右:
money > 0
为假,继续下一步;reviews < 5
为真,因此内括号中的表达式为真。内括号内的表达式计算结果为true
,因此有效地您的条件等于!(true)
并且使得(false)
。
我建议您学习表达式评估和运算符优先级的基础知识。此外,正如 Ted Hopp 所指出的,您需要重新考虑您的逻辑。例如,我会重写类似!(money > 0)
to的表达式money <= 0
来简化它。在我看来,最好不要将否定运算符 ( !
) 与关系运算符 (如<
or ==
) 结合使用,除非您绝对必须这样做。
注意:
&& 和 || 运算符对两个布尔表达式执行条件与和条件或运算。这些运算符表现出“短路”行为,这意味着仅在需要时才评估第二个操作数。
那是因为它满足Reviews < 5
和Reviews > 0
真实。因此, if 语句if (!(Money > 0 || Reviews < 5 || Reviews > 0))
将是错误的,因为您使用的是not 运算符。这就是它打印 We´re good 的原因。
嗯。等等,我已经这样做了几年了,我很确定“!” 也适用于“||” 因此使其成为“&&”意味着它永远是错误的。
让我们逐步了解您的代码条件:
int Money = -356;
double Reviews = 4.8;
if (!(Money > 0 || Reviews < 5 || Reviews > 0)) {
System.out.println("Something went wrong");
} else{
System.out.println("We´re good");
}
给定:
让我们首先打破并评估内部 if 条件: (Money > 0 || Reviews < 5 || Reviews > 0)
1. Money > 0 -356 > 0 **False**
2. Reviews < 5 4.8 < 5 **True**
3. Reviews > 0 4.8 > 0 **True**
现在我们可以看到内部条件评估 True 但如果您注意到有一个(逻辑非)“!” 在外部添加了运算符。
(!(Money > 0 || Reviews < 5 || Reviews > 0))
称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑非运算符将为假。
因此,当您的内在条件为真时,逻辑不!使它为假。
所以, System.out.println("We´re good");
被执行。