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
то же, что
std::vector
Ответ
Все стает просто, если знать, что конструкция 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])
В случае вектора компилятор может итератор заменить на указатель и наблюдается та же история. Но как только компилятор чуточку сделает по другому (а он имеет право), может получится все, что угодно.
Комментариев нет:
Отправить комментарий