【问题标题】:Postincrement and preincrement in Java expressionsJava 表达式中的后自增和预自增
【发布时间】:2012-03-01 01:40:42
【问题描述】:

每个表达式的计算结果是什么?假设 x 在每个之前都是 2。

  • int num = x++ * 3;
    所以这相当于 (2)*3 或 num=6 并且 x 现在是 3。

  • num *= x;
    num =2*2 或 4

  • (x < 2) && (x > 1)
    变为 FALSE,因为 (21)=true 所以它是 false。

  • (++x < 2) || (x < 1)
    (3<2) 是假的,然后((2+1)<1) 也是假的,所以它是假的?
    一个问题是,在这种情况下,预增量是否在中断前应用于变量?第二个 x 值应该是 3 还是 2?
    对于后增量,我也有同样的问题。假设我有num=x++ *x++,其中初始 x=2。那么这是 2*2 还是 2*3?

【问题讨论】:

  • 你说的是哪个“中断”?
  • 第四个。由于预增量在第一个括号中(我确定它有一个特殊的名称),它会影响第二个括号比较中 x 的值吗?
  • 如果 x 的值在 AND 或 OR 语句的前半部分中前后递增,它会影响后半部分的值吗?
  • 为什么不自己尝试一下呢? --> Ideone

标签: java expression variable-assignment increment


【解决方案1】:

它在“中断”yes 之前递增。基本上这是java做的第一件事(括号实际上仍然是第一件事)。所以在 (++x

【讨论】:

  • 我意识到它在执行语句之前将前半部分的 x 值加了一个。让我尝试用不同的方式来解释这一点:var x=2;
    (x++ < 4)&&(x==2);
    第二个陈述是对还是错。我想知道预增量是否会影响整行的 x 值..
  • @Chris:你为什么不直接运行它?如果结果为false,则第二条语句为false。如果是true,则为true。这很容易找到。
  • @Felix Kling:我没有安装 Eclipse 或 SDK 的计算机的管理员权限。尽管有人发布了我现在正在使用的这个很酷的在线 Java 运行器。我以前从未这样做过,那么如何在不写一大堆 if else 的情况下返回 OR 语句的值呢?
  • @fbernardo 如果程序给我这个错误:“无法从结果类型为 void 的方法返回值”,这意味着该语句是错误的,对吗?或者这是否意味着某些事情实际上是错误的?
  • 如果你声明了一个 void 方法(比如 main),你就不能返回一个值。这就是一个 void 方法,一个不返回任何东西的方法......所以,这并不意味着它是真或假。
【解决方案2】:

int num = x++ * 3; => OK: x = 3, num = 6
num *= x; => num 的初始值是多少?如果 num = 2,那么你也可以。
(x < 2) && (x > 1) 在 x = 2 时为 false,OK
(++x < 2) || (x < 1) 在 x = 2 时为 false,也可以

我记得我看过 openJDK,尤其是 javac 源代码中的 Lower 类,并且 ++x 被翻译成 x += 1 因此您可以将其视为:
((x += 1)) < 2) 这是(没有类型转换):((x = (x + 1)) < 2)。第二个测试将具有较新的 x 值,即 3,因为 java 从左到右评估条件。

【讨论】:

    【解决方案3】:

    是的,这些是一些非常基本的概念,请帮自己一个忙。下载类似 jUnit 的 unittest 框架。然后,您可以使用一些断言来快速运行所有这些测试,这些断言将准确地向您显示正在发生的事情。另一种无需太多开销的方法就是在控制台上打印出来。

    int num = x++ * 3;
    System.out.println( "num=" + num );  // num=6
    

    【讨论】:

    • 我没有安装 Eclipse 或 SDK 的计算机的管理员权限。虽然有人发布了我现在正在使用的这个很酷的在线 Java 运行器。
    【解决方案4】:
    num *= x;
    num =2*2 or 4
    

    我不知道你从哪里得到的。

    num *= x; 等价于num = num * x;。如果 num 是 6(来自上一个语句),那么现在它将是 12(假设 x 仍然是 2)。

    【讨论】:

    • 在这种情况下,x 在第一个 sum 之后变为 3,因此 num 将为 18。
    • 这就是她给我的。我认为她假设所有程序都是分开的,x 值初始化为 2。
    【解决方案5】:
    1. “假设x 在每个之前都是 2。”这是给定的假设还是您正在做出的假设?我不相信你可以做出这样的假设。我相信您已经按顺序评估了所有这些陈述。
    2. a *= b 的扩展形式是什么?
    3. 在第二个语句中num 的初始值是多少?
    4. 在上一条语句中,您正确地计算了(2+1) < 1(假设您的初始条件正确),因为x 已递增。

    在每个语句之后跟踪xnum 的值,我想你会得到正确的答案。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 2016-02-09
      • 1970-01-01
      • 2016-07-03
      • 2015-05-03
      • 2011-01-23
      相关资源
      最近更新 更多