Java 为什么++;a和x2B+;`不在C+中编译+;但是“(+;+;a)++;`做
标题上写着什么。对于C++,<代码>(++ +a)++< /COD>进行编译。但奇怪的是,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
++(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++)
不能编译呢?回答得很好,谢谢。