为什么我不能使用多个Java递增或递减运算符?

时间:2014-03-13 08:11:33

标签: java operators

当我同时使用两个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 ++?有人能解释一下吗?感谢..

4 个答案:

答案 0 :(得分:7)

++xx++的结果被归类为,而不是变量 - 两个运算符仅适用于变量。

例如,来自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;
}

++ipp_var(&i)的行为方式相同。

++运算符的其他组合具有未定义的行为:考虑i++ + ++i,会发生什么取决于编译器如何理解此代码以及何时执行store i操作。由于这些运算符的组合非常模糊,因此语言未定义它们。您的编译器可能会或可能不会警告您,如果它没有,结果将取决于它的实现。