【问题标题】:Difference between (X != Y) and (!(X == Y))?(X != Y) 和 (!(X == Y)) 之间的区别?
【发布时间】:2026-02-05 08:25:01
【问题描述】:

标题很简单,我只是想知道说明之间是否有区别(任何类型、性能或任何想到的):

if (!(x == y)) {

}

if (x != y) {

}

另外,x & y 是一些原始的或简单的对象,如 int、String、double 等。不是自定义对象。但如果它有很大的不同,我会很高兴听到它!

考虑到它们都检查是否相等,但之后使用“相反”,我不确定它是否不同。

尽管这种差异非常小,但它引起了我的好奇心!

编辑:

我想到这个的原因(所以你明白我的意思)是在输入这个时:

if (!(myTextField.length == 5))

而不是

if (mytextfield.length != 5)

所以你明白我的意思了。字符串长度。

【问题讨论】:

  • 根据运营商的具体情况可能会有很大差异。
  • 我假设您的意思是 (! (x == y)) 而不是 (! x == y)。如果是这样,您能否在问题中明确说明这一点?
  • !x == y 表示“(非 x)等于(y)”,!(x == y) 表示“不(x 和 y 相等)”。
  • @h2ooooooo 我拼错了,看我最新的编辑
  • @LightnessRacesinOrbit Objective-C 然后

标签: objective-c optimization


【解决方案1】:

!(x == y)x != y 在逻辑上是等价的,我怀疑任何语言,无论是编译的还是解释的,都会在内部对它们进行不同的评估。换句话说,如果您发现了可测量的差异,我会感到惊讶。

某些语言(例如 C++ 和 Scala)允许您覆盖这些运算符,在这种情况下当然是另一回事了。

【讨论】:

  • 嗯,这似乎是浮点运算符的一项有用属性。
【解决方案2】:

通常! 运算符在==!= 运算符之前。

因此,这个

!x == y

和这个一样

(!x) == y

因此,在将其与 y 进行比较之前,您先否定 x。这显然与只检查xy 之间的不等式不同:

x != y

为了确保在否定之前完成相等性检查,您应该使用另一对括号:

!(x == y)

【讨论】:

  • 您假设 C (et al) 运算符优先,但问题与语言无关。
  • @PaulR 我从“通常”开始,这将这个答案限制在语言上,这是正确的。如果此假设不适用于特定语言,则其余答案将过时。
  • 我编辑了底部的问题以使其更清晰,我在主要示例中输入不佳
  • @Zil 在我看来就像 JavaScript 代码。上面的解释仍然成立。首先myTextField.length 被取反,从而转换为boolean,然后评估比较,这又涉及一些类型转换。
【解决方案3】:

第一种情况的可读性较差。优化后相当于秒。

【讨论】:

    【解决方案4】:

    这些不一样。但是,如果您将第一个包含为 if(!(x == y)) 那么这些是 相同的。

    但如果你把它写成 (X != Y) 和 (!X == Y),

    首先很简单,X 不等于 Y。

    但在第二个 (!X == Y) 中,首先 !X 将在与 Y 比较之前进行评估, 假设 X 是布尔类型,那么它将反转 X 值(真到假,假到真),然后将其与 Y 进行比较

    【讨论】:

    • 您假设 C (et al) 运算符优先,但问题与语言无关。
    • 是的,但如果括号使用得当,任何语言的优先级都会被覆盖。
    • 我的问题写得不好,我的意思不是“X 的反面”,我的意思是“等式结果的反面”,我忘记了括号。知道了这一点,那么两者之间有区别吗?性能可能吗?
    【解决方案5】:

    !x == y 表示if ( ( x == 0 && y == 1 ) || ( x != 0 && y == 0 ) )。也就是说,它不同于x!=y

    【讨论】:

    • 您假设 C (et al) 运算符优先,但问题与语言无关。
    • 如果优先级不像C那么没有区别(使用好的优化器)。类似“x != yy != x 有什么区别”之类的问题。
    • 这在许多语言中根本不正确。对于非布尔值但内置的y,转换为布尔值意味着y > 1,而不是y == 1 ...而您对x == 0 && y == 1 的看法显然是无稽之谈。
    • 抱歉,这里好像是C。查看新标签 - Objective-C。看来我的假设是对的。
    • @Lightness Races in Orbit - x==0 && y == 1 是什么废话,因为我无法理解你的想法?如果 x 为 0,则 !x 将为 1,比较为 y == 1 - 正确与否?