Dostęp do tablic przez indeks [array] w C i C++
Jest takie małe podchwytliwe pytanie, które niektórzy ankieterzy lubią zadawać z jakiegokolwiek powodu:]}
int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?
Z tego, co rozumiem, a[b]
zostaje zamienione na *(a + b)
i ponieważ dodawanie jest przemienne, nie ma znaczenia ich kolejność, więc 2[a]
jest naprawdę *(2 + a)
i to działa dobrze.
Czy jest to gwarantowane przez specyfikacje C i / lub c++?
2 answers
Tak. 6.5.2.1 ust. 1 (standard C99) opisuje argumenty operatora []
:
Jedno z wyrażeń ma typ " wskaźnik do obiektu
type
", drugie wyrażenie ma typ integer, a wynik ma typ "type
".
6.5.2.1 pkt 2 (podkreślenie dodane):
Wyrażenie postfix, po którym następuje wyrażenie w nawiasach kwadratowych
[]
jest zapisem oznaczenie elementu obiektu tablicy. The definicja operatora dolnego[]
czyE1[E2]
jest tożsame z(*((E1)+(E2)))
. Ze względu na zasady konwersji, które Zastosuj do operatora binarnego+
, JeśliE1
jest obiektem tablicy (równoważnie wskaźnikiem do element początkowy obiektu tablicy) iE2
jest liczbą całkowitą,E1[E2]
oznaczaE2
-th elementE1
(licząc od zera).
Nie mówi nic wymagającego kolejności argumentów []
, aby były zdrowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 02:16:58
Ogólnie 2[a]
jest tożsame z a[2]
i jest to równoważne zarówno w C, jak i w c++ (przy założeniu braku przeciążenia operatora), ponieważ jak masz na myśli, przekłada się to odpowiednio na *(2+a)
lub *(a+2)
. Ponieważ operator plus jest przemienny, obie formy są równoważne.
Chociaż formularze są równoważne, proszę ze względu na wszystko, co jest święte (i przyszłych programistów utrzymania), preferuj formę" a[2] " niż inne.
P. S., Jeśli zostaniesz zapytany o to w Wywiad, proszę zrobić dokładną zemstę w imieniu społeczności C / C++ i upewnij się , że poprosisz rozmówcę o podanie wszystkich sekwencji trygrafu jako warunek wstępny do udzielenia odpowiedzi. Być może to zniechęci go do zadawania takich (bezwartościowych, jeśli chodzi o programowanie czegokolwiek) pytań w przyszłości. W dziwnym przypadku, gdy rozmówca zna wszystkie dziewięć sekwencji trygrafu, zawsze możesz podjąć kolejną próbę zdeptania ich za pomocą pytanie o porządek niszczenia wirtualnych klas bazowych - pytanie, które jest tak samo nieistotne w codziennym programowaniu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 02:26:47