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

7
上周在高中时,我的IT老师给我们发了一个程序,其中她写的一部分引起了我的极大兴趣。在一个if语句中,她检查了一个数组元素是否为null,如果是,则程序可以继续处理此元素,因此她写道:if (!(array[i] == null),这让我感到困惑,因为使用这种方法只会多用一个括号,使代码更难阅读。我将其改为ìf (array[i] != null),而它运行得非常好。但现在我很困惑,因为作为老师,我认为您对学科非常了解,所以她为什么要使用她的方法而不是我的方法呢?有些细节是我不知道的吗?

8
毫无理由写前者。 - Andy Turner
这些表达式是等价的,因此只需选择更易于阅读的表达式...并确保在您的代码/项目中保持一致。在单个项目中交替使用此类内容很可能会导致错误。 - deHaar
这一切都关乎可读性。有些团队更喜欢使用!=,而另一些则会选择!...== - dbl
2
当一个人有很多经验时,他们有很多机会从许多不同的语言中学习到很多怪癖和习惯。人们通常以适合自己的方式编写代码,这并不意味着它对你更好。 - khelwood
为什么不直接问她呢? - Chris Wohlert
显示剩余2条评论
8个回答

16

这两个表达式的语义没有区别。我认为没有什么好的理由去写前者。

但是现在我有些困惑,因为作为一名老师,我假定您了解自己所教授的科目,那么她为什么要使用她的方法而不是我的方法?

最好的办法是询问您的老师。关于老师,最重要的一点是要记住,他们是人类,有着各自的经验、偏见和犯错的可能性。

换句话说,她可能以前遇到过某些问题,通过这种方式解决了——问问她,你可能会学到一些东西。

或者,她认为这样做更好,却无法明确说明自己的偏好;或者这是她学习的方式,并认为没有必要改变——从中你也可以学到一些东西,因为有多种方式表达相同的语义。

(我更喜欢使用!=,因为它更简洁——括号更少;而且如果你不打算使用它,为什么语言设计者要提供!=呢——但这只是我的个人偏好)。

或者,她可能本意使用!=,但忘记回来修改。有时候很容易忘记整理代码。


2
很好的回答。我想补充一点,老师们往往会让例子更加清晰明了。我猜在教布尔代数的时候,将“!=”条件解释为“!(==)”对某些学生来说可能更容易理解,也许这就是写后者的原因。 - Steyrix

4
在Java中,a!=b!(a==b) 没有区别。选择后者形式是一种风格上的选择,但是实话说,大多数静态分析工具/IDE都会发出警告。

3

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

如果你写的是

if(array[i] != null)

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

因为在大多数编程语言中,!被定义为not,所以在这种情况下,它们两者是相等的。
总之,您可以选择任何喜欢的风格。
希望您理解并祝您好运!
当您对某些事情感到疑惑时,请始终向您的教师提问 :)

3
其他答案是正确的。对于您的示例,没有区别 - 选择最喜欢的。但我想给出更多选择一种方式而不是其他方式的原因。
我的建议是一般情况下不要使用 if (! (...)),因为:
- 大多数人不会这样做。您将不得不阅读并理解其他人编写的代码,而其他人也将不得不阅读和理解您的代码。这些怪癖大大降低了可读性,同事们会对您皱眉头。 - 某些项目可能遵循不允许此类语法的编码标准。 - 考虑执行。对于更复杂的语句,不同的风格可能会产生影响。请考虑 !(A || B || C || D) 和 !A && !B && !C && !D 的区别。在前者中,A-D 可能必须被评估,然后结果布尔值被翻转,而在后者中,只要看到 !A 评估为 false,你就可以停止了(因为与 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) 更容易理解。 - 话虽如此,也要了解 Yoda 风格的写作方式,这与此类语法有些关联。想象一下你有 String someString;,它可能包含一个字符串或可能为 null。现在想象一下你想检查它是否等于 "some specific string":someString.equals("some specific string") - 糟糕,这可能会产生 NPE,因为当 someString 为 null 时,没有方法可以在其上调用 equals。取而代之的是,你需要做 someString != null && someString.equals("...") 或 Yoda 方式的 "some specific string".equals(someString)。还有其他帮助器,如 Objects.equals()。 - 有时额外的括号可以让事情更容易理解,有时不行。
虽然我不认为“没有愚蠢的问题”,但有时问一个愚蠢的问题比落后于课程中更好,因为某些东西困扰着您或您错过了一些重要的内容。在这种情况下,我认为这是一个好问题(除非她刚告诉您为什么)。

0

在编程中,a!=b!(a==b)是有区别的,这取决于个人偏好和你所使用的代码。在Python中,如其他答案所述,a!=b更快。


-1
实际上,if (!(array[i] == null) 和 if (array[i] != null) 之间没有区别。
在这种情况下,我们可以想象一种情景。假设 array[i] 不是 null,那么在 if(!(false)) 的第一个表达式中,最终 !(false) 会变成 true。
而对于第二个表达式,返回结果将直接为 true。
因此,建议始终使用第二个表达式。

这是!Cparta :) - dbl

-2

在某些语言如Python中,前者不是一个好主意。

在Python中,对于前者,更好的方法是:

if not something == somethingElse

尽管对于后者而言,完美的写法是:if something != somethingElse

因此,学习前者可能会遇到一些情况,其中bug非常微妙,导致调试变得非常困难,特别是在使用这个条件进行while循环时。


-2

!=!() 更有效率。我在 Python 中进行了测试,效果不言自明。


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接