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++?

Author: Cœur, 2011-02-22

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 [] czy E1[E2] jest tożsame z (*((E1)+(E2))). Ze względu na zasady konwersji, które Zastosuj do operatora binarnego +, Jeśli E1 jest obiektem tablicy (równoważnie wskaźnikiem do element początkowy obiektu tablicy) i E2 jest liczbą całkowitą, E1[E2] oznacza E2-th element E1 (licząc od zera).

Nie mówi nic wymagającego kolejności argumentów [], aby były zdrowe.

 35
Author: Chris Lutz,
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.

 24
Author: Michael Goldshteyn,
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