java – 为什么`a`不能在C中编译但是`(a)`呢?

前端之家收集整理的这篇文章主要介绍了java – 为什么`a`不能在C中编译但是`(a)`呢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Why is ++i considered an l-value,but i++ is not?11个
标题说的是什么.对于C,(a)确实编译.但奇怪的是,(a)不是:
int main() {
    int a = 0;
    ++a++; // does not compile
    (++a)++; // does compile
    ++(a++); // does not compile
}

但在Java中,并不是所有三个:

public class Test {
    public static void main(String[] args) {
        int a = 0;
        ++a++; // does not compile
        (++a)++; // does not compile
        ++(a++); // does not compile
    }
}

有没有理由为什么C编译这个而不是Java编译?

解决方法

这些示例都不适用于Java,因为后缀和前缀增量操作都返回值而不是变量我们可以通过转到 Postfix Increment Operator ++JLS部分来看到这个例子,它说:

The result of the postfix increment expression is not a variable,but a value.

Prefix Increment Operator ++的JLS部分说了同样的话.

这就像试图增加一个文字值(see it live):

2++ ;
++3 ;

这给出了以下错误

required: variable
found:    value

我们收到的错误与您的示例相同.

在C前缀中,增量返回一个左值,但是后缀增量返回一个prvalue,C中的前缀和后缀增量都需要一个左值.所以你的第一个和第三个C例子:

++a++;
++(a++)

因为您尝试将前缀增量应用于prvalue而失败.而第二个C例子:

(++a)++;

没关系,因为前缀增量返回一个左值.

作为参考,第5.2节后缀表达式中的draft C++ standard说:

The value of a postfix ++ expression is the value of its operand […] The operand shall be a modifiable lvalue

和:

The result is a prvalue

和第5.3节一元表达式说:

The operand of prefix ++ is modified […] The
operand shall be a modifiable lvalue

和:

The result is the updated operand; it is an lvalue

原文链接:https://www.f2er.com/java/120440.html

猜你在找的Java相关文章