Operator indeksu dolnego: []
Składnia
postfix-expression [ expression ]
Uwagi
Wyrażenie postfiksu (które może być również wyrażeniem podstawowym), po którym następuje operator indeksu dolnego , [ ]
określa indeksowanie tablicy.
Aby uzyskać informacje o tablicach zarządzanych w języku C++/CLI, zobacz Tablice.
Zazwyczaj wartość reprezentowana przez wyrażenie-postfiks jest wartością wskaźnika, taką jak identyfikator tablicy, a wyrażenie jest wartością całkowitą (w tym typami wyliczonymi). Jednak wszystko, co jest wymagane składniowo, jest to, że jedno z wyrażeń ma typ wskaźnika, a drugi jest typu całkowitego. W związku z tym wartość całkowita może znajdować się w pozycji wyrażenia-prefiksu, a wartość wskaźnika może znajdować się w nawiasach w wyrażeniu lub pozycji indeksu dolnego. Rozważmy następujący fragment kodu:
int nArray[5] = { 0, 1, 2, 3, 4 };
cout << nArray[2] << endl; // prints "2"
cout << 2[nArray] << endl; // prints "2"
W poprzednim przykładzie wyrażenie nArray[2]
jest identyczne z wyrażeniem 2[nArray]
. Przyczyną jest to, że wynik wyrażenia e1[e2]
indeksu dolnego jest podawany przez:
*((e2) + (e1))
Adres zwracany przez wyrażenie nie jest e2 bajtami z adresu e1. Zamiast tego adres jest skalowany w celu uzyskania następnego obiektu w tablicy e2. Na przykład:
double aDbl[2];
Adresy aDb[0]
i aDb[1]
mają 8 bajtów — rozmiar obiektu typu double
. To skalowanie zgodnie z typem obiektu odbywa się automatycznie przez język C++ i jest definiowane w operatorach dodawania i odejmowania operandów typu wskaźnika.
Wyrażenie indeksu dolnego może mieć wiele indeksów dolnych, jak pokazano poniżej:
expression1 [ expression2 ] [ expression3 ] ...
Wyrażenia indeksu dolnego są skojarzone od lewej do prawej. Wyrażenie indeksu dolnego po lewej stronie, wyrażenie1 [ wyrażenie2 ], jest oceniane jako pierwsze. Adres, który wynika z dodawania wyrażenia expression1 i expression2 tworzy wyrażenie wskaźnika, a następnie wyrażenie3 jest dodawane do tego wyrażenia wskaźnika w celu utworzenia nowego wyrażenia wskaźnika itd. do czasu dodania ostatniego wyrażenia indeksu dolnego. Operator pośredni (*
) jest stosowany po obliczeniu ostatniego wyrażenia w indeksie dolnym, chyba że końcowa wartość wskaźnika adresuje typ tablicy.
Wyrażenia z wieloma indeksami dolnymi odnoszą się do elementów tablic wielowymiarowych. Tablica wielowymiarowa jest tablicą, której elementy są tablicami. Na przykład, pierwszy element tablicy trójwymiarowej jest tablicą z dwoma wymiarami. Poniższy przykład deklaruje i inicjuje prostą dwuwymiarową tablicę znaków:
// expre_Subscript_Operator.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
#define MAX_ROWS 2
#define MAX_COLS 2
int main() {
char c[ MAX_ROWS ][ MAX_COLS ] = { { 'a', 'b' }, { 'c', 'd' } };
for ( int i = 0; i < MAX_ROWS; i++ )
for ( int j = 0; j < MAX_COLS; j++ )
cout << c[ i ][ j ] << endl;
}
Indeksy dodatnie i ujemne
Pierwszym elementem tablicy jest element 0. Zakres tablicy C++ wynosi od tablicy[0] do tablicy[rozmiar — 1]. Język C++ obsługuje jednak indeksy dodatnie i ujemne. Ujemne indeksy podrzędne muszą mieścić się w granicach tablicy; jeśli tak nie jest, wyniki są nieprzewidywalne. Poniższy kod przedstawia dodatnie i ujemne indeksy dolny tablicy:
#include <iostream>
using namespace std;
int main() {
int intArray[1024];
for (int i = 0, j = 0; i < 1024; i++)
{
intArray[i] = j++;
}
cout << intArray[512] << endl; // 512
cout << 257[intArray] << endl; // 257
int *midArray = &intArray[512]; // pointer to the middle of the array
cout << midArray[-256] << endl; // 256
cout << intArray[-256] << endl; // unpredictable, may crash
}
Ujemny indeks dolny w ostatnim wierszu może wygenerować błąd czasu wykonywania, ponieważ wskazuje on adres 256 int
pozycji niższych w pamięci niż początek tablicy. Wskaźnik midArray
jest inicjowany na środku ; dlatego jest możliwe (ale niebezpieczne) użycie zarówno dodatnich intArray
, jak i ujemnych indeksów tablicy na nim. Błędy indeksu dolnego tablicy nie generują błędów czasu kompilacji, ale dają nieprzewidywalne wyniki.
Operator indeksu dolnego jest dojeżdżający. W związku z tym tablica wyrażeń[index] i index[array] mają gwarancję, że są równoważne, o ile operator indeksu dolnego nie jest przeciążony (zobacz Przeciążone operatory). Pierwsza forma jest najczęstszą praktyką kodowania, ale działa.
Zobacz też
Wyrażenia przyrostków
Wbudowane operatory, pierwszeństwo i kojarzenie języka C++
Tablice
Tablice jednowymiarowe
Tablice wielowymiarowe
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla