java - 嵌套 for 循环给出意想不到的结果

标签 java eclipse for-loop nested-loops operator-precedence

我正在尝试解决在 http://chortle.ccsu.edu/CPuzzles/PartA/CpuzzlesAsection11.html 中找到的 A14 谜题。 ,使用 Java(与 Eclipse),当我遇到一些意想不到的结果时。

该谜题要求在每一行 k 上打印 100 * k 到 100 * k + 99 范围内所有 23 的倍数的整数(其中 k 是某个限制,例如 11)。

我最终用来解决问题的嵌套For循环是:

for(i = 0; i <= k; i++){
        for(j = 0; j <= 99; j++){
            if((100 * i + j) % 23 == 0)
                System.out.print(100 * i + j + " ");
        }

        System.out.println();
    }

但是,在我的第一次尝试中,在 If 语句中使用模除法之前,我没有在 100 * i + j 周围加上括号,它只产生一行结果:“0 23 46 69 92”(与正确的解决方案相比,它给了我 11 行结果:第一行中的“0 23 46 69 92”,第二行中的“115 138 161 184”等) .).

我试图找出这背后的原因。即使没有括号,我也会假设 If 语句在 j 上使用模除法,然后将其与 100 * i 组合。然而,如果是这样的话,它不是会产生 11 行(如果 k = 11)“0 23 46 69 92”,而不是仅仅一行吗?

最佳答案

这是由于运算符优先级造成的。模 (%) 运算符的优先级高于加号和减号运算符。请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html .

i = 1j = 38 的情况为例。在这种情况下,

(100 * i + j) % 23 计算结果为零,因此条件为真。另一方面,100 * i + j % 23 的计算结果为 115 并且条件为 false。

去掉括号后只打印一行的原因是,当i > 0(从第二行开始)时,表达式100 * i + j % 23将始终大于100,因此等于0的条件始终为假。因此,从外部 for 循环的第二次迭代开始,不会打印任何内容。

关于java - 嵌套 for 循环给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28124079/

相关文章:

java - Android SDK( eclipse ): How To Use SetOnKeyListener with Button?

java - 如何解析这个语法?

java - 优化 Lucene 的压缩比

eclipse - 如何在 Eclipse 中获得对 GPB 的支持?

c++ - 使用 fread 读取二进制文件时无法获得正确的元素数

javascript - for (var x in array) 和 for (var x=0, y= array.length; x<y; x++) 的性能差异

JavaScript 在 For 循环期间暂停

python - python中select语句中的mysql for循环

java - 如何在数组列表中引用数组元素?

java - 具有随机 int 值的字段