size of(my_arr)[0]이 컴파일되고 size of(my_arr[0])이 같은 이유는 무엇입니까?
이 코드가 컴파일되는 이유는 무엇입니까?
_Static uint32_t my_arr[2];
_Static_assert(sizeof(my_arr) == 8, "");
_Static_assert(sizeof(my_arr[0]) == 4, "");
_Static_assert(sizeof(my_arr)[0] == 4, "");
처음 두 개의 단언은 분명히 맞지만, 저는 마지막 줄이 실패할 것이라고 예상했을 것입니다. 제 이해로는 다음과 같습니다.sizeof()
는 배열로 취급할 수 없는 정수 리터럴로 평가해야 합니다.즉, 다음 행이 실패했을 때와 같은 방법으로 실패합니다.
_Static_assert(4[0] == 4, "");
흥미롭게도, 다음 항목은 실제로 컴파일되지 않습니다(같은 작업을 수행해야 합니다).
_Static_assert(*sizeof(my_arr) == 4, "");
오류: 유니리 '*'('긴 서명되지 않은 int' 있음) _Static_assert(*sizeof(my_arr) == 4, ")의 잘못된 형식 인수입니다.
만약 문제가 된다면, 저는 gcc 5.3.0을 사용하고 있습니다.
sizeof
함수가 아닙니다.단항 연산자처럼!
또는~
.
sizeof(my_arr)[0]
라고 해석하다sizeof (my_arr)[0]
이건 그냥sizeof my_arr[0]
용장 괄호로 묶습니다.
이건 마치!(my_arr)[0]
라고 해석하다!(my_arr[0])
.
일반적으로 포스트픽스 연산자는 C의 프레픽스 연산자보다 우선도가 높습니다. sizeof *a[i]++
라고 해석하다sizeof (*((a[i])++))
(포스트픽스 오퍼레이터)[]
그리고.++
에 적용되다a
처음에 프리픽스 연산자*
그리고.sizeof
).
(이것은 의 표현 버전입니다.sizeof
. 괄호 안의 타입명을 사용하는 타입 버전도 있습니다.sizeof (TYPE)
이 경우 패런이 필요하게 되며,sizeof
구문을 참조해 주세요).
sizeof
에는, 2개의 「기능」이 있습니다.sizeof(type name)
그리고.sizeof expression
전자는 한 쌍이 필요합니다.()
그 논쟁에 대해.하지만 후자 - 논쟁으로 표현된 - 는 - 을 가지고 있지 않습니다.()
그 논쟁에 대해.신경쓰지 말아요.()
인수에 사용하는 것은 인수의 일부가 아니라 인수의 표현으로 보입니다.sizeof
구문 자체입니다.
부터my_arr
컴파일러에서는 타입명이 아닌 오브젝트명으로 알려져 있습니다.sizeof(my_arr)[0]
컴파일러에 의해 실제로 인식되고 있다.sizeof
표현식에 적용됨:sizeof (my_arr)[0]
,어디에(my_arr)[0]
는 인수식입니다.그()
어레이 이름을 둘러싼 것은 완전히 불필요한 것입니다.전체 표현은 다음과 같이 해석됩니다.sizeof my_arr[0]
이것은 이전과 동등합니다.sizeof(my_arr[0])
.
(이것은, BTW가, 이전이sizeof(my_arr[0])
또한 불필요한 한 쌍을 포함한다.()
.)
는 다소 널리 퍼진 오해이다sizeof
의 구문에는 어떤 이유로든()
그 논쟁에 대해.이러한 오해는 다음과 같은 표현을 해석할 때 사람들의 직관을 오도하는 것이다.sizeof(my_arr)[0]
.
[]
보다 우선도가 높다sizeof
.그렇게sizeof(my_arr)[0]
와 같다sizeof((my_arr)[0])
.
우선 순위 테이블에 대한 링크를 다음에 나타냅니다.
의 버전을 sizeof
식을 매개 변수로 사용하는 연산자.활자를 사용하는 것과 달리 괄호는 필요 없습니다.따라서 피연산자는 단순하게(my_arr)[0]
(일부러)
언급URL : https://stackoverflow.com/questions/46653406/why-does-sizeofmy-arr0-compile-and-equal-sizeofmy-arr0
'source' 카테고리의 다른 글
JavaScript에서 두 숫자 사이의 난수 생성 (0) | 2022.09.12 |
---|---|
Firebase 클래스에 직렬화할 속성이 없습니다. (0) | 2022.09.12 |
단일 Amazon RDS 인스턴스에 생성할 수 있는 데이터베이스 수 (0) | 2022.09.12 |
Node.js 및 Express를 사용하여 POST할 때 요청 본문에 액세스하는 방법 (0) | 2022.09.12 |
jQuery: 특정 클래스 이름을 가진 div가 있는지 확인합니다. (0) | 2022.09.12 |