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

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

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

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

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

But now I am confused, because as a teacher I assume you know a lot of your subject, so could there be a good reason why she used her method over mine?

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

换句话说,她以前可能被什么问题咬过,写成这样就解决了——问问她,你可能会学到一些东西。

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

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

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

其实if (!(array[i] == null)和ìf (array[i] != null)

没有区别

在这种情况下我们可以想象一个场景。假设 array[i] 不为空,那么对于 if(!(false)) 中的第一个表达式,最终 !(false) 将为真。

对于第二个表达式,return 结果将直接为真。

所以总是推荐第二个表达式。

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

写了没关系

if(array[i] != null)

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

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

总之,大家可以选择自己喜欢的风格。

希望您理解并祝您好运!

当你对某事有疑问时,一定要问你的老师:)

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

我的建议是 一般情况下选择 if (! (...)) 因为:

  • 大多数人不会这样做。您将不得不阅读并理解他人编写的代码,而其他人也必须阅读并理解您的代码。像这样的怪癖会大大降低可读性,同事们会对你不屑一顾。
  • 某些项目可能遵循不允许这样做的编码标准。
  • 考虑执行。对于更复杂的陈述,不同的风格可能会产生影响。想想 !(A || B || C || D)!A && !B && !C && !D。可能会发生在前者中 A-D 必须被评估然后生成的布尔值被翻转 wheras 在后者中可能足以看到 !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-style 有点相关的写作也很好。假设您有 String someString;,其中可能包含一个字符串,或者可能是 null。现在假设您想检查它是否等于 "some specific string"someString.equals("some specific string") - 哎呀,这可能会产生 NPE,因为当 someString 为 null 时,没有方法 equals 来打电话给它。相反,您必须执行 someString != null && someString.equals("...")"some specific string".equals(someString) 的 Yoda-way。还有其他助手,例如 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

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