1. 程式人生 > 其它 >對一道if-else相關的程式題的簡單分析(r5筆記第45天)

對一道if-else相關的程式題的簡單分析(r5筆記第45天)

今天同事在微信群裡提出了一個問題,看似是一個面試題。 大體的意思就是補充下面if條件使得輸出 Hello World

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"); }
對於這個問題,可以看到很多看似不可能的方式其實還是能夠實現的。不過話說過來,這也僅僅是一個類似腦筋急轉彎的方式,在工作程式設計中可不要耍這種小聰明,得不償失。