왜 (x)++의 크기가 컴파일됩니까?
다음 코드 조각이 발생했습니다.
int a = 3;
printf("%d", sizeof(a)++);
이것은 GCC 9.3.0 및 -std=c99로 컴파일될 것으로 보입니다.컴파일되지 않는 경우:
printf("%d", sizeof(3)++);
GCC가 오류를 출력합니다.
오류: 증분 피연산자로 필요한 l 값
첫 번째 스니펫을 컴파일하기 전에는 이러한 오류를 예상했을 것입니다.
포스트픽스 ++ 연산자의 피연산자는 C99 표준 기준으로 al 값이어야 합니다.
포스트픽스 증분 또는 감소 연산자의 피연산자는 적격 또는 비적격 실제 또는 포인터 유형을 가져야 하며 수정 가능한 l 값이어야 합니다.
측정 시스템 크기의 반환 값(예상대로):
연산자의 크기는 피연산자의 크기(바이트)를 산출하며, 이는 식 또는 형식의 괄호로 묶은 이름일 수 있습니다.크기는 피연산자의 유형에 따라 결정됩니다.결과는 정수입니다.피연산자의 유형이 가변 길이 배열 유형이면 피연산자가 평가되고, 그렇지 않으면 피연산자가 평가되지 않고 결과가 정수 상수가 됩니다.
결과의 값은 구현 정의이며, 해당 유형(부호가 없는 정수 유형)은 (및 기타 헤더)에 정의된 size_t입니다.
어떻게 그것이 가능합니까?sizeof(a)++
컴파일?정의되지 않은 행동인가요, 아니면 제가 뭔가를 놓치고 있나요?
그sizeof
는 함수가 아닌 연산자이며, 연산자로서 우선 순위가 있으며, 이는 다음의 값보다 낮은 C입니다.++
교환입니다.그러므로 그 구성은sizeof(a)++
와 동등합니다.sizeof a++
그것은 차례로 다음과 같습니다.sizeof (a++)
다음은 다음에 대한 사후 증분입니다.a
그것은 가치가 있기 때문에 완벽하게 합법적입니다.대신에a
당신은 가지고 있다3
lvalue가 아닌 경우 컴파일이 실패합니다.
언급URL : https://stackoverflow.com/questions/61663807/why-does-sizeofx-compile
'programing' 카테고리의 다른 글
매핑된 드라이브의 실제 경로를 확인하려면 어떻게 해야 합니까? (0) | 2023.06.15 |
---|---|
Select 문에서 변수 선언 및 설정 (0) | 2023.06.15 |
Oracle: DDL 및 트랜잭션 롤백 (0) | 2023.06.15 |
판다 고유 값 여러 열 (0) | 2023.06.15 |
C와 C++에서 const pointer-to-point는 무엇을 의미합니까? (0) | 2023.06.15 |