-3

为什么 if 语句算作假?

int money = -342;
int reviews 3;

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

金钱是假
的,两个评论都是真实的
,并且将它们反转结果与金钱为真,两个评论
为两个错误。
当我使用 || 对于“或”,一个真应该足以使整个陈述变为真。

4

10 回答 10

1

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

  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");
}
于 2018-02-22T21:08:45.023 回答
0

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

于 2018-02-22T20:50:17.460 回答
0

因为以下:

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

评估为

if (!(True))

因此,倒置,

if (False)
于 2018-02-22T20:51:23.607 回答
0

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

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

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

于 2018-02-22T20:53:48.010 回答
0

为什么你的价值是假的

钱小于零。那就是false

评论少于 5 条。即true

然后它会短路,但如果您继续,Reviews 大于 0。即true.

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

一个解法?

老实说,你想要的似乎是一张钱大于 0、评论小于 5 和评论大于 0 的支票。

这意味着您可能应该拥有类似money > 0 && reviews <= 5 && reviews >= 0. 我认为这里的评论类似于 0-5 星范围。显然,如果是 1 到 5,那就不同了。

于 2018-02-22T20:54:33.990 回答
0
!(Money > 0) == (Money <= 0)

!(Money > 0 || Reviews < 5 || Reviews > 0) == (Money <= 0 && Reviews >= 5 && Reviews <= 0)

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

于 2018-02-22T20:55:39.427 回答
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 ==) 结合使用,除非您绝对必须这样做。


注意

&& 和 || 运算符对两个布尔表达式执行条件与和条件或运算。这些运算符表现出“短路”行为,这意味着仅在需要时才评估第二个操作数。

于 2018-02-22T20:52:55.080 回答
0

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

于 2018-02-22T20:56:24.893 回答
0

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

于 2018-02-22T20:59:03.353 回答
0

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

    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

让我们首先打破并评估内部 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");被执行。

于 2018-02-22T21:09:59.907 回答