2010-11-10 18 views
60

Mój przyjaciel mówi, że można napisać program w języku C, który wydrukuje "Witaj świecie" bez IF/WHILE/FOR i bez średników. Po minimalnych badaniach powiedziałem jej, że nie jest to możliwe. Czy to możliwe?Witaj, świecie w C bez średników i bez IF/WHILE/FOR oświadczenia

+4

pokrewne: http://stackoverflow.com/questions/2754493/hello -world-in-c-with-no-semi-colons – kennytm

+33

Dlaczego chcesz? Jeśli na klawiaturze brakuje średnika, masz głębsze problemy. –

+3

Wygląda na to, że twój przyjaciel lubi te zakamuflowane zawody C i PERL? – winwaed

Odpowiedz

73

Próbowałam znaleźć "przenośny" sposób kradzież średnika z pliku włączającego. To działa pod Linuksem:

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

Powoduje to jeden typedef unsigned char uint8_t stać mój printf.

Kolejną sztuczką, która zadziałała, było #define od każdego standardowego typu stdint, dzięki czemu stdint.h ogranicza się do garści średników.

Oba te elementy leżą płasko na FreeBSD, ponieważ używają prywatnych pośrednich typów (takich jak __uint8_t), co oznacza, że ​​usunięcie typedef kończy się niepowodzeniem w cytowanym przykładzie i uniemożliwia mi pomyślne usunięcie wszystkich nie-średników w drugim przypadku.

Wygląda na to, że powinno być możliwe wykradanie czystego średnika z pliku włączającego. Czy ktoś może poprawić swoją próbę?

+5

+1 za bardzo wyjątkowe podejście ... Podoba mi się. – cdhowie

+0

Nie działa w systemie Windows (kompilator Microsoft C wersja 17) – ZhekaKozlov

+1

#include zawiera wiele średników –

195
#include <stdio.h> 

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

Jeśli twój przyjaciel mówi: „Och, nie można używać albo przełączyć”, a następnie:

#include <stdio.h> 

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

main() nie ma zwrotu ;-) – tur1ng

+24

@ tur1ng: To nie jest potrzebne. – cdhowie

+0

@iam: [Rep cap] (http://meta.stackexchange.com/questions/7237/how-does-reputation-work). – kennytm

41

Jestem rozdarty, czy się sugerować tym, ponieważ to zależy od dokładnego brzmienia pytanie, ale:

#error hello world 

(jeśli nic innego, być może będzie to zażegnać Followup „jak można wydrukować cześć świat bez main” ...)

+1

Proszę nie bądź tak trudny dla siebie. –

+2

Głównym problemem związanym z tą techniką jest to, że w rzeczywistości nie tworzy ona żadnego działającego programu. Jednak z pewnością jest to sprytne. A sprytne rozwiązanie nigdy nie jest złym rozwiązaniem. – cdhowie

+0

@cdh, ale chcesz powiedzieć "nadal jestem królem" –

16

Można też obejść ograniczenia jak

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

Co o:

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

C nie jest fajne :)

+1

czy możesz wyjaśnić, co to jest wstawić wywołanie funkcji w innym bloku deklaracji parametrów funkcji? Nie mogę tego zrozumieć. –

+0

Naprawdę chciałbym wiedzieć ... :-) –

+0

printf zwraca int (w tym przypadku przewidywalny), co oznacza, że ​​pełna definicja funkcji jest int main (void * HAHA [12]) { } Aby dowiedzieć się, że magiczna liczba to 12, musisz najpierw wykonać instrukcję printf. – Clearer

17

Możliwe jest napisanie programu C, który wydrukuje "Witaj świecie" bez IF/WHILE/FOR i bez średników.

Łatwo. Zwróć uwagę, że w C rozróżniana jest wielkość liter.

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

if to słowo kluczowe w C, IF nie jest.

+0

Dlaczego głosowanie w dół? Podążyłem za listem, do samego przypadku pytania. Wydaje się nieco surowe, gdy samo pytanie jest jednym z tych bezużytecznych pytań "jak możemy legalnie nadużywać C". – JeremyP

+1

@JeremyP Nie głosowałem w inny sposób, ale nikt nie lubi adwokata od zasad. –

+8

@Dan Neely: Co to jest prawnik zasad? Bądźmy szczerzy, pierwotne pytanie nie jest tak naprawdę poważnym pytaniem programistycznym, dlaczego więc ludzie poważnie traktują język w odpowiedzi na policzek i głosują na niego? – JeremyP

2

można użyć instrukcji switch, aby uzyskać moc pożądania, tu jest kod poniżej

#include<stdio.h> 

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

return 0; 
} 

nadzieję, że to pomoże Ci

Powiązane problemy