首页 > 代码库 > 几道java题目
几道java题目
15.下面程序执行的结果是?(B)
int i = 100;
while(true)
{
if (i++ > 100)
{
break;
}
System.out.println(i);
}
A. 100
B. 101
C. 102
D. 报错
解析:这道题的陷阱在于if(i++>100);我们平时总是if(i>100),但是这里多了个++,我们先剥去括号,首先,我们看到这是个无限循环,循环终止的条件是当i++>100时,循环的执行语句是打印i的值,
当然if (i++ > 100)
{
break;
}
也是循环语句的一部分,这也就是while循环嵌入if语句,和我们之前见到的for循环嵌入if语句相似,那么,我们必须真正明确,if语句里面break才是真正的执行语句......
那么我们把这段代码剥去括号再来分析
int i = 100;
while(true)
{
if (i++ > 100)
break; //真正的执行语句,除了循环条件满足,还需要if条件满足才能执行
System.out.println(i); //真正的执行语句,只要循环条件满足,该语句就会执行
}
我们必须分析这个语句的执行流程,显然break语句在打印语句之前,那么,意思就是说,如果在某一次循环,遇到了break条件,那么这一次循环的打印语句将不会执行
那么,由于这是个无限循环,循环次数取决于在什么时候跳出循环,所以,if(i++>100)这个语句里面,埋藏有陷阱,i++>100这是一个关系表达式,是一个关系运算,又因为后缀++是先参与运算再自增,所以,当然是先参与关系运算,也就是先判断i是否大于100,然后i自增1,那么100>100,显然不成立,因此,虽然此时,循环已经启动,或者说循环条件已经满足,但是if语句的条件不满足,所以不会执行break,因此,根据语句从上到下执行的顺序,这时候,就应该执行打印语句了,打印的是i的值,那么打印出来的i的值到底是多少呢??????是100还是101呢???
在这里,我们必须要明确先运算后自增的真正含义,这道题是先参与关系运算(>运算),然后自增,但是自增是立即自增,也就是说,自增1的过程甚至发生在break之前,虽然break是if条件判断后马上就要执行的语句,但是自增1的动作还在break语句执行之前,当然也在System.out.println(i);这个语句之前,所以System.out.println(i);执行时,i已经完成了自增1的过程,因此打印出来的值是101...
这道题的陷阱在于i++,也就是i自增1的过程是发生在if的条件语句内,所以我们不要以为i++发生在if的条件语句里面就不会生效,实际上,是生效的,这点和for循环语句类似,因为平时,我们经常看到for(int i=1;i<=100;i++){}这样的语句,这种语句的i++位于for的括号里面,实际上,他也是生效的,也就是说,每循环一次,i自增1,和下面的while语句相似
int i=1;
whie(i<=100){i++;}这时候,i++移到循环体语句里面去了,也是一样的效果
所以,打印出101后,会执行第二次循环,第二次,循环条件为true,循环满足,我们再看if条件,此时101>100成立,所以执行break,跳出循环,由于break在打印语句之前,所以在第二次打印之前,循环已经终结,所以不可能有第二次打印...因此结果101
因此,当我们不知道循环多少次时,但是需要循环在某个点跳出时,可以使用无限循环语句
while(true){
if(){break;}
}
不管是for循环,还是while循环,甚至是do while循环,我们只要记住,一切都是循环三要素的变换
例:看下面程序,说出a b c的值分别为多少??????
public class Test{
public static void main(String[] args){
int a=1,b=2;
int c=(a+b>3?a++:++b);
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
对于这道题,陷阱还是前缀++和后缀++,但是,先参与运算再自增,或者先自增后参与运算,到底是参与什么运算??????
int a=1,b=2;
int c=(a+b>3?a++:++b);
对于这道题,我们要注意a++表示a先参与运算,后自增1,++b表示b先自增1,再参与运算,那么到底是参与什么运算呢??????实际上,a+b>3这个关系表达式,或者说关系运算,这里面的a和b是从哪里来的呢???刚开始,我也被迷惑了,一定不要认为a++和++b去参与a+b>3的运算,一定要明白,后面的a++和++b是结果,为什么说是结果呢,只有在a+b>3判断出来是否成立后,决定了到底是返回a++还是++b后,a++和++b才能发挥其作用,所以说a+b>3这里面的a和b是继承自上面语句,所以a=1,b=2 1+2>3显然不成立,所以返回的是++b,刚才说过,++b表示先自增1,然后参与运算,那么至此,可以明白,b先自增1,值为3,然后参与赋值运算,因为是返回一个值,所以把b自增后的值赋给c,就是赋值运算,但是a++由于根本没有返回,或者说被屏蔽,所以a的值仍然是1,c的值为3
这道题更坑爹:且看我慢慢分析
boolean b=true;
if(b=false)
{
System.out.println("a");
}
else if(b)
{
System.out.println("b");
}
else if(!b)
{
System.out.println("c");
}
else
{
System.out.println("d");
}
对于这道题,我们首先看到,给boolean型变量b赋值为true,这个题最搞人的地方就是if括号里面的内容,我以前错误的认识为if括号里面不能是变量,其实这种理解是完全错误的,错得很深,我们现在来逐步揭开这道题的面纱,首先if(b=false),这里面b=false表示把常量false赋值给b,那么此时b就被赋值为false,所以不会打印a,然后if(b),由于上面在if(b=false)的括号里面,我们已经把b的值赋值为false,所以此处等效于if(false),所以也不会打印b,我说过,在if括号里面定义变量或者自增变量和在括号外面一样的效果,也就是说,前面b=false;给b赋值为false,b的值的改变会影响到后面的,这个地方也是我以前一直没有注意到的地方,这也是一个很微妙的地方,既然不会打印b,那么我们接着看,if(!b)其实!b这里面的b继承前面的false,所以!b为true,所以打印c,这道题目极其变态,应给予足够的重视
还不够熟练的是求和 比如sun=sum+i;这种,表示i是增量
还有就是循环里面嵌入if,要重视
for(){if(){}};
while(){if(){}};
公共类 public class ,一个源文件(.java文件)中,最多只能有一个public class (当然也可以没有)
几道java题目