在recent question中,我们找到了以下代码:
// p, t, q and tail are Node<E> objects.
p = (p != t && t != (t = tail)) ? t : q;
忽略问题的上下文,我对以下行为感兴趣:
t != (t = tail)
考虑到这些是相同类型的对象,无论何种类型。这和之间有什么区别:
t != tail
或者我错过了比较机制中至关重要的东西?
修改
如果有人想知道,可以在java.util
的{{3}}课程中找到这一点,第352行。
答案 0 :(得分:4)
t != (t = tail)
相当于
oldt = t;
t = tail;
... oldt != t...
即。 t
的原始值与tail
进行比较,此外t
的值为tail
。
这是一种简短的写作方式
if (t != tail) {
t = tail;
}
答案 1 :(得分:3)
第一个代码:
t != (t = tail)
将tail分配给t然后将t与新值
进行比较第二个将t与尾部进行比较
答案 2 :(得分:-3)
注意:另一个答案是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可能并不期待弃用它,假设它是一个无意的错误,它可能就是这样。
下次与他们交谈时,我会接受它。关于美国国防部的整个Abode惨败,将我妈妈的主页设置为与Apple Incorporated勾结的ask.com,我仍然对他们感到生气。苹果公司在不到一周的时间内修复了iTunes,因为重新下载女儿视频库失败后我不得不点击400多次这样的东西才重试,所以问题仅限于甲骨文。它也影响了微软,所以每个人都为此感到生气。
#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;
}