Coding/Misc

낮설은 C/C++ 코드

smores 2008. 2. 21. 06:45

본인은 C/C++을 그럭저럭 오래 사용해왔다. 물론 평범한 문법과 평범한 코딩 스타일을 고수하면서...

최근 KLPD에 드나들면서 많은 것들을 배운다. 그중 재밌는 글을 하나 보았는데, 여러 언어로 구현한 동일한 프로그램의 소스 코드의 차이를 보여주는 글이다. 제목은 Original Fox Trot Comic using C code. Standard Perl Statement Perl one-liner 이고 링크는 여기: http://kldp.org/node/27158

덧글들을 보면 "I will not throw paper airplanes in class" 라는 스트링을 500번 반복하여 프린트 하는 프로그램들인데, 평범함만을 아는 본인에겐 for loop 또는 while loop 정도밖에 생각해 본적이 없다. 그런데 ruby나 perl 등의 언어로는 간결한 (또는 한줄만의) 프로그램으로 이 목적을 실행할 수 있단다 (정말인진 잘 모르겠지만...) 특히 흥미로운 점은 perl, python의 *500 또는 x500 이란 구문으로 for loop 등이 겉으로 드러나지 않아서 무척 흥미롭다.

perl

perl -e 'print "...snip..."x500';

python
print "I will not throw paper airplanes in class\n" * 500

ruby
500.times { puts "I will not throw paper airplanes in class\n" }

forth
500 0 do ." I will not throw paper airplanes in class." cr loop

ruby, forth의 경우는 일종의 for loop 인 셈이다. 물론 basic도 가능할 것이다. 여전히 for loop 사용하겠지만.

yabasic
for i=1 to 500: print "...": next

그런데 C/C++에서도 for loop 사용하지 않고도 멋지게 해치우는 모습이 있다. 특히 pre-ansi style C로 구현하는 경우는 코드 자체가 무척 낯설게 보인다. 역시 C/C++ !!!

pre-ansi C

main(_){_<=500&&printf("I will not throw paper airplanes in class\n",_)&&main(_+1);}

C++
#include <iostream>
main(){struct C{C(){std::cout<<"I will not throw paper airplanes in class\n";}}c[500];}

위의 C/C++는 Borland C++ 5.5 command line version(freeware) 및 Visual Studio 2005 Command Prompt 모드에서 테스트해 보았음.