为什么倒置的 if 语句为假?

Why is the inverted if-statement false?

为什么 if 语句算作假?

int money = -342;
int reviews 3;

if (!(money > 0 || reviews < 5 || reviews > 0)){}

钱是假的,
两条评论都是真实的
并反转它们的结果是物有所值,
两个评论都有两个错误。
因为我正在使用 ||对于'or',一个真应该足以使整个语句变为真。

否定符号否定整个语句。因此,如果这些条件中的任何一个为真,则返回假。如果所有条件都为假,则返回真。

因为以下原因:

if (!(Money > 0 || Reviews < 5 || Reviews > 0))

评估为

if (!(True))

因此,反转,

if (False)

括号优先。

看看条件:

(!(money > 0 || reviews < 5 || reviews > 0))

首先计算括号内的部分:

money > 0 || reviews < 5 || reviews > 0

那么,顺序是从左到右:

  • money > 0为假,继续下一步;
  • reviews < 5为真,所以括号内的表达式为真。

内部括号内的表达式的计算结果为 true,因此实际上您的条件等于 !(true),这使得 (false).

我建议你学习表达式求值和运算符优先级的基础知识。另外,,你需要重新思考你的逻辑。例如,我会将 !(money > 0) 等表达式重写为 money <= 0,以简化它。在我看来,除非万不得已,否则最好不要将否定运算符 (!) 与关系运算符(如 <==)结合使用。


Note:

The && and || operators perform Conditional-AND and Conditional-OR operations on two boolean expressions. These operators exhibit "short-circuiting" behavior, which means that the second operand is evaluated only if needed.

if (!(Money > 0)){...} - 它说出现问题,因为货币整数低于 0。 - 不,它说它低于 或等于 0 .

(Money > 0 || Reviews < 5 || Reviews > 0) - 这是 true 如果 至少 || 之间的部分之一是 true,但是:

!(Money > 0 || Reviews < 5 || Reviews > 0) - 这是 false 如果 至少 || 之间的部分之一是 true。使用 !(否定)会得到相反的结果。

为什么你的值是假的

钱少于零。即false

评论少于5。即true

然后short-circuits,但如果继续,Reviews 大于0。即true

无论如何,由于 or 运算符的工作方式,括号中的整个语句的计算结果为真。然后你反转它,所以它变成 false.

有解决办法吗?

老实说,你要的好像是money大于0,reviews小于5,reviews大于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)

最好不要用!在整个声明之前。

那是因为它满足 Reviews < 5Reviews > 0 为真。 因此 if (!(Money > 0 || Reviews < 5 || Reviews > 0)) 中的 if 语句将为假,因为您使用的是 而不是运算符 。这就是它打印 We´re good 的原因。

嗯。等等,我已经这样做了几年了,我很确定“!”也适用于“||”因此使它成为“&&”意味着它永远是假的。

您的 if 测试的计算结果始终为 false,因为无论 Reviews 的值如何,Reviews < 5Reviews > 0 都将为真,而您是然后否定结果。 (Money 的值无关紧要,因为如果任一操作数为 true|| 的计算结果为 true。)我认为您想要的是这三个为真:

  1. Money 必须大于 0
  2. Reviews 必须介于 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");
}

让我们逐步了解您的代码条件:

    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");
    }

给定:

  • 金钱=-356
  • 评论 = 4.8

Let's break and evaluate the inner if condition first: (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))

Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true then Logical NOT operator will make false.

因此,当你的内在条件为真时,逻辑非 ! 使它为假。

所以,System.out.println("We´re good");被执行了。