source

size of(my_arr)[0]이 컴파일되고 size of(my_arr[0])이 같은 이유는 무엇입니까?

factcode 2022. 9. 12. 11:34
반응형

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

반응형