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

在最近的一个问题中 ,我们发现了以下代码:

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

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

 t != (t = tail) 

考虑到这些是相同类型的对象,无论何种类型。 这和之间有什么区别:

 t != tail 

或者我错过了比较机制中至关重要的东西?


编辑

如果有人想知道,可以在java.util第352行的ConcurrentLinkedQueue类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与新值进行比较

第二个将比较尾部

注意:另一个答案是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都是愚蠢的 。 甲骨文可能并不期待弃用它,假设它是一个无意的错误,它可能就是这样。

我下次与他们交谈时我会接受它。 关于美国国防部的整个Abode惨败,与我妈妈的主页在苹果公司的勾结中设置问题,我仍然对他们感到生气。 苹果公司在不到一周的时间内修复了iTunes,因为重新下载女儿video库失败后我不得不点击400多次这样的东西,所以问题仅限于Oracle。 它也影响了微软,所以每个人都对它感到生气。

 #include  static int ref = 0; class t { public: t(int x) : x(x), r(ref) { ref++; } t(const t& o) : x(ox), r(or) { } t& operator=(const t& o) { x = ox; r = or; return *this; } bool operator!=(const t& o) const { return r != or; } private: int x; int r; }; int main() { ta(1); tb(2); if(a != (a = b)) { std::cout << "assignment\n"; } else { std::cout << "no assignment\n"; } return 0; }