2010-08-12 25 views
4

可能重複:
What’s the 「condition」 in C interview question?幫助的if-else在C程序

​​

與兩個printf語句得到執行這樣的條件下更換條件。 你不能有一個循環或其他東西在主要() 我發現這個代碼在線,我試圖想想它背後的邏輯,但我不能。 請幫我 感謝

+4

有一個原因,如果/ **其他** – 2010-08-12 21:29:37

+2

這是這個作業嗎?如果是這樣,請標記爲這樣。 – 2010-08-12 21:30:14

+3

你確定你的實現已經記錄了'void main()'是有效的嗎?否則,這不是一個C程序。因爲它在任何地方都是有效的,所以首選'int main()'。 – 2010-08-12 21:34:48

回答

3

這是一個有點像作弊,但...

void main() 
{ 
     if (printf("Hello ") == 0) 
       printf("Hello "); 
     else 
       printf("World"); 
} 
+0

首先非常感謝。 以及它不完全作弊,如果你給你最好的,但仍然無法破解它..謝謝你的幫助。讚賞它 – Ritik 2010-08-12 21:42:16

+3

它的作弊 - 它不運行'printf(「你好」)'它的意圖運行,和替代'printf'甚至忘記包含空間,這意味着用戶可見的錯誤。 – Steve314 2010-08-13 01:04:08

+1

@ Steve314:謝謝你指出,沒有注意到空間,我糾正了它。我同意,這是作弊,但問題本身就是愚蠢的(Ritik沒有冒犯意味):如果你想執行兩條語句,你不要使用'if/else'構造。最後,它完成了這項工作,這是重要的:D – nico 2010-08-13 06:11:18

3
CONDITION = printf("Hello") == 0; 
+0

對我來說沒有意義!?你改變代碼結構,這是什麼意圖? – 2010-08-12 21:33:48

+0

@rubberboots他建議用這個表達式替換條件 – zoran404 2014-10-06 00:13:20

35
if(fork() == 0) 
    ... 
+2

這裏有一個競爭條件,因爲你不知道哪個printf將被首先執行,但規則只是說「兩個printf語句都被執行」,對訂單沒有任何限制,所以對我來說很好。 – 2010-08-12 21:35:31

+0

+1,很好!值得注意的是,這隻適用於Unix,但我敢打賭,這是誰想出的問題是尋找... – 2010-08-12 21:39:31

+3

你可以通過使條件'!fork()||解決訂購問題。 !等待(NULL)' – caf 2010-08-12 22:32:21

2

你問不完全是,但以下至少會打印相同的結果就好像兩個printf被執行時一樣:

 if(printf("Hello ") & 0) 
      printf("Hello "); 
    else 
      printf("World"); 
0
#include <stdio.h> 
main() 
{ 
    if (printf("Hello "),0) 
    printf("Hello "); 
    else 
    printf("World"); 
    return 0; 
} 
20

雖然我真的很喜歡rubber boots的答案背後的想法,我認爲可能有一個更微不足道的答案。該說明明確指出,您可能沒有在 main()內部的代碼,但在之外有額外的行怎麼辦?

#define else 

void main() 
{ 
    if(1) 
      printf("Hello "); 
    else 
      printf("World"); 
} 

更新這裏是一個由在評論Zan Lynx建議的替代方案。它只添加了CONDITION附近括號之間的代碼:

void main() 
{ 
    if(1 
#define else 
     ) 
      printf("Hello "); 
    else 
      printf("World"); 
} 
+4

+1爲邪惡。我喜歡。 – 2010-08-12 21:46:06

+0

+1非常好的主意。我懷疑這不會是答案的意圖,但這更像是一個類似於C的解答(它太冗長了);-) – 2010-08-12 21:51:58

+3

你甚至可以在尊重你只修改CONDITION的情況下做到這一點。設置CONDITION等於換行符,#define else,換行符,1 – 2010-08-12 21:56:53

3

這是另一種方法。它不如fork那樣好,因爲它往往只能工作一半時間(因此不能完全解決問題),但更好的是信息永遠不會顛倒過來。

#include <stdio.h> 

int main() { 
     if (ftell(stdout) % 2 || (printf(" "), main())) 
       printf("Hello "); 
     else 
       printf("World\n"); 
} 

它首先查詢stdout以查看已打印多少以及字符數是否爲奇數。如果是這樣,它會打印一個字符來反轉奇偶校驗和遞歸。遞歸調用看到偶數個字符並打印「hello」並返回0. 0將最上面的調用發送到else,打印「world」。

終端中的字符數必須是奇數才能起作用。

+1

我喜歡再次調用main()的想法。我想你甚至可以通過if(*「x」++ =='x'?main(),0:1)'確定性地打印「Hello World」。這可能需要在最近的編譯器上進行編譯器切換,以允許修改字符串文字。 – x4u 2010-08-13 02:39:34

+0

@x:謝謝,我正在絞盡腦汁。我相信C標準庫中有合法的全局變量可以使用,但我想不出任何...太生鏽。如果他只是宣佈argc和argv,那會更容易。 – Potatoswatter 2010-08-13 02:46:05

2

跨越式直懸崖所指出的Potatoswatter,我提供以下內容:

#include <stdio.h> 
#include <errno.h> 

int main() 
{ 
    if ((errno == 42) || (errno=42, main())) 
    printf("hello, "); 
    else 
    printf("world."); 
    return 0; 
} 
 
C:\...>gcc -Wall q3472196.c 

C:\...>a 
hello, world. 
C:\...> 

我確實有主聲明,並給它一個返回值關閉了一些警告。在stdio.h中甚至可能有一些合適的邪惡定義,所以我們不必聲明errno

+0

'if(stdin == 0 ||(stdin = 0,main(),0))'?這擺脫了errno.h include,並且不需要main()中的return語句。不過stdio.h仍然需要包含,儘管printf()也可以在沒有它的情況下編譯。 – x4u 2010-08-13 08:34:23

+0

@ x4y,鬼鬼祟祟。我喜歡。 – RBerteig 2010-08-13 08:58:37