(a != b) 和 (a != (a = b) 有什么区别?

What is the difference between (a != b) and (a != (a = b)?

在一个recent question中,我们找到了如下一段代码:

// p, t, q and tail are Node<E> objects.
p = (p != t && t != (t = tail)) ? t : q;

忽略问题的上下文,我对以下行为感兴趣:

t != (t = tail)

考虑到这些是同一类型的对象,无论是什么类型。这个和:

有什么区别吗
t != tail

或者我是否遗漏了比较机制中的一些重要内容?


编辑

如果有人想知道,可以在 ConcurrentLinkedQueue class 的第 352 行 java.util 中找到。

t != (t = tail)

相当于

oldt = t;
t = tail;
... oldt != t...

t 的原始值与 tail 进行比较,另外 t 被赋予 tail.

的值

这是一种简写方式

if (t != tail) {
    t = tail;
}

第一个代码:

t != (t = tail)

将 tail 分配给 t 然后将 t 与新值进行比较

第二个将 t 与 tail 进行比较

注意:另一个答案是 Java 实际做的事情

synchronized(x) {
     if(t != (t = tail));
}

等同于

synchronized(x) {
    t = tail;

    if(t != t) {
        // ...
    }
}

基本上,( ) 运算符返回对赋值内容的引用

public class Test {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;

        if(a != (b = a)) {
            System.out.println("however, there is an issue with a != (a = b), Java bug");
        } else {
            System.out.println("assignment first, obvious by inspection");
        }
    }
}

然而,相同的代码在 C 中也能工作。如果我不得不猜测,这在 Java 中是无意的,任何与 C 类似的偏离都是 愚蠢 . Oracle 可能不希望弃用它,假设它是一个无意的错误,它可能是。

下次与他们交谈时我会谈到它。我仍然对他们感到愤怒,因为他们与 Apple Incorporated 勾结,将我妈妈的主页设置为 ask.com,导致国防部的整个 Abode 惨败。 Apple 在不到一周内修复了 iTunes,尽管我不得不点击该东西超过 400 次以便在我女儿的视频库重新下载失败后重试,因此问题仅限于 Oracle。它也影响了微软,所以每个人都为之疯狂。

#include <iostream>

static int ref = 0;

class t {
public:
    t(int x) : x(x), r(ref) { ref++; }
    t(const t& o) : x(o.x), r(o.r) { }
    t& operator=(const t& o) { x = o.x; r = o.r; return *this; }
    bool operator!=(const t& o) const { return r != o.r; }
private:
    int x;
    int r;
};

int main() {
    t a(1);
    t b(2);

    if(a != (a = b)) {
        std::cout <<  "assignment\n";
    } else {
        std::cout <<  "no assignment\n";
    }

    return 0;
}