2010-11-10 195 views
60

我的朋友說可以編寫一個C程序,它將打印「hello world」而不用IF/WHILE/FOR並且不用分號。經過最少的研究後,我告訴她這是不可能的。可能嗎?C語言中沒有分號且沒有IF/WHILE/FOR語句的世界你好世界

+4

相關:http://stackoverflow.com/questions/2754493/hello -c-with-no-semi-colonons – kennytm 2010-11-10 18:40:28

+33

你爲什麼想要?如果你的鍵盤缺少分號,你會遇到更深層次的問題。 – 2010-11-10 18:41:45

+3

聽起來像你的朋友在那些模糊的C和PERL比賽中狂歡? – winwaed 2010-11-10 18:48:17

回答

73

我一直試圖找到一個 「便攜式」 的方式從包含文件中竊取分號。這在Linux下工作:

int main(int ac, char **av) 
{ 
#define typedef 
#define uint8_t a[printf("hello world\n")] 
#include <stdint.h> 
} 

這導致一個typedef unsigned char uint8_t成爲我的printf。

工作的另一個訣竅是到#define以外的每一個標準stdint類型,使stdint.h減少到一堆分號。

這兩者在FreeBSD上都是一成不變的,因爲它使用了私有中間類型(如__uint8_t),這意味着在引用的示例中刪除typedef失敗,並阻止我成功刪除其他情況下的所有非分號。

似乎應該可以從包含文件中乾淨地竊取分號。任何人都可以改進我的嘗試?

+5

+1非常獨特的方法...我喜歡它。 – cdhowie 2010-11-11 03:48:18

+0

無法在Windows(微軟的C編譯器版本。17) – ZhekaKozlov 2015-01-14 12:53:45

+1

的#include 它包含了許多分號 – 2015-01-14 12:54:16

195
#include <stdio.h> 

int main() { 
    switch (printf("Hello, world!\n")) {} 
} 

如果你的朋友說:「哦,你不能用開關任一個」,則:

#include <stdio.h> 

int main(int argc, char *argv[printf("Hello, world!\n")]) {} 
+3

main()沒有返回;-) – tur1ng 2010-11-10 18:49:25

+24

@ tur1ng:它不需要一個。 – cdhowie 2010-11-10 18:49:45

+0

@iam:[Rep cap](http://meta.stackexchange.com/questions/7237/how-does-reputation-work)。 – kennytm 2010-11-10 19:50:52

41

我撕裂是否暗示這一點,因爲它取決於的確切寫法的問題,而是:

#error hello world 

(如果不出意外,或許就會避開後隨 「你怎麼不main打印Hello World」 的...)

+1

請不要這麼苛責自己 – 2010-11-10 19:08:24

+2

的主要問題與這種技術,它實際上並沒有產生一個執行的程序。但是,它確實很聰明。而聰明的解決方案永遠不是一個不好的解決方案。 – cdhowie 2010-11-10 19:11:46

+0

@cdh但你的意思是說「我還是王」 – 2010-11-10 19:15:08

16

你也可以像解決方法

#define X i##f 
#define Y whi##le 
#define Z f##or 
#define W swi##tch 
15

什麼限制:

#include <stdio.h> 
int main(void *HAHA[printf("Hello world!\n")]) {} 

不是C :)涼爽

+1

你能解釋什麼是在另一個函數參數聲明塊中插入一個函數調用嗎?我很難理解這一點。 – 2012-07-26 22:58:21

+0

我真的很想知道... :-) – 2012-08-26 20:15:08

+0

的printf返回一個int(可預測一個在這種情況下也是如此),這意味着功能的完整定義,數據類型爲int的main(void *的HAHA [12]){ }爲了找出幻數是12,你必須先執行printf語句。 – Clearer 2014-12-12 22:16:14

17

有可能編寫一個C程序,該程序將打印沒有IF/WHILE/FOR且沒有分號的「hello world」。

簡單。請注意,C區分大小寫。

int main() 
{ 
    if (printf("Hello, World\n")){} 
} 

if在C中的關鍵字,IF不是。

+0

爲什麼投票?我遵守這封信,就這個問題而言。當問題本身就是一種無用的「我們如何合法濫用C」的問題時,似乎有點苛刻。 – JeremyP 2010-11-11 14:28:30

2

你可以使用switch語句來得到你的願望輸出,這裏是低於

#include<stdio.h> 

int main() 
{ 
    switch(printf("hello world")) 

return 0; 
} 

希望的代碼,這將幫助你