【发布时间】:2019-05-03 19:14:37
【问题描述】:
运行以下代码:
// In Java, output #####
public static void main(String[] args) {
int i = 1;
if(i == (i = 2)) {
System.out.println("@@@@@");
} else {
System.out.println("#####");
}
}
但是:
// In C, output @@@@@,I did test on Clion(GCC 7.3) and Visual Studio 2017
int main(int argc, char *argv[]) {
int i = 1;
if(i == (i = 2)) {
printf("@@@@@");
} else {
printf("#####");
}
return 0;
}
问这个问题的动机来自以下代码:
// The code is from the JDK 11 - java.util.concurrent.atomic.AtomicInteger
// I am curious about the behavior of the variable prev.
public final int getAndUpdate(IntUnaryOperator updateFunction) {
int prev = get(), next = 0;
for (boolean haveNext = false;;) {
if (!haveNext)
next = updateFunction.applyAsInt(prev);
if (weakCompareAndSetVolatile(prev, next))
return prev;
haveNext = (prev == (prev = get()));
}
}
那么,如何解释以上两种不同的执行方式呢?
【问题讨论】:
-
解释这两种不同的执行模式,首先注意到它们是两种完全不同的语言。它们碰巧共享 一些 语法,但这就是相似之处。
-
结果是:乱码。除非您正在参加 Java 混淆竞赛,否则最好不要模仿。
-
@TheGreatDuck 经过您的编辑,问题仍然有效,不再重复,但投票最多的答案包含很多不相关的部分(以及“两次执行mode”语句不再有意义)。
标签: java c language-lawyer variable-assignment side-effects