2013-05-25 8 views
35

Poniżej przedstawiono oczywistą i zwyczajną deklarację tablicową i inicjalizację w Javie.Deklaracja i inicjalizacja macierzy w języku Java. Tablice zachowują się inaczej, gdy pozycja ich indeksów indeksów zmienia się w ich deklaracji.

int r[], s[];  //<------- 
r=new int[10]; 
s=new int[10]; 

Bardzo podobny przypadek zachowuje się inaczej, gdy pozycja [] zmienia się w rachunku deklaracji podobnego jak pokazano poniżej.

int []p, q[];  //<------- 
p=new int[10]; 
q=new int[10][10]; 

Proszę spojrzeć na deklarację. Pozycja [] została zmieniona z r[] na []p. W takim przypadku tablica q zachowuje się jak tablica tablic typu int (która jest zupełnie inna niż w poprzednim przypadku).

Pytanie: Dlaczego jest q, w tej deklaracji int []p, q[]; traktowane jako dwuwymiarowa tablica?


Dodatkowe informacje:

następującą składnię wygląda słaby.

int []a[]; 

to jednak zgodne w porządku i po prostu zachowuje się jak int a[][]; lub int [][]a;.

Dlatego wszystkie poniższe przypadki są ważne.

int [][]e[][][]; 
int [][][][][]f[][][][]; 
+3

Wypróbuj ten jeden 'public int numbers() [] {return new int [5]; } ': D –

+1

Ha, wygląda na to, że mój strzał w ciemności trafia w cel :) –

+0

Osobiście wolę zadeklarować jedną zmienną tablicową na linię i zainicjować zmienną w tej samej linii, aby uniknąć tego rodzaju pomyłek. –

Odpowiedz

43

Spójrz na JLS on Arrays:

[] może pojawić się jako część typu na początku zgłoszenia, lub jako część declarator dla danej zmiennej, lub obu.

i

Wsporniki są dozwolone w declarators jako ukłon w stronę tradycji C i C++. Ogólne zasady dla deklaracji zmiennej, jednakże zezwolić wsporniki pojawiać się zarówno na ich rodzaje i declarators, więc lokalnej deklaracji zmiennej:

float[][] f[][], g[][][], h[]; // Yechh! 

jest równoznaczne z serii zgłoszeń:

float[][][][] f; 
float[][][][][] g; 
float[][][] h; 

Tak na przykład:

int []p, q[]; 

tylko

int[] p, q[] 

który jest w rzeczywistości

int p[]; int q[][] 

Reszta są podobne.

+2

To dziwne, że 'q' staje się tablicą dwuwymiarową. –

+0

@AmirPashazadeh - To wcale nie jest dziwne, jeśli udajesz, że zmienne są otoczone nawiasami, a składnia Perla "moje $ x, $ y;" jest taka sama jak "moja ($ x, $ y);". Jeśli wykonasz teoretyczne grupowanie, otrzymasz 'int [] p, q []' jako 'int [] (p, q [])' => przemiennie zamieniając się w 'int [] (p), int [] (q [ ]) '=>' int [] p, int [] q [] '=>' int p [], int q [] [] ' – DVK

10

Rozsądny sposób deklarowania zmiennej jest

type name 

Więc jeśli typ jest int[] powinniśmy napisać

int[] array 

Nigdy nie zapisuj

int array[] 

to bełkot (choć to legal)

Powiązane problemy