2010-04-19 2 views
23
int main(void) 
{ 
    return('yes', *"no", **main, *********printf) ("hello world!\n") *0; 
} 

출력이 hello world!인데 실제로 어떻게 작동합니까? 정말어떻게이 "안녕 세상!" 프로그램 작업?

+2

'return ('yes', * "no", ** main, ********* printf) ("마법의! \ n") * 0;'그건 그렇고, 나는 그것을 컴파일했다. 실제로 작동합니다 ._. – Warty

+0

당신은 소프트웨어를 작성하는 이상한 스타일이 있습니다! 당신은 저에게 직업을 제공하지 않을 것입니다. :-) – Oleg

+0

C는 실제로 언어가 잘못되었습니다 :-) –

답변

46

두 가지 :

  1. 기능 포인터는 다른 포인터와 같은 역 참조하지 않습니다.

    int main(void) 
    { 
        return('yes', *"no", main, printf) ("hello world!\n") *0; 
    } 
    

    그리고의 값과리스트의 마지막 요소를 사용하여 : *main == main

  2. 쉼표 우리가 포인터를 단순화하면 목록이 목록 그래서

의 마지막 요소의 값을 반환 분리 목록

int main(void) 
{ 
    return printf("hello world!\n") *0; 
} 

printf 문자의 수를

인쇄 반환
int main(void) 
{ 
    return 13 *0; 
} 

그리고 13 * 0은 독자의 연습 문제입니다.

+10

당신의 그라비아 아이콘은 이상하지만 그래도 좋은 대답 –

+0

내 친구들 중에는 콧수염을 키우는 경연 대회가 있었고, 나는 면도해야했습니다. 그래서 나는 그날 가짜 콧수염을했습니다. – rampion

+3

+1 독자의 연습을 위해 +1) : –

12
('yes', *"no", **main, *********printf) 

은 쉼표 연산자가 피연산자를 평가하고 마지막 표현식의 값을 반환하기 때문에 *********printf으로 평가됩니다. *********printf은 역 참조 함수 포인터가 동일한 함수 포인터를 생성하므로 printf와 같습니다. 그것은 아무것도하지 않습니다.

다음으로 첫 번째 괄호 printf가 "hello world! \ n"에 적용되어 화면에 텍스트가 인쇄됩니다. printf 함수는 쓰여진 문자의 수를 반환합니다. 그런 다음이 숫자에 0이 곱해지고 product가 main 함수에 의해 반환됩니다.

관련 문제