對一道if-else相關的程式題的簡單分析

jeanron100發表於2015-05-23
今天同事在微信群裡提出了一個問題,看似是一個面試題。
大體的意思就是補充下面if條件使得輸出 Hello World
  1. if(){
    System.out.print("Hello");
    }
    else{
    System.out.println(" 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");
}
對於這個問題,可以看到很多看似不可能的方式其實還是能夠實現的。不過話說過來,這也僅僅是一個類似腦筋急轉彎的方式,在工作程式設計中可不要耍這種小聰明,得不償失。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1668974/,如需轉載,請註明出處,否則將追究法律責任。

相關文章