對一道if-else相關的程式題的簡單分析
今天同事在微信群裡提出了一個問題,看似是一個面試題。
大體的意思就是補充下面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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一道簡單的題
- 從一道簡單的“SpringBoot配置檔案”相關面試題,我就能知道你的水平Spring Boot面試題
- 一道與 for 相關的字串面試題字串面試題
- 聊聊一道簡單的javascript面試題JavaScript面試題
- 一道簡單的分配演算法題,求解演算法
- 簡單瞭解 MySQL 中相關的鎖MySql
- 一道關於逆向的實戰CTF題目分析
- 通過一道簡單的例題了解Linux核心PWNLinux
- 一道面試題的分析面試題
- 編譯程式(compiler)的簡單分析編譯Compile
- 一道演算法題的分析演算法
- 視口相關單位的應用 —— 別說你懂CSS相對單位CSS
- 無程式碼相對於低程式碼的優勢分析
- 簡單瞭解一下關於程式碼簽名證書的相關內容
- 簡單格路計數相關
- SAP MM 採購訂單與相關合同的價格差異問題分析
- LeetCode演算法簡單題--JavaScript(每天一道題)LeetCode演算法JavaScript
- 對 MySQL 慢查詢日誌的簡單分析MySql
- 簡單程式的時間複雜度分析時間複雜度
- 小程式視訊旋轉的相關問題
- 網路相關工具簡單彙總
- Python容器相關簡單效能測試Python
- GC相關知識簡單學習GC
- HandlerThread解析以及相關問題分析thread
- if-else if-else 的用法
- 對多執行緒程式,單核cpu與多核cpu如何工作相關的探討執行緒單核
- 關於《龍族幻想》的系統以及簡單分析
- 關於PHP字串的一道面試題PHP字串面試題
- 關於js的一道題(大佬勿笑)JS
- 電腦硬體相關簡單知識
- Java String的相關性質分析Java
- 關於盒模型相關的問題模型
- 對CSRF的簡單理解
- 簡單的UrlDns鏈分析DNS
- Optional簡化空值判斷,減少程式碼中的if-else程式碼塊
- 陪玩原始碼,與時間、日期相關的程式碼分析原始碼
- 一道單連結串列題引發的思考
- 簡單分析AutoIt指令碼的反編譯和程式碼格式化問題指令碼編譯
- HTTP相關的應用程式HTTP