Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

отрицательное число в индексах

Oбычно в индексах массивов, контейнеров используется беззнаковое число. К тому же unsigned(-1) компилятором преобразовывается на большое положительное число Так почему же в индексах отрицательное число дает не такой эффект? Например:
int n[] = {1, 2, 3 }; int* pn = &n[1]; if (n - (&n[-1]) == 1) std::cout << pn[-1]; // выведет n[1 - 1] т.е. n[0]
или
std::vector::end()[-1]
то же, что
std::vector::back();


Ответ

Все стает просто, если знать, что конструкция a[b] - это всего навсего *(a+b). Поэтому, выражение
int* pn = &n[1];
преобразуется в
int* pn = &(*(n+1)); int* pn = n+1;
и потом выражение
pn[-1]
преобразуется в *(pn-1) => *(n+1-1) => *(n+0) => n[0]
Аналогично расскрывается и выражение n - (&n[-1])
В случае вектора компилятор может итератор заменить на указатель и наблюдается та же история. Но как только компилятор чуточку сделает по другому (а он имеет право), может получится все, что угодно.

Комментариев нет:

Отправить комментарий