java“ &&”运算符的行为很奇怪

时间:2018-10-16 13:23:09

标签: java

我正在尝试通过java打印图案。我正在使用for循环和条件语句,但&&运算符存在一些问题。我不明白为什么它对我的代码特别奇怪。以下是我的代码。

public class Test{
public static void main(String ar[]){
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            if((i!=0 && j!=0)){
                System.out.print("*");
            }else{
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}
}

输出

unknown@unknown-Lenovo-E40-80:~/Desktop/java_test$ javac Test.java
unknown@unknown-Lenovo-E40-80:~/Desktop/java_test$ java Test

 ****
 ****
 ****
 ****

以上输出与我的预期完全不同。第1行未打印为什么?我只是想跳过(i = 0和j = 0)位置的元素。

5 个答案:

答案 0 :(得分:3)

让我们看看会发生什么:

对于第1行,您得到i = 0且j = 0到4,因此您将获得5个空格(因为i = 0总是以{{ 1}})。 对于所有其他行,false为!= 0,而i仍为0至4,因此您得到1个空格和4个星。

如果将打印空间更改为下划线,则会得到以下输出:

j
  

我只是想跳过(i = 0和j = 0)位置的元素

当前,您正在跳过所有索引都不为0的所有元素(_____ _**** _**** _**** _**** 转换为“ i != 0 && j != 0不是0 i不是0“)。

如果只想跳过一个元素,则需要将表达式更改为jif( i == 0 && j == 0) { skip },将第二个表达式转换为“ if not both {{1 }} if( !(i == 0 && j == 0) ) { do_whatever_you_need }为0”(请注意,这意味着任何一个都可以为0,只有两者的组合都满足条件)。

答案 1 :(得分:2)

第1行正在打印,但是打印时带有空格。

原因是因为您正在检查(i != 0 && j != 0)。在外部循环的第一次迭代中,i为0,因此控制权转到else块。

答案 2 :(得分:1)

布尔代数表示!a &&!b ==!(a || b)。您要说的是!a &&!b ==!(a && b)。

您对

的测试
if((i!=0 && j!=0))

等效于

if(!(i==0 || j == 0))

根据您的最终声明,这不是您想要的内容:“我只是想跳过(i = 0和j = 0)位置元素。”

因此,您可以通过几种方式更改测试。第一个可能是最简单的-反转块。操作最少,最容易理解。

if (i==0 && j==0)
    System.out.print(" ");
else
    System.out.print("*");

或者,如果要保持顺序,请更改if语句。反转您对(i == 0 && j == 0)的要求:!(a && b)==(!a ||!b)

if( (i!=0) || (j!=0) )
    System.out.print("*");
else
    System.out.print(" ");

答案 3 :(得分:0)

第一行打印空白,就像我在注释中添加的一样,因为在这一点i == 0并打印了4次,但是第二,第三和其他尝试将首先打印因为在这四个j == 0之后将等于零*

for(int i=0;i<5;i++){
    for(int j=0;j<5;j++){
        if((i!=0 && j!=0)){
            System.out.print("*");
        } else {
            System.out.print(" "); //THIS IS PRINTING THE FIRST LINE
        }
    }
    System.out.println();
}

答案 4 :(得分:0)

在第一行i=0中,因此在i的第一次迭代中,控制移至else部分,并且在第一行中打印了空格而不是星号。在第一个索引j=0的每次迭代中。因此,其他部分再次执行,并且在第一列中再次打印空格而不是星号。并且在所有其他地方都印有星号。

public class Test{

    public static void main(String ar[]){
        for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                if((i!=0 && j!=0)){
                    System.out.print("*");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }

}