#include<iostream>
using namespace std;
int main()
{
int x=1, y=2;
if( x != y ) cout<<"true"<<endl; else cout<<"false"<<endl;
if( ! x == y ) cout<<"true"<<endl; else cout<<"false"<<endl;
if( !( x == y ) ) cout<<"true"<<endl; else cout<<"false"<<endl;
if( (!x) == y ) cout<<"true"<<endl; else cout<<"false"<<endl;
}
除了外观/偏好参数之外,一个原因可能是
[ ! "$a" = "$b" ]
在极端情况下失败的实现比 with更多[ "$a" != "$b" ]
。如果实现遵循POSIX 算法,这两种情况都应该是安全的,但即使在今天(截至撰写本文时为 2018 年初),仍有一些实现失败。例如,使用
a='(' b=')'
:对于
dash
0.5.9 之前的版本,例如sh
Ubuntu 16.04 上的 0.5.8:(在 0.5.9 中修复,参见https://www.mail-archive.com/[email protected]/msg00911.html)
这些实现
[ ! "(" = ")" ]
按原样[ ! "(" "text" ")" ]
处理[ ! "text" ]
(测试“text”是否为空字符串),而 POSIX 要求它是[ ! "x" = "y" ]
(测试“x”和“y”是否相等)。这些实现失败是因为它们在这种情况下执行了错误的测试。请注意,还有另一种形式:
那需要一个 POSIX shell(不适用于旧的 Bourne shell)。
请注意,一些实现在
[ "$a" = "$b" ]
(and[ "$a" != "$b" ]
)方面也存在问题,并且仍然像 Solaris 10 上的[
内置函数一样/bin/sh
(Bourne shell,POSIX shell 在 中/usr/xpg4/bin/sh
)。这就是为什么您会看到以下内容:在试图移植到旧系统的脚本中。
x != y
语法更好,因为容易! x == y
出错 - 需要了解因语言而异的运算符优先级。语法! x == y
可以解释为!(x == y)
or(!x) == y
,具体取决于!
vs的优先级=
。例如, in
c++
negation!
在比较/关系运算符之前==
,因此以下代码:返回
在许多其他语言中可以观察到类似的行为,包括例如
awk
- Unix 世界中常用的工具。另一方面,将运算符聚集在一起 via
x != y
不会导致任何混淆,因为它是一种成熟的模式。此外,从技术上讲!=
,通常不是两个,而是一个运算符,因此评估应该比单独比较然后否定更快。因此,虽然这两种语法都可以在 bash 中使用,但我还是建议您遵循x != y
,因为它更容易阅读和维护遵循一些标准逻辑的代码。这种事情是非常基于意见的,因为“答案”在很大程度上取决于个人大脑的连接方式。虽然在语义上,
NOT ( A == B )
确实与 相同(A != B )
,但一个人可能更清楚,另一个人可能更清楚。它也取决于上下文。例如,如果我设置了一个标志,则使用一种语法比另一种语法可能更清楚:与