今天同事在微信群里提出了一个问题,看似是一个面试题。
大体的意思就是补充下面if条件使得输出 Hello World
乍一看这个题目就是类似脑筋急转弯之类的问题。一看就不可能实现,本来if-else之类的逻辑处理就会占据很多程序员的大部分工作,如果这都可行,那些逻辑处理感觉就不可靠了。
首先来简单分析一下这个问题,在程序的运行过程中,对于if-else基本是一个穿行的执行过程,if和else部分是互斥的关系。不可能达到并行执行的程度。
不过我们还是分析一下,看有没有什么突破口。
if部分需要执行,必须是一个true的条件,而else部分执行则也是一个true的条件。假设if中的条件为X 则需要证明X=!X 这种情况在Java中还没有这种逻辑结构。Java是强类型语言,对于数据类型也不会有模糊边界。
和数据库方面关联起来,Oracle中的Null似乎是一个对这种情况很好的补充,因为null值是真假之外的未知值,可以使用下面的几个简单sql语句来说明。
n1@TEST11G> select *from dual where ''=null;
no rows selected
n1@TEST11G> select *from dual where ''!=null;
no rows selected
n1@TEST11G> select *from dual where '' is null;
D
-
X
1 row selected.
n1@TEST11G> select *from dual where '' is not null;
no rows selected
但是理论上能够说明,写pl/sql的时候还是比较纠结,不好实现,比如下面的pl/sql块中。
begin
if '' = null then
dbms_output.put_line('Hello ');
else
dbms_output.put_line('world');
end if;
end;
/
输出结果为 world
对于if 条件 ''=null却没法佐证对它的值取反得到的是未知值。
所以在这一点上,理论上还是可行的,但是目前还没有找到好的突破口来把真,假,未知的状态给结合起来。
这个时候我们来从程序本身看看有什么可以能做的事情,首先但从逻辑上硬扛是没有出路的。看来还得动点小脑筋。
我们可以在if中嵌入打印语句,直接输出Hello的部分,在else部分输出world。
首先我们结合System.out.println来输出下面的值。
System.out.println(System.out.printf("%s","Hello")==null);
System.out.println(System.out.printf("%s","Hello")!=null);
得到的结果如下:
Hellofalse
Hellotrue
所以我们可以利用System.out.printf ("%s","Hello")!=null来先输出Hello,只对if条件进行了验证,但是If中的实现没有调用,直接跳到了else部分。
所以最后的一种方法就是下面的样子。
if(System.out.printf("%s","Hello")==null){
System.out.print("Hello");
}
else{
System.out.println(" world");
}
运行就能够输出Hello World
不过这个时候继续深究一下,我们调用的System.out.printf会输出一个PrintStream的对象,是不是只有printf可行呢,可以在Java源代码中查看相关的方法,可以看到append也是一个可行的方式,输出也是PrintStream类型。
所以使用append的方式也是对的。
if(System.out. append("Hello")==null){
System.out.print("Hello");
}
else{
System.out.println(" world");
}
对于这个问题,可以看到很多看似不可能的方式其实还是能够实现的。不过话说过来,这也仅仅是一个类似脑筋急转弯的方式,在工作编程中可不要耍这种小聪明,得不偿失。
大体的意思就是补充下面if条件使得输出 Hello World
- if(){
System.out.print("Hello");
}
else{
System.out.println(" world");
}
首先来简单分析一下这个问题,在程序的运行过程中,对于if-else基本是一个穿行的执行过程,if和else部分是互斥的关系。不可能达到并行执行的程度。
不过我们还是分析一下,看有没有什么突破口。
if部分需要执行,必须是一个true的条件,而else部分执行则也是一个true的条件。假设if中的条件为X 则需要证明X=!X 这种情况在Java中还没有这种逻辑结构。Java是强类型语言,对于数据类型也不会有模糊边界。
和数据库方面关联起来,Oracle中的Null似乎是一个对这种情况很好的补充,因为null值是真假之外的未知值,可以使用下面的几个简单sql语句来说明。
n1@TEST11G> select *from dual where ''=null;
no rows selected
n1@TEST11G> select *from dual where ''!=null;
no rows selected
n1@TEST11G> select *from dual where '' is null;
D
-
X
1 row selected.
n1@TEST11G> select *from dual where '' is not null;
no rows selected
但是理论上能够说明,写pl/sql的时候还是比较纠结,不好实现,比如下面的pl/sql块中。
begin
if '' = null then
dbms_output.put_line('Hello ');
else
dbms_output.put_line('world');
end if;
end;
/
输出结果为 world
对于if 条件 ''=null却没法佐证对它的值取反得到的是未知值。
所以在这一点上,理论上还是可行的,但是目前还没有找到好的突破口来把真,假,未知的状态给结合起来。
这个时候我们来从程序本身看看有什么可以能做的事情,首先但从逻辑上硬扛是没有出路的。看来还得动点小脑筋。
我们可以在if中嵌入打印语句,直接输出Hello的部分,在else部分输出world。
首先我们结合System.out.println来输出下面的值。
System.out.println(System.out.printf("%s","Hello")==null);
System.out.println(System.out.printf("%s","Hello")!=null);
得到的结果如下:
Hellofalse
Hellotrue
所以我们可以利用System.out.printf ("%s","Hello")!=null来先输出Hello,只对if条件进行了验证,但是If中的实现没有调用,直接跳到了else部分。
所以最后的一种方法就是下面的样子。
if(System.out.printf("%s","Hello")==null){
System.out.print("Hello");
}
else{
System.out.println(" world");
}
运行就能够输出Hello World
不过这个时候继续深究一下,我们调用的System.out.printf会输出一个PrintStream的对象,是不是只有printf可行呢,可以在Java源代码中查看相关的方法,可以看到append也是一个可行的方式,输出也是PrintStream类型。
所以使用append的方式也是对的。
if(System.out. append("Hello")==null){
System.out.print("Hello");
}
else{
System.out.println(" world");
}
对于这个问题,可以看到很多看似不可能的方式其实还是能够实现的。不过话说过来,这也仅仅是一个类似脑筋急转弯的方式,在工作编程中可不要耍这种小聪明,得不偿失。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-1668974/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23718752/viewspace-1668974/