为什么倒置的if语句是错误的?

时间:2018-02-22 20:47:56

标签: java if-statement inversion or-condition

为什么if语句计为false?

int money = -342;
int reviews 3;

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

钱是假的,
两个评论都是真实的 并将它们反转为真实的货币,
这两篇评论都有两个谬误 因为我正在使用||对于'或',一个真实应该足以使整个陈述变为真实。

10 个答案:

答案 0 :(得分:1)

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

  1. Money必须大于0
  2. Reviews必须介于0到5之间(含)
  3. 这个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");
    }
    

答案 1 :(得分:0)

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

答案 2 :(得分:0)

括号优先。

看一下条件:

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

首先,评估内括号内的部分:

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

然后,顺序是从左到右:

  • money > 0是假的,继续下一个;
  • reviews < 5为真,因此内括号中的表达式为真。

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

我建议你学习表达式评估和操作符优先级的基础知识。另外,as pointed out by Ted Hopp,您需要重新考虑您的逻辑。例如,我会将!(money > 0)等表达式重写为money <= 0,以简化它。在我看来,最好不要将否定运算符(!)与关系运算符(如<==)结合使用,除非你绝对必须这样做。 / em>的

Note

  

&amp;&amp;和||运算符对两个布尔表达式执行条件AND和条件OR运算。这些操作员表现出短路&#34;行为,这意味着仅在需要时才评估第二个操作数。

答案 3 :(得分:0)

if (!(Money > 0)){...} - 它表示由于Money整数低于0而出现问题。 - 不,它表示它低于或等于0。

(Money > 0 || Reviews < 5 || Reviews > 0) - true如果{strong>至少 ||之间的某个部分为true,则为!(Money > 0 || Reviews < 5 || Reviews > 0),但是:

false - ||如果至少 true之间的某个部分为!,则为SELECT CurrentPupil.SchoolID AS 'SchoolID', CurrentPupil.PupilID AS 'PupilID', PupilPersonalDetails.Surname AS 'Surname', PupilPersonalDetails.Forename AS 'First_Name', PupilCurrentSchoolYearGroupLookupDetails.Description AS 'Year_Group' FROM CurrentPupil LEFT OUTER JOIN PupilPersonalDetails AS PupilPersonalDetails ON CurrentPupil.SchoolID = PupilPersonalDetails.SchoolID AND CurrentPupil.PupilID = PupilPersonalDetails.PupilID LEFT OUTER JOIN PupilCurrentSchool AS PupilCurrentSchool ON CurrentPupil.SchoolID = PupilCurrentSchool.SchoolID AND CurrentPupil.PupilID = PupilCurrentSchool.PupilID LEFT OUTER JOIN LookupDetails AS PupilCurrentSchoolYearGroupLookupDetails ON PupilCurrentSchoolYearGroupLookupDetails.LookupDetailsID = PupilCurrentSchool.YearGroup AND PupilCurrentSchoolYearGroupLookupDetails.LookupID = '3004' AND PupilPersonalDetails.PupilID INNER JOIN [win2k12sql].USERFILE.dbo.pupil ON PupilID = user_file_userid WHERE ('%wc%' = '%wc%') 。你会得到与[Route("{id}", Name = "GetById")] [HttpGet] [ProducesResponseType(typeof(SomeType), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(string), (int)HttpStatusCode.Unauthorized)] [ProducesResponseType(typeof(string), (int)HttpStatusCode.Forbidden)] [ProducesResponseType(typeof(string), (int)HttpStatusCode.BadRequest)] [ProducesResponseType(typeof(string), (int)HttpStatusCode.ServiceUnavailable)] public async Task<IActionResult> Get(string id, bool? includeNonActive = false) { // some stuff } (否定)相反的结果。

答案 4 :(得分:0)

为什么你的价值是假的

钱少于零。那是false

评论小于5.即true

然后短路,但如果你继续,评论大于0.那就是true

无论如何,括号中的整个语句因为一个或运算符的工作方式而评估为true。然后你反转它,所以变成false

解决方案?

老实说,似乎你想要的是检查金钱是否大于0,评论小于5且评论大于0。

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

答案 5 :(得分:0)

!(Money > 0) == (Money <= 0)

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

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

答案 6 :(得分:0)

多数民众赞成,因为它令Reviews < 5Reviews > 0满意。 因此,if (!(Money > 0 || Reviews < 5 || Reviews > 0))中的if语句将为false,因为您使用的是 not operator 。请说明打印我们好的的原因。

答案 7 :(得分:0)

嗯。等我已经这样做了几年了,我很确定“!”也适用于“||”从而使它成为“&amp;&amp;”这意味着它总是错误的。

答案 8 :(得分: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&gt; 0 ||评论&lt; 5 ||评论&gt; 0)

 1. Money   > 0      -356 > 0           **False**  
 2. Reviews < 5       4.8 < 5           **True**
 3. Reviews > 0       4.8 > 0           **True**

现在我们可以看到内部条件评估为真但如果你注意到有(逻辑上没有)&#34; ! &#34; 运营商在外面添加。

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

被称为逻辑非运算符。用于反转其逻辑状态   操作数。如果条件为真,则Logical NOT运算符将生成   假的。

因此,当你的内在条件为真时,逻辑不是使其成为假。

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

答案 9 :(得分:-1)

因为以下内容:

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

评估为

if (!(True))

因此,倒置,

if (False)