(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;
}
在一个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;
}