当我同时使用两个Java增量运算符时,我感到非常惊讶。
请检查以下代码..
public class Testing {
public static void main(String... str) {
int prefix = 0, postfix = 0, both = 0;
// Testing prefix
System.out.println(prefix);
System.out.println(++prefix);
System.out.println(prefix);
// Testing postfix
System.out.println(postfix);
System.out.println(postfix++);
System.out.println(postfix);
// mixing both prefix and postfix (I think this should be fine)
// System.out.println(++ both ++);
}
}
为什么我不能用作++ both ++
?有人能解释一下吗?感谢..
答案 0 :(得分:7)
++x
或x++
的结果被归类为值,而不是变量 - 两个运算符仅适用于变量。
例如,来自section 15.14.2 of the JLS:
后缀表达式后跟++运算符是后缀增量表达式。
PostIncrementExpression: PostfixExpression ++
后缀表达式的结果必须是可转换(§5.1.8)到数值类型的类型的变量,否则会发生编译时错误。
后缀增量表达式的类型是变量的类型。后缀增量表达式的结果不是变量,而是值。
(在15.14.3中,PrefixIncrementExpression
使用了几乎相同的语言。)
答案 1 :(得分:3)
例如
int i = 0;
现在i++
==> 1
现在1++
是错误。 ++
仅用于不是常量的变量。
答案 2 :(得分:1)
++prefix
它将在控制台中打印的值之前展开。但
prefix++
将打印,然后才会展开。分配值,您将得到相同的结果。但是使用Sout时,结果可能仅在打印时间上有所不同。
答案 3 :(得分:1)
这些运算符来自C语言,其中包含的每个表达式都包含值。
++
是一个运算符,但它也定义了一个值:
i++
表示执行此指令后,变量i
已收到i+1
的值。表达式(i++)
的值是i
的值。
++i
表示执行此指令后,变量i
已收到i+1
的值。表达式(++i)
的值是表达式(i+1)
的值。
++ i ++
没有意义。 ++ i ++
可能是(++i)++
或++(i++)
,并且两个表达式都无效,因为++
已应用于变量,而(i++)
和(++i)
都是值。
同样,i++ ++
没有意义,因为它是(i++)++
而(i++)
是i
的值,而不是变量。
以下页面更详细地解释了这一点:http://www.eskimo.com/~scs/cclass/notes/sx7b.html
如果愿意,让我们写一个与i++
:
int var_pp(int * var) {
temp = *var;
*var = temp + 1;
return temp;
}
i++
和var_pp(&i)
的行为方式相同。
让我们写一个等同于++i
:
int pp_var(int * var) {
*var = *var + 1;
return *var;
}
++i
和pp_var(&i)
的行为方式相同。
++
运算符的其他组合具有未定义的行为:考虑i++ + ++i
,会发生什么取决于编译器如何理解此代码以及何时执行store i
操作。由于这些运算符的组合非常模糊,因此语言未定义它们。您的编译器可能会或可能不会警告您,如果它没有,结果将取决于它的实现。