본문 바로가기

(비정기) Dlbo's Post

프로그래머들의 지적 유희? 장난? 직장 상사에게 혼나는 법?



하암...

비주얼 스튜디오 6.0,

혹은 gcc나 ANSI C 표준을 따르는 컴파일러에서 작동하는 코드입니다.

(비주얼 스튜디오 닷넷은 ANSI C 표준이 아닙니다.)

아 참,

저게 뭐하는 거냐구요?

.......

두 개의 한자리 양의 정수를 입력받아 합을 출력하는 프로그램 입니다.

.......

직장 상사한테 뺨때기 한대 맞기 딱 좋죠?

것도 합이 두 자리 수가 되면 답이 안나와요.

-_-;

두 자리 수가 될 경우 나오게 하는 방법이 있긴 하지요.

printf를 활용 하되, 좀 색다른 방법을 써야 합니다.

....

저 코드가 어떻게 돌아가느냐구요?

.......

C언어 표준을 따르니 돌아가지요 뭐 -_-;

#include <stdio.h>를 빼도 gets와 putchar는 built-in 함수라 해서 컴파일러 자체에 내장되어 있습니다.

컴파일 하는 순간 해당 헤더가 없다면, 컴파일러가 직접 구현해서 포함시켜 주는거지요.

참... 당황스럽지요?

-_-;

main 앞에 있던 int나 void도 사라졌습니다.

main() 안에는 int형 인자가 최대 2개까지 들어갈 수 있다고 알려졌습니다만...

무슨 함수라도 부른 것 처럼 변수 이름만 들어가 있습니다.

동시에 gets에서 이 데이터형도 알 수 없는 변수에 입력받은 문자열을 집어넣고 있구요.

putchar에서 또한 알수없는 이상한 짓을 합니다.

근데... 프로그램은 잘 동작해요.

아까 말씀드린 것처럼 합의 결과도 1자리수 일 때만.

-_-)_b

사실 main 앞에는 int가 생략되어 있고,

괄호 내부의 n 또한 int n인데 int가 생략되어 있는겁니다.

ANSI C 표준이라면, 데이터형을 생략하면 자동으로 int형이 되지요.

그건 둘째치고...

근데 왜 int형에다가 문자열을 집어넣느냐...



입력형식을 봅시다

한자리 숫자 두개에요.

1과 2를 넣는다면

'1 2\n'

.....

빈칸까지 합해 정확히 4바이트 맞지요?

....

문제 없습니다.

-_-)_b

putchar 에서는 첫번째와 세번째 숫자만 골라내어 처리하도록 나머지연산까지 써서 처리합니다.

이로써 동작하는 거지요.

-_-)_b

이런 엽기적으로 코드를 단축시켜 버리는 기법을 숏 코딩이라 합니다.

대표적인 사람으로 Short Coding이라는 책의 저자인 일본인 Ozy 씨가 있지요.(필명 -_-)

심심하다면 자신의 코드를 한번 극단적으로 줄여보세요. ㅋㅋ


Short coding의 원리들.

if문 -> &&연산으로 대체합니다. &&연산은 앞의 식이 성립할때만 뒤의 식을 실행합니다.
      -> 될수있도록 사용을 자제합니다. 함수 내에서는 물론이고, for문의 조건판별부분에도 쓸 수 있습니다.
scanf문 -> EOF가 들어오면 -1을 리턴합니다. 예외처리시 if(scanf(어쩌구저쩌구) == EOF) break;
                이렇게 처리하기 보단... 그냥 입력 루프에 while(~scanf(어쩌구저쩌구))로 처리하시면 한방!

.....

숏코딩 한번 도전해보세요~

건투를 빕니다. -_-)_b