이쁜왕자 만쉐~~

세미콜론(;) 없는 hello world 본문

프로그래밍/C프로그래밍 문제

세미콜론(;) 없는 hello world

이쁜왕자 2021. 6. 16. 23:25

"Hello World without Semicolon" 이라고, hello world 를 출력하는 C 프로그램을 작성하는데, 세미콜론(;) 을 사용하지 말고 작성하라는 문제가 있습니다.


일단 C 표준을 완전히 따르면서, 컴파일 워닝조차 없는 답은 아직 없는 것 같습니다.

일단 C 표준에서는 int main() 을 사용하도록 되어 있기 때문에, 반드시 return 0; 가 필요하고, 여기에서 세미콜론이 사용됩니다. 다만, return 을 생략하더라도 컴파일러가 이정도는 워닝만 출력하고 알아서 처리해주기 떄문에, 약간의 융통성을 발휘할 수 있습니다. 아니면 표준을 어기고 void main() 을 쓰는 방법도 있습니다. 어느 것을 선택하든 워닝은 발생합니다.


문제의 핵심은 printf("hello world\n"); 을 어떻게 하면 세미콜론 없게 바꿀 수 있냐는 것이겠죠.

검색해 보면, if, while, switch 의 세가지 답이 나옵니다.

#include  <stdio.h>    
int main()    
{    
  // using if
  if (printf("hello world\n")) { }

  // using while
  while (!printf("hello world\n")) { }    

  // using switch    
  switch (printf("hello world\n")) { }


이 세가지 모두 세미콜론 없이 하나의 문장이 수행됩니다. 
참고로 while 의 경우 1번만 수행하게 하기 위해서 ! (=not) 이 필요합니다.
printf 를 puts 같은 함수로 바꾸는 변형이 존재하지만, 문제의 핵심은 아닙니다.

.....................
if, while, switch 는 너무 유명하기 때문에, 이것들을 사용하지 않는 방법이 있는가? 라는 파생 문제도 존재합니다.

조금 어려운 방법으로 아래와 같은 답이 존재합니다.

#include <stdio.h>  
int main (int argc, char *argv[printf("hello world\n")]) 

}

사실 main 함수의 파라미터를 임의로 넣어도 컴파일은 되기 때문에 이런 식으로 변형도 가능합니다.

#include <stdio.h>
int main (int a[printf("hello world\n")]) 
{
}

 

728x90
1 Comments
  • 프로필사진 unused 2021.10.24 21:52 C99 이후부터는 return 0; 이 생략되면 자동으로 마지막에 return 0; 을 넣은것과 같은 효과가 됨이 보장되어 있습니다. https://en.cppreference.com/w/c/language/main_function 그러므로 C99 이후로는 return 0;으로 인한 워닝은 발생하지 않습니다.

    ... If the returned type is compatible with int and control reaches the terminating }, the value returned to the environment is the same as if executing return 0; ...
댓글쓰기 폼