2017-12-04 3 views
3

이 C 문은 무엇을 수행합니까?C - int가 printf와 같지 않음?

i=!({ printf("%d\n",r); }); 

I 및R은 정수이다.

나는 그것을 인식하지 않는 pycparser를 사용하여 분석을 시도하고 오류 제기하고 있습니다 :

pycparser.plyparser.ParseError: :7:6: before: {

감사

+10

표준 C에서는 유효하지 않습니다. –

+0

내부 세미콜론을 제거하십시오. – SPlatten

+3

이것은 GNU 명령문 표현식 확장입니다. – Stargateur

답변

3

이없는 표준 C입니다,하지만 GCC statement expression 확장은 허용하는 표현식에 블록을 넣고 블록의 마지막 명령문 값을 리턴합니다. 이 printf 0 (즉, 그것이 성공 반환 있지만 문자를 인쇄하지 않은 i 경우 1로 설정

i = !printf("%d\n",r); 

:

블록이 여기에 자체 표현이다 단 하나의 문이 있기 때문에

,이에 해당합니다) 그렇지 않으면 0입니다. 이 printf은 성공할 때 항상 2 자 이상을 출력하므로 i은 항상 0이됩니다.

7

GNU C extension을 사용하여 표현식이 예상되는 블록 문을 쓸 수있는 것처럼 보입니다. block 문의 값은 블록의 마지막 표현식의 값입니다. 예를 들어

:

int x = ({ int a = 1; a+2; }); 

3x를 초기화합니다. 내가 원래 코드가 아마 어두운 의해 생성 같은데요

i=!printf("%d\n",r); 

:

i=!({ printf("%d\n",r); }); 

가 동일 : 때문에 확장이 매우 유용 보이지 않는 특정 경우

마술 매크로입니다.

동의어,이 코드는별로 의미가 없습니다. printf이 텍스트 작성에 실패했거나 성공했는지 여부를 확인하려는 것 같습니다. 그러나 사양에 따르면 printf은 성공시 기록 된 바이트 수를 반환하고 오류 인 경우 음수 값을 반환합니다. 따라서 0 문자를 쓰는 경우에만 0을 반환하며 마지막에 \n이 나타나지 않고 i은 항상 오류가 있거나없이 0이됩니다.