i == (i = 2) 的结果是什么?

15 浏览
0 Comments

i == (i = 2) 的结果是什么?

运行以下代码:

// 在Java中,输出#####
public static void main(String[] args) {
    int i = 1;
    if(i == (i = 2)) {
        System.out.println("@@@@@");
    } else {
        System.out.println("#####");
    }
}

但是:

// 在C中,输出@@@@@,我在Clion(GCC 7.3)和Visual Studio 2017上测试过
int main(int argc, char *argv[]) {
    int i = 1;
    if(i == (i = 2)) {
        printf("@@@@@");
    } else {
        printf("#####");
    }
    return 0;
}

提出这个问题的动机来自以下代码:

// 代码来自JDK 11 - java.util.concurrent.atomic.AtomicInteger
// 我对变量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()));
    }
}

那么,如何解释上述两种不同的执行模式呢?

0