0

查看这种特定方法的输出让我感到困惑。我试图确切地了解它在做什么。

这是方法:

for (int i = 0; i < 4; i ++) {
    for (int j = 0; j < 9; j++) {
    if (j==5) {
        break;
    }
    if ((j==0) || (i==0)) {
        continue;
    }
    if (!((j*i % 3) != 0)) {
    System.out.println(j*i);
    }
}

}

我知道输出是什么,但我仍然不确定它是如何工作的,这就是我在这里问的原因。因此,此方法将遍历 j 直到达到 5,然后中断。

然后它增加 i,j 为 0。J != 5 所以它不会中断,j == 0 所以继续但是 J 变成 3,我是 1。这就是我迷路的地方。3是哪来的??

我用它来打印幕后发生的事情

    public static void tester() {
    for (int i = 0; i < 4; i ++) {
        for (int j = 0; j < 9; j++) {
            if (j==5) {
                System.out.println("j == 5, breaking");
                break;
            }
            if ((j==0) || (i==0)) {
                System.out.println("J is " + j);
                System.out.println("I is " + i);
                System.out.println("j or i == 0, continuing");
                continue;
            }
            if (!((j*i % 3) != 0)) {
                System.out.println("J is " + j);
                System.out.println("I is " + i);
                System.out.println(j*i);
            }
        }
        System.out.println();
    }
}

输出如下:

J is 0

I is 0

j or i == 0, continuing

J is 1

I is 0

j or i == 0, continuing

J is 2

I is 0

j or i == 0, continuing

J is 3

I is 0

j or i == 0, continuing

J is 4

I is 0

j or i == 0, continuing

j == 5, breaking


J is 0

I is 1

j or i == 0, continuing

J is 3

I is 1

3

j == 5, breaking


J is 0

I is 2

j or i == 0, continuing

J is 3

I is 2

6

j == 5, breaking


J is 0

I is 3


j or i == 0, continuing

J is 1

I is 3

3

J is 2

I is 3

6

J is 3

I is 3

9

J is 4

I is 3

12

j == 5, breaking
4

3 回答 3

1

当 j=2 和 i=1 时,您!((j*i % 3) != 0)返回 false,因此它不会进入该条件(也不是其他条件)并且没有输出。这就是为什么它似乎跳过了 j=2。当 j==2 时添加一个附加System.out.println()项,您会看到它出现。

于 2012-05-08T13:49:18.990 回答
1

3以及后来的6),是从这段代码中发生的......

        if (!((j*i % 3) != 0)) {
            System.out.println("J is " + j);
            System.out.println("I is " + i);
            System.out.println(j*i);
        }

实际上!((j*i % 3) != 0)是说,当j*i/3有 余数时0,它会运行该if语句中的代码。换句话说,只要是( , , , )的倍数,它就会运行此if代码j*i336912

逻辑很难遵循 - 最好这样写......

        if ((j*i % 3) == 0) {
            System.out.println("J is " + j);
            System.out.println("I is " + i);
            System.out.println(j*i);
        }

以原始方式,所有!符号和多个括号/大括号使其难以阅读。

于 2012-05-08T13:50:23.343 回答
1

您的下一个输出的原因i=1 j = 3是因为 forj=2j=1所有 3ifs都是错误的。

你有

  1. j=1 i=1
  2. 1*1 % 3这是1
  3. 1 != 0这是true
  4. !(true)这是false

  1. j=2 i=1
  2. 2*1 % 3这是2
  3. 2 != 0这是true
  4. !(true)这是false

最后

  1. j=3 i=1
  2. 3*1 % 3这是0
  3. 0 != 0这是false
  4. !(false)这是true

所以你打印出答案

如果你想看到我会移动的一切

System.out.println("J is " + j); 
System.out.println("I is " + i);

在这种方式之外,ifs它为循环的每次迭代打印

于 2012-05-08T13:51:06.807 回答