이 C 문은 무엇을 수행합니까?C - int가 printf와 같지 않음?
i=!({ printf("%d\n",r); });
I 및R은 정수이다.
나는 그것을 인식하지 않는 pycparser를 사용하여 분석을 시도하고 오류 제기하고 있습니다 :
pycparser.plyparser.ParseError: :7:6: before: {
감사
이 C 문은 무엇을 수행합니까?C - int가 printf와 같지 않음?
i=!({ printf("%d\n",r); });
I 및R은 정수이다.
나는 그것을 인식하지 않는 pycparser를 사용하여 분석을 시도하고 오류 제기하고 있습니다 :
pycparser.plyparser.ParseError: :7:6: before: {
감사
이없는 표준 C입니다,하지만 GCC statement expression 확장은 허용하는 표현식에 블록을 넣고 블록의 마지막 명령문 값을 리턴합니다. 이 printf
0 (즉, 그것이 성공 반환 있지만 문자를 인쇄하지 않은 i
경우 1로 설정
i = !printf("%d\n",r);
:
블록이 여기에 자체 표현이다 단 하나의 문이 있기 때문에
,이에 해당합니다) 그렇지 않으면 0입니다. 이printf
은 성공할 때 항상 2 자 이상을 출력하므로
i
은 항상 0이됩니다.
GNU C extension을 사용하여 표현식이 예상되는 블록 문을 쓸 수있는 것처럼 보입니다. block 문의 값은 블록의 마지막 표현식의 값입니다. 예를 들어
:
int x = ({ int a = 1; a+2; });
3
와 x
를 초기화합니다. 내가 원래 코드가 아마 어두운 의해 생성 같은데요
i=!printf("%d\n",r);
:
i=!({ printf("%d\n",r); });
가 동일 : 때문에 확장이 매우 유용 보이지 않는 특정 경우
마술 매크로입니다.
동의어,이 코드는별로 의미가 없습니다. printf
이 텍스트 작성에 실패했거나 성공했는지 여부를 확인하려는 것 같습니다. 그러나 사양에 따르면 printf
은 성공시 기록 된 바이트 수를 반환하고 오류 인 경우 음수 값을 반환합니다. 따라서 0 문자를 쓰는 경우에만 0을 반환하며 마지막에 \n
이 나타나지 않고 i
은 항상 오류가 있거나없이 0
이됩니다.
표준 C에서는 유효하지 않습니다. –
내부 세미콜론을 제거하십시오. – SPlatten
이것은 GNU 명령문 표현식 확장입니다. – Stargateur