【问题标题】:In Java, why can't I write i++++ or (i++)++?在 Java 中,为什么我不能写 i++++ 或 (i++)++?
【发布时间】:2011-06-06 19:14:04
【问题描述】:

当我尝试在/递减中写入后缀/前缀,然后在/递减中写入后缀/前缀时,我收到以下错误:Invalid argument to operation ++/--

但是,根据 JLS:

PostIncrementExpression:
        PostfixExpression ++

PostfixExpression:
        Primary
        ExpressionName
        PostIncrementExpression
        PostDecrementExpression

这么写:

PostfixExpression ++ ++

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

【问题讨论】:

  • 你不觉得--++----++var++----++--++ 可能有点混乱吗?
  • 鉴于C++的增量是C#,你试过用i#吗? ;-)
  • @Anon - i++ 返回一个值,而不是引用......这就是我的答案。 :)
  • @Crozin - 是否令人困惑有什么关系。我正在制作一个元程序,我需要知道这种东西。
  • @Woot4Moo - 哎哟!来吧,这个问题有点中肯..

标签: java increment decrement jls


【解决方案1】:

你想通过 (i++)++ 达到什么目的?

增加两次!!

使用循环

循环内的增量 :)

【讨论】:

  • 呃。当然i+=2 比循环更好。
【解决方案2】:

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

后缀增量产生一个右值——就像你不能后缀增量文字一样,你也不能后缀增量i++的结果。

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

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

【讨论】:

  • 您可以将使用前声明编码到语法中吗?对于任意数量的任何标识符?
  • @delnan:Van Wijngaarden 语法就是为这样的事情而构思的,是的。但是出于所有实际目的,两级语法很笨拙,您可以使用简单的属性语法来实现很多相同的功能,该语法定义了沿 AST 传播的断言(如果我没记错的话;自那节课以来已经有几年了)。
【解决方案3】:

这样操作的结果应该是什么? i++ 的结果是i 的当前值(的副本),i 之后会递增(post)。那么你如何想象再次增加i++ 的结果呢?如果i原来是1,那么i++++后面的值应该是多少,这个操作的结果应该是什么?

如果您考虑一下,您可能会意识到正确定义它非常困难。由于 Java 的设计者打算避免 C/C++ 的“未定义”陷阱(并且由于这种声明的价值充其量是可疑的),他们可能决定明确禁止它。

【讨论】:

  • 不,这不是原因。如其他答案所述,原因是表达式 i++ 的结果是一个值,而不是可以更改的引用。
  • 我记得是因为 cmets/answers。
【解决方案4】:

错误告诉你答案:

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

因此,i++ 的计算结果是一个值,而运算符需要一个变量。

【讨论】:

  • 嗯,取决于编译器,我猜。 EclipseC 产生 »Invalid argument to operation ++/--« 这没什么帮助。
  • 有趣。是的,这几乎没有帮助。上面的错误来自 Sun 编译器。
【解决方案5】:

您只能将++-- 应用于表示可修改位置(左值)的表达式。 ++-- 的 RESULT 是来自该位置的值(一个右值——在递增或递减之前或之后),而不是其本身是可修改的位置。所以你不能说(a++)++,就像你不能说(a+b)++一样——没有要修改的位置。

【讨论】:

    【解决方案6】:

    在 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 吗?

    【讨论】:

      【解决方案7】:

      i++ 基本上是:

      (i = i+1)

      而且写起来没有任何意义:

      (i = i+1)++;

      对吗? :)

      【讨论】:

      • (i = i + 1)(i++) 的行为不同 - 前者返回 i 的新值,后者返回旧值。
      • 对不起。我想我没有选择一个传达滑稽的好笑脸。我的错。为此给我自己-1。
      【解决方案8】:

      你为什么不只使用速记增量运算符?

      i+=2
      

      那里。

      【讨论】:

        【解决方案9】:

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

        例如在Java中,如果你编译下面的代码sn-p你会得到错误,如sn-p之后所示:

        公开课 A{ 公共无效测试(){ 诠释我=0; 我 = (i++)++; } }

        编译输出:

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

        【讨论】:

          【解决方案10】:

          必须记住: 递增和递减(前缀和后缀)运算符始终使用 变量 而不是 值强>

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

          int i = 0;
          
          int j = (i++)++;
          

          高于 exe。

          用0(零)初始化i的值

          (i++) '++' 与 i 一起工作,它是可变的 & 执行操作后返回 (1)

          现在在 (1)++ '++' 与 (1) 一起工作,它是值而不是变量,与 Java 规则相反,这就是编译时错误生成 Invalid argument to操作 ++/--

          【讨论】:

            猜你喜欢
            • 2019-04-26
            • 1970-01-01
            • 2023-03-17
            • 2011-07-16
            • 1970-01-01
            • 1970-01-01
            • 2021-09-26
            • 2017-10-23
            相关资源
            最近更新 更多