在Java中,为什么我不能编写i ++++或(i ++)++?

时间:2011-01-10 21:19:04

标签: java increment decrement jls

当我尝试在/减量中写一个后缀/前缀,然后在/减量中写一个帖子/前缀时,我收到以下错误:操作的无效参数++ / - 。< / p>

但是,根据JLS:

PostIncrementExpression:
        PostfixExpression ++

PostfixExpression:
        Primary
        ExpressionName
        PostIncrementExpression
        PostDecrementExpression

所以写道:

PostfixExpression ++ ++

应该可以......有什么想法吗?

10 个答案:

答案 0 :(得分:23)

请注意,原始语法缺少任何语义。它只是语法,并不是每个语法上有效的程序通常都是有效的。例如,在使用之前必须声明变量的要求通常不包含在语法中(您可以,但这很麻烦)。

Postfix-increment产生一个rvalue - 就像你不能使用postfix-increment文字一样,你不能后缀增加i++的结果。

引自JLS(3 rd ed。,第486页):

  

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

答案 1 :(得分:8)

错误告诉你答案:

unexpected type
required: variable
found   : value
        (i++)++;

因此,当运算符需要变量时,i ++会计算出一个值。

答案 2 :(得分:5)

您只能将++--应用于表示可修改位置(左值)的表达式。 ++--的结果是来自位置的值(rvalue - 在增量或减量之前或之后),而不是自身可修改的位置。所以你不能说(a++)++只能说(a+b)++ - 没有地方可以修改。

答案 3 :(得分:4)

这个表达式的问题 i =(i ++)++; 是(i ++)被解析为一个值,而 ++ 运算符的定义是这样的 1。它将增加指定的变量,无论您使用Postfix还是Prefix,都会为此返回/返回一个值。 2. 此运算符需要变量,无论是前缀还是后缀。但是这里发生的是(i ++)返回一个值并用它代替(i ++)然后你有(值)++ (值)是不是此运算符的预期类型,因为它需要一个变量来代替值。

例如在Java中,如果您编译以下代码段,则会收到错误,如代码段后所示:

公共类A {     public void test(){         int i = 0;         i =(i ++)++;     } }

编译输出:

A.java:4:意外类型 必需:变量 发现:价值                 i =(i ++)++;                       ^ 1错误

答案 4 :(得分:2)

i ++基本上是以下的捷径:

(i = i + 1)

写下来没有任何意义:

(i = i + 1)++;

正确? :)

答案 5 :(得分:1)

这种手术的结果应该是什么? i++的结果是i的当前值(的副本),之后{{em> post )会增加i。那你怎么想象再次增加i++的结果呢?如果i原来是1,那么它的值应该在i++++之后,该操作的结果应该是什么?

如果您考虑一下,您可能会意识到,非常很难正确地定义它。由于Java的设计者打算避免使用C / C ++“未定义”的陷阱(并且因为这样的语句的值最多可疑),他们可能决定明确禁止它。

答案 6 :(得分:1)

必须记住:增量&amp;减量(前缀和后缀)运算符始终使用 变量 而非

我在这里用一个exe来解释这个:

int i = 0;

int j = (i++)++;

以上exe。

  

使用0(零)

初始化 i 的值      

(i ++)&#39; ++&#39;与i合作,这是可变的&amp;执行操作后返回(1)

     

现在在(1)++ &#39; ++&#39;使用(1),这是一个与java规则相反的值的变量,这就是为什么编译时错误生成操作的无效参数++ / -

答案 7 :(得分:0)

你想通过(i ++)++实现什么?

增加两次!!

使用循环

循环中的增量:)

答案 8 :(得分:0)

在i ++中,++是一个后缀运算符,因此它返回i的值然后递增它。你想要(i ++)++做什么?从(i ++ == i)开始它应该返回i + 1吗?如果不是那就不奇怪我+ = i但是(i ++)++!= i)考虑以下表达式:

i++  ==  i;   // true
j = i++  // j gets the value of i
j++ == i //  still true since j== i

(i++) ++ ==  j ++    //  what should be the answer here?

您是否考虑过i + = 2?

答案 9 :(得分:0)

为什么不使用简写增量运算符?

i+=2