2010-11-10 38 views
60

Bạn tôi nói có thể viết chương trình C sẽ in "hello world" mà không cần IF/WHILE/FOR và không có dấu chấm phẩy. Sau khi nghiên cứu tối thiểu tôi đã nói với cô ấy rằng điều đó là không thể. Có thể không?Xin chào thế giới trong C mà không có dấu chấm phẩy và không có câu lệnh IF/WHILE/FOR

+4

liên quan: http://stackoverflow.com/questions/2754493/hello -world-in-c-with-no-semi-colons – kennytm

+33

Tại sao bạn muốn? Nếu bàn phím của bạn bị thiếu dấu chấm phẩy, bạn có vấn đề sâu hơn. –

+3

Âm thanh như bạn bè của bạn vui chơi trong những cuộc thi C và PERL bị làm phiền? – winwaed

Trả lời

73

Tôi đã cố gắng để tìm một "xách tay" cách ăn cắp một dấu chấm phẩy từ một tập tin bao gồm. Tính năng này hoạt động dưới Linux:

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

Điều này làm cho bản in typedef unsigned char uint8_t trở thành bản in của tôi.

Một thủ thuật khác hoạt động là #define cách mọi loại tiêu chuẩn stdint sao cho stdint.h giảm xuống thành một loạt dấu chấm phẩy.

Cả hai loại này đều phẳng trên FreeBSD vì nó sử dụng loại trung gian riêng (như __uint8_t) có nghĩa là xóa typedef không thành công trong ví dụ được trích dẫn và ngăn tôi loại bỏ thành công tất cả dấu chấm phẩy trong trường hợp khác.

Có vẻ như bạn có thể đánh cắp dấu chấm phẩy một cách rõ ràng từ tệp bao gồm. Có ai có thể cải thiện nỗ lực của tôi không?

+5

+1 cho một cách tiếp cận rất độc đáo ... Tôi thích nó. – cdhowie

+0

Không hoạt động trong Windows (Microsoft C compiler ver. 17) – ZhekaKozlov

+1

#include nó chứa nhiều dấu chấm phẩy –

195
#include <stdio.h> 

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

Nếu bạn của bạn nói "oh, bạn không thể sử dụng chuyển đổi một trong hai", sau đó:

#include <stdio.h> 

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

chính() không có trả lại ;-) – tur1ng

+24

@ tur1ng: Không cần thiết. – cdhowie

+0

@iam: [Cấp độ đại diện] (http://meta.stackexchange.com/questions/7237/how-does-reputation-work). – kennytm

41

Tôi rách về việc có nên đề nghị này vì nó xoay quanh các từ ngữ chính xác của câu hỏi, nhưng:

#error hello world 

(nếu không có gì khác, có lẽ nó sẽ ngăn chặn một followup "làm thế nào để bạn in hello world mà không main" ...)

+1

xin đừng quá khó khăn cho bản thân mình –

+2

Vấn đề chính với kỹ thuật này là nó không thực sự tạo ra một chương trình chạy được. Tuy nhiên, nó chắc chắn là thông minh. Và một giải pháp thông minh không bao giờ là một giải pháp tồi. – cdhowie

+0

@cdh nhưng bạn muốn nói "tôi vẫn là vua" –

16

Bạn cũng có thể workaround hạn chế như

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

gì về:

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

không phải là C mát mẻ :)

+1

bạn có thể giải thích những gì nó là leagal để chèn một cuộc gọi chức năng trong một khối khai báo tham số chức năng? Tôi khó có thể hiểu được điều đó. –

+0

Tôi thực sự muốn biết ... :-) –

+0

printf trả về một int (cũng có thể dự đoán được trong trường hợp này), nghĩa là định nghĩa đầy đủ của hàm, là int (void * HAHA [12]) { } Để tìm ra số ma thuật là 12, trước tiên bạn phải thực hiện lệnh printf. – Clearer

17

có thể viết chương trình C sẽ in "hello world" mà không có IF/WHILE/FOR và không có dấu chấm phẩy.

Dễ dàng. Lưu ý rằng C phân biệt chữ hoa chữ thường.

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

if là từ khóa trong C, IF thì không.

+0

Tại sao bỏ phiếu xuống? Tôi đã tuân theo bức thư, cho chính trường hợp của câu hỏi. Nó có vẻ hơi khắc nghiệt khi bản thân câu hỏi là một trong những câu hỏi vô nghĩa "cách chúng ta có thể lạm dụng C" một cách hợp pháp. – JeremyP

+1

@ JeremyP Tôi đã không bỏ phiếu theo cách khác, nhưng không ai thích luật sư quy tắc. –

+8

@Dan Neely: Luật sư quy tắc là gì? Hãy trung thực, câu hỏi ban đầu không chính xác là một câu hỏi lập trình nghiêm túc, vậy tại sao mọi người lại lấy một cái lưỡi trong má trả lời nghiêm túc và bỏ phiếu xuống? – JeremyP

2

bạn có thể sử dụng câu lệnh switch để có được kết quả mong muốn của bạn, đây là mã dưới đây

#include<stdio.h> 

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

return 0; 
} 

hy vọng điều này sẽ giúp bạn

Các vấn đề liên quan