在Java中,为什么我不能写I +++或(I ++)++?
题
当我尝试在/减少中编写一个后缀/前缀,然后在/减少中进行帖子/前缀时,我会收到以下错误: 对操作++/ - 的参数无效.
但是,根据JLS:
PostIncrementExpression:
PostfixExpression ++
和
PostfixExpression:
Primary
ExpressionName
PostIncrementExpression
PostDecrementExpression
所以写:
PostfixExpression ++ ++
应该有可能...有什么想法吗?
解决方案
请注意,原始语法缺乏任何语义。这只是语法,并非每个句法有效的程序通常都是有效的。例如,在语法通常不涵盖用法之前必须声明变量的要求(您可以,但很麻烦)。
后缀 - 提出会产生一个rvalue - 就像您无法邮寄的文字一样,您也不能邮政篇小说。 i++
.
引用JLS(3路 ed。,第486页):
后修正增量表达式的结果不是变量,而是值。
其他提示
错误告诉您答案:
unexpected type
required: variable
found : value
(i++)++;
因此,I ++在操作员需要变量时评估值。
您只能申请 ++
或者 --
表示表示可修改位置(LVALUE)的表达式。一个结果 ++
或者 --
是位置的值(一个rvalue - 在增量或减少之前或减少之前或之后),而不是本身是可修改的位置。所以你不能说 (a++)++
比你说的更多 (a+b)++
- 没有位置可修改。
这个表达的问题 i =(i ++)++; 是(i ++)被解析为一个价值和定义 ++ 操作员说1 . 无论您使用Postfix还是前缀,它都会增加指定的变量,并将其放置/返回该值。2. 该操作员需要变量,无论是前缀还是后缀。但是这里发生的是(i ++)是返回一个值并将其列为(i ++),然后您有 (值)++ 和 (价值) 不是该操作员的预期类型,因为它需要变量代替价值。
例如,在Java中,如果您编译以下代码段,您将获得摘要后显示的错误:
公共类A {public void test(){int i = 0; i =(i ++)++; }}}
汇编输出:
A.Java:4:所需的意外类型:找到变量:值i =(i ++)++; ^ 1错误
我++基本上是:
(i = i+1)
写作没有任何意义:
(i = i+1)++;
正确的? :)
这样的操作应该是什么结果?的结果 i++
是(副本)的当前值 i
, , 和 i
之后会增加(邮政)。那么,您如何想象会增加 i++
再次?如果 i
最初是1,其价值应在 i++++
, ,这项操作应该是什么结果?
如果您考虑一下,您可能会意识到这将是 非常 难以正确定义这个。由于Java的设计师打算避免C/C ++“未定义”陷阱(并且由于这种陈述的价值充其量是可疑的),因此他们可能决定明确禁止它。
必须记住: 增量和减少(前缀和后缀)操作员始终与 多变的 不是 价值
在这里,我用一个exe解释了这一点:
int i = 0;
int j = (i++)++;
在Exe上方。
初始化的值 一世 与0(零)
在 (i ++) '++'与i合作,这是可变的,执行操作返回后 (1)
现在 (1)++ '++'与(1)合作,它是与Java规则相对的值,这就是为什么编译时间错误生成的原因 对操作++/ - 的参数无效
您试图通过(i ++)++实现什么?
将其递增两次!
使用循环
在循环中递增:)
在i ++中,++是后缀运算符,因此它返回i的值,然后将其递增。您要(I ++)++做什么?因为(i ++ == i),它应该返回i+1吗?如果不是,那不是奇怪的是i ++ = 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?
您为什么不使用速记增量操作员?
i+=2
那里。