Java 赋值运算符

Java assignment operator

以下引用摘自http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.html

Do not use the assignment operator in a place where it can be easily confused with the equality operator. Example:

if (c++ = d++) {        // AVOID! (Java disallows)
    ...
}

should be written as

if ((c++ = d++) != 0) {
    ...
}

我被这条线弄糊涂了

if ((c++ = d++) != 0) {

如能对此作出任何澄清,我们将不胜感激。

(c++ = d++) 是整数表达式,不是布尔表达式。它计算 cc++ = d++ 分配中分配给的任何整数。因此 if (c++ = d++) { 在 java 中不是首发。

因此与 0 的比较是将整数表达式转换为布尔值所需要的。

而且我认为这是不言而喻的。代码写成:

if ((c++ = d++) != 0) {

只是糟糕的编码。首先,比较中的内部赋值。然后是其中的后缀运算符。两者都导致代码块难以阅读,容易出现错误,难以维护等......更好地写成如下:

c = d;
c++;
d++;
if (c == d) {

但你已经知道了。 :)

与 C 等其他语言相比,Java 的基本标量(整数等)不能用作布尔值。换句话说,0 绝不是 truefalse。只有 等于 0 才可以是 truefalse.

在页面的最开头我可以看到 -

This page is not being actively maintained. Links within the documentation may not work and the information itself may no longer be valid. The last revision to this document was made on April 20, 1999

    if ((c++ = d++) != 0) {
        //logic
    }

语法甚至无效(使用 Java6)。它给了我

The left-hand side of an assignment must be a variable

您需要将 c++ 分配给某个变量。

他们只是想说编译器需要 if 语句的条件来评估 boolean 值。如果您知道自己在做什么,并决定将具有副作用的实际代码作为条件,则需要使表达式求值为 boolean 类型的值。

而示例中的反模式代码可以在像 C 这样的编程语言中运行,其中 boolean 值实际上是整数(其中零是 false,非零是 true),在 Java 中执行此操作的正确方法是实际将结果与 0 进行比较。