我正在尝试通过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)位置的元素。
答案 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“)。
如果只想跳过一个元素,则需要将表达式更改为j
或if( 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();
}
}
}