区别!(a==b) 和 a!=b

Difference between !(a==b) and a!=b

提问人:pragmatrick 提问时间:8/24/2020 最后编辑:pragmatrick 更新时间:12/1/2020 访问量:818

问:

上周在高中时,我的IT老师给了我们一个程序,她写的一个部分让我很感兴趣。 在 if 语句中,她检查数组的元素是否不为 null,因此程序可以继续处理该元素,因此她写道: ,这让我感到困惑,因为使用这种方法,您只是更多地使用括号,这使得它不那么容易阅读。我把它改成了,它工作得很好。但现在我很困惑,因为作为一名老师,我认为你对你的学科了解很多,所以她使用她的方法而不是我的方法有充分的理由吗?有什么我不知道的细节吗?if (!(array[i] == null)ìf (array[i] != null)

java if 语句 比较 相等

评论

8赞 Andy Turner 8/24/2020
绝对没有理由写前者。
0赞 deHaar 8/24/2020
表达式是等效的,所以只需选择更容易阅读的表达式......并确保在您的代码/项目中保持一致。在单个项目中交替使用类似的东西可能会导致错误。
0赞 dbl 8/24/2020
这一切都与可读性有关。有些团队更喜欢使用,而另一些团队则会选择!=!...==
0赞 khelwood 8/24/2020
在 Java 中是等价的,因为 Java 没有提供任何方法来改变这些运算符的默认值行为。(a!=b)!(a==b)
2赞 khelwood 8/24/2020
当一个人有很多经验时,他们有很多机会从许多不同的语言中学到很多怪癖和习惯。人们通常以适合自己的方式编写代码,并不意味着它对你更好。

答:

4赞 Mureinik 8/24/2020 #1

在 Java 中,和 之间没有区别。选择后一种形式是一种风格选择,老实说,大多数静态分析工具/IDE 都会对此发出警告。a!=b!(a==b)

16赞 Andy Turner 8/24/2020 #2

这两个表达式的语义没有区别。我想说没有充分的理由写前者。

但现在我很困惑,因为作为一名老师,我认为你对你的学科了解很多,所以她使用她的方法而不是我的方法有充分的理由吗?

最好的办法是问你的老师。关于教师——作为人——要记住的最重要的事情是,他们有经验、偏见并且容易犯错。

换句话说,她过去可能被一些问题咬了一口,而这些问题通过这样写来解决——问她这件事,你可能会学到一些东西。

或者,她可能认为这样更好,并且无法表达出比个人偏好更强的好处;或者这就是她学习的方式,并且没有看到改变的强烈需求——你从中学到了一些东西,因为有不止一种方法可以表达相同的语义。

(我有强烈的偏好,因为它更整洁 - 更少的括号;如果你不打算使用它,为什么语言设计师会费心提供 - 但这些是我个人的偏好)。!=!=

或者,她可能打算使用 ,却忘了回去修复它。很容易忘记清理东西。!=

评论

2赞 Steyrix 8/24/2020
很好的答案。我想补充一点,老师们往往会把例子说得更清楚。我假设在教授布尔代数的情况下,将 != 条件解释为 !(==) 对一些学生来说,也许这就是写后者的原因
-1赞 Hasan Seam 8/24/2020 #3

实际上,如果(!(array[i] == null) 和 ìf (array[i] != null)

在这种情况下,我们可以想象一个场景。假设 array[i] 不为 null,那么对于 if(!(false)) ,最终 !(false) 将为 true。

对于第二个表达式,返回结果将直接为 true。

因此,始终建议使用 seconnd 表达式。

评论

0赞 dbl 8/24/2020
这是!Cparta :)
3赞 huntgang99 8/24/2020 #4

您的老师正在使用其他方式编写 if 语句。

你写不写并不重要

if(array[i] != null)

if(!(array[i] == null))

因为在大多数编程语言中定义为不。在这种情况下,他们俩是平等的。!

总之,您可以选择任何您喜欢的风格。

希望您理解并祝您好运!

当你想知道一些事情时,一定要问你的老师:)

3赞 m02ph3u5 8/24/2020 #5

其他答案是正确的。对于您的示例,没有区别 - 选择您最喜欢的。但我想给出更多的理由来选择一种方式而不是其他方式。

我的建议是一般不要这样做,因为:if (! (...))

  • 大多数人不会这样做。您必须阅读和理解其他人编写的代码,其他人也必须阅读和理解您的代码。像这样的怪癖会大大降低可编辑性,同事会对你不屑一顾。
  • 某些项目可能遵循不允许这样做的编码标准。
  • 想想执行。对于更复杂的语句,不同的样式可能会产生影响。想想 vs .在前者中,可能会发生必须对 A-D 进行计算,然后将生成的布尔值翻转,在后者中,可能足以看到计算结果为 false,并且您已经可以停在那里(因为与成员的任何连接都将是)。!(A || B || C || D)!A && !B && !C && !D!Afalsefalse
  • 但也要再考虑可读性。实际上,掌握写作可能比掌握 .NOT(is_a_digit OR is_a_letter OR is_a_dot)NOT(is_a_digit) AND NOT(is_a_letter) AND NOT(is_a_dot)
  • 话虽如此,了解尤达风格的写作也很好,这有点相关。想象一下,它可能包含一个字符串,或者可能是 .现在想象一下,您想检查它是否等于: - 哎呀,这可能会产生一个 NPE,因为当为 null 时,没有方法可以调用它。相反,你必须做或尤达的方式.还有其他帮手,比如.String someString;null"some specific string"someString.equals("some specific string")someStringequalssomeString != null && someString.equals("...")"some specific string".equals(someString)Objects.equals()

有时额外的括号可以使事情更容易掌握,有时则不然。

虽然我不同意“没有愚蠢的问题”,但我想说的是,有时问一个愚蠢的问题比在课堂上落后要好,因为有些东西在你身上唠叨,或者你错过了一些重要的部分。在这种情况下,我认为这是个好问题(除非她只是告诉你为什么)。

-2赞 Aroo 9/10/2020 #6

前者在 python 等某些语言中不是一个好主意, 在 python 中,对于前者来说,更好的方法是

if not something==somethingElse

虽然后者是完美的,if something != somethingElse

因此,学习前者可能会让你在某些情况下遇到错误非常微妙的情况,以至于调试变得非常困难,尤其是当你在循环中使用这个条件时while

-2赞 Dubstep 9/15/2020 #7

!=比 更有效。我在 python 中进行了测试,它不言自明。!()


(not a and not b and not c and not d) 10.07692837715149 

(not (a and b and c and d)) 11.208963394165039

0赞 Hxdfgs 9/15/2020 #8

和 之间是有区别的,这取决于个人喜好和你使用的代码。正如其他答案所说,在 python 中更快。a!=b!(a==b)a!=b