【问题标题】:How post Increment ++ Operator works while initializationpost Increment ++ 运算符在初始化时如何工作
【发布时间】:2017-09-15 14:27:14
【问题描述】:

我编写了以下代码来反转给定的字符串:

String str = "abcdef";
char[] strToChar = str.toCharArray();
char[] outString = new char[strToChar.length];

for(int j = 0; j < strToChar.length; ) {
    int len = strToChar.length-j;
    outString[j++] = strToChar[strToChar.length-j];
}

据我了解,初始化发生在 。因此,这里的strToChar[strToChar.length-j] 应该抛出ArrayIndexOutOfBoundException

但它运行良好。这是怎么回事?不应该这样评价吗?

outString[0] = strToChar[6];    //This should throw exception

【问题讨论】:

  • 好吧,你在这里分配outString[0] = strToChar[6-1],这样不会出错。这里的关键是j++,这将导致右侧部分不引发异常,因为左侧赋值变量将由于后增量而增加j
  • JLS 声明:“Java 编程语言保证运算符的操作数似乎以特定的计算顺序进行计算,即从从左到右。”

标签: java arrays operators post-increment unary-operator


【解决方案1】:

如果我查看您的代码,那么您已将条件写为

for(int j = 0; j < strToChar.length;) 

这里 strToChar.length 将返回数组的实际长度,即 6。

使用 for 循环迭代数组的正确方法是:

for(int j = 0; j < strToChar.length;j++)

从0开始到的索引

【讨论】:

  • 好吧,for 循环中缺少的最后一部分是没有例外的主要原因。因此,对于当前的实现,他要么必须将其更改为 strToChar[strToChar.length-j-1],要么会遇到他对没有被提升感到好奇的异常。
  • @SomeJavaGuy 是真的!
  • "用 for 循环 [...] 迭代数组的正确方法" 不,这种方法不是"正确方法",它是最常见的方法。 OP 的代码有些不常见,但运行良好。
【解决方案2】:

根据javadoc

Java 编程语言保证 运算符似乎以特定的评估顺序进行评估, 即从左到右。

这意味着j 在计算表达式右侧之前递增。

所以相应地这段代码:

outString[j++] = strToChar[strToChar.length-j];

被评估为:

outString[0] = strToChar[6-1];

代替:

outString[0] = strToChar[6-0];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2018-12-07
    • 2016-06-24
    • 2023-01-02
    • 2021-03-20
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多