Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么++;a和x2B+;`不在C+中编译+;但是“(+;+;a)++;`做_Java_C++_Lvalue_Rvalue - Fatal编程技术网

Java 为什么++;a和x2B+;`不在C+中编译+;但是“(+;+;a)++;`做

Java 为什么++;a和x2B+;`不在C+中编译+;但是“(+;+;a)++;`做,java,c++,lvalue,rvalue,Java,C++,Lvalue,Rvalue,标题上写着什么。对于C++,(++ +a)++< /COD>进行编译。但奇怪的是,++(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(Str

标题上写着什么。对于C++,<代码>(++ +a)++< /COD>进行编译。但奇怪的是,
++(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
    }
}

<> P>是否有任何理由编译C++而不是java?< / P> < P>没有一个例子在java中工作,因为后缀和前缀增量操作都返回值而不是变量,我们可以通过查看一个例子来查看这一点,它表示:

后缀增量表达式的结果不是一个变量,而是一个值

的JLS部分也说了同样的话

这就像试图增加一个文本值():

这会产生以下错误:

required: variable
found:    value
这与我们在您的示例中收到的错误相同

<> P> C++前缀增量返回一个LPoT,但后缀增量返回一个PR值,C++中的前缀和后缀增量都需要一个LValk。所以你的第一个和第三个C++例子:

++a++;
++(a++)
(++a)++;
失败,因为您正试图将前缀增量应用于prvalue。而第二个C++例子:

++a++;
++(a++)
(++a)++;
可以,因为前缀增量返回左值

参考
5.2
Postfix表达式一节:

后缀++表达式的值是其操作数的值[…]操作数应为可修改的左值

以及:

结果是一个pr值

第5.3节一元表达式说:

前缀++的操作数已修改[…] 操作数应为可修改的左值

以及:

结果是更新后的操作数;这是一个左值


什么C++编译器?在什么意义上,你认为<代码> A++<代码>是<代码> VoUT/Vo> >语句?@ FrdLrson,我在IDENo.com上使用了<代码> C++ 11 < /Cult>编译器,但是我认为它可以在任何C++编译器上使用。我认为这是一个
void
语句,因为它(在功能上)等价于:
a=a+1
没有给出实际值。
“…如果解析器在解析过程中只使用一个token lookahead,而没有进行语义分析,那么当++是lookahead token时,它将无法判断(p)是应该被视为主表达式还是单独作为CastExpression的一部分,以供以后考虑。”
@Ryan:你说得不对
a++
返回增量前
a
的值。@fredrarson好的,我明白你的意思。但是既然
a++
在增量之前返回
a
的值,那么为什么
++(a++)
不能编译呢?回答得很好,谢谢。