提问人:pragmatrick 提问时间:8/24/2020 最后编辑:pragmatrick 更新时间:12/1/2020 访问量:818
区别!(a==b) 和 a!=b
Difference between !(a==b) and a!=b
问:
上周在高中时,我的IT老师给了我们一个程序,她写的一个部分让我很感兴趣。
在 if 语句中,她检查数组的元素是否不为 null,因此程序可以继续处理该元素,因此她写道: ,这让我感到困惑,因为使用这种方法,您只是更多地使用括号,这使得它不那么容易阅读。我把它改成了,它工作得很好。但现在我很困惑,因为作为一名老师,我认为你对你的学科了解很多,所以她使用她的方法而不是我的方法有充分的理由吗?有什么我不知道的细节吗?if (!(array[i] == null)
ìf (array[i] != null)
答:
在 Java 中,和 之间没有区别。选择后一种形式是一种风格选择,老实说,大多数静态分析工具/IDE 都会对此发出警告。a!=b
!(a==b)
这两个表达式的语义没有区别。我想说没有充分的理由写前者。
但现在我很困惑,因为作为一名老师,我认为你对你的学科了解很多,所以她使用她的方法而不是我的方法有充分的理由吗?
最好的办法是问你的老师。关于教师——作为人——要记住的最重要的事情是,他们有经验、偏见并且容易犯错。
换句话说,她过去可能被一些问题咬了一口,而这些问题通过这样写来解决——问她这件事,你可能会学到一些东西。
或者,她可能认为这样更好,并且无法表达出比个人偏好更强的好处;或者这就是她学习的方式,并且没有看到改变的强烈需求——你从中学到了一些东西,因为有不止一种方法可以表达相同的语义。
(我有强烈的偏好,因为它更整洁 - 更少的括号;如果你不打算使用它,为什么语言设计师会费心提供 - 但这些是我个人的偏好)。!=
!=
或者,她可能打算使用 ,却忘了回去修复它。很容易忘记清理东西。!=
评论
实际上,如果(!(array[i] == null) 和 ìf (array[i] != null)
在这种情况下,我们可以想象一个场景。假设 array[i] 不为 null,那么对于 if(!(false)) ,最终 !(false) 将为 true。
对于第二个表达式,返回结果将直接为 true。
因此,始终建议使用 seconnd 表达式。
评论
您的老师正在使用其他方式编写 if 语句。
你写不写并不重要
if(array[i] != null)
或
if(!(array[i] == null))
因为在大多数编程语言中定义为不。在这种情况下,他们俩是平等的。!
总之,您可以选择任何您喜欢的风格。
希望您理解并祝您好运!
当你想知道一些事情时,一定要问你的老师:)
其他答案是正确的。对于您的示例,没有区别 - 选择您最喜欢的。但我想给出更多的理由来选择一种方式而不是其他方式。
我的建议是一般不要这样做,因为:if (! (...))
- 大多数人不会这样做。您必须阅读和理解其他人编写的代码,其他人也必须阅读和理解您的代码。像这样的怪癖会大大降低可编辑性,同事会对你不屑一顾。
- 某些项目可能遵循不允许这样做的编码标准。
- 想想执行。对于更复杂的语句,不同的样式可能会产生影响。想想 vs .在前者中,可能会发生必须对 A-D 进行计算,然后将生成的布尔值翻转,在后者中,可能足以看到计算结果为 false,并且您已经可以停在那里(因为与成员的任何连接都将是)。
!(A || B || C || D)
!A && !B && !C && !D
!A
false
false
- 但也要再考虑可读性。实际上,掌握写作可能比掌握 .
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")
someString
equals
someString != null && someString.equals("...")
"some specific string".equals(someString)
Objects.equals()
有时额外的括号可以使事情更容易掌握,有时则不然。
虽然我不同意“没有愚蠢的问题”,但我想说的是,有时问一个愚蠢的问题比在课堂上落后要好,因为有些东西在你身上唠叨,或者你错过了一些重要的部分。在这种情况下,我认为这是个好问题(除非她只是告诉你为什么)。
前者在 python 等某些语言中不是一个好主意, 在 python 中,对于前者来说,更好的方法是
if not something==somethingElse
虽然后者是完美的,if something != somethingElse
因此,学习前者可能会让你在某些情况下遇到错误非常微妙的情况,以至于调试变得非常困难,尤其是当你在循环中使用这个条件时while
!=
比 更有效。我在 python 中进行了测试,它不言自明。!()
(not a and not b and not c and not d) 10.07692837715149
(not (a and b and c and d)) 11.208963394165039
和 之间是有区别的,这取决于个人喜好和你使用的代码。正如其他答案所说,在 python 中更快。a!=b
!(a==b)
a!=b
评论
!=
!...==
(a!=b)
!(a==b)