gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:39:54 26 4
gpt4 key购买 nike

运行以下代码:

// 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()));
}
}

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

最佳答案

执行表达式 i == (i = 2) 的 C 程序的行为未定义

它来自 C11 6.5p22 :

  1. If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)

== 左侧的 i 是对标量对象 i 的值的值计算,而右侧的 -手边 i = 2 具有将值 2 分配给 i 的副作用。 == 的 LHS 和 RHS 是未排序的 w.r.t。彼此。因此整个程序在 C 中是没有意义的。

gcc -Wall 编译,GCC 会吐出:

unsequenced.c:5:16: warning: operation on ‘i’ may be undefined [-Wsequence-point]
if(i == (i = 2)) {
~~~^~~~

与 C 不同,Java 保证操作数的求值顺序(从左到右),因此

haveNext = (prev == (prev = get()));

在 Java 中是正确的。在评估对 RHS 的副作用之前,严格确定 LHS 的值。

在 C 中,您必须将其写成类似

newPrev = get();
haveNext = (prev == newPrev);
prev = newPrev;

关于java - i == (i = 2) 的结果是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com