01/10/2018, 17:24

Tại sao lại là int[n][][]

Như chúng ta đã biết, Java, C# khai báo mảng 2 chiều m x n như sau:

int[][] arr = new int[m][];
for (int i = 0; i < m; i += 1)
	arr[i] = new int[n];

Cách khai báo trên cho thấy: arr là mảng 1 chiều, mỗi phần tử của arr có kiểu int[]
Cấu trúc khai báo mảng của một kiểu dữ liệu là

T[] t = new T[length];

Vậy tại sao khai báo mảng nhiều cấp thì ngôn ngữ lại không tuân thủ quy tắc này, lẽ ra phải là

int[][] arr = new int[][m];

Có vẻ như việc này có liên quan đến cách khai báo mảng tĩnh của C++, tuy nhiên cách khai báo mảng động sử dụng new và con trỏ của C++ vẫn tuân thủ quy tắc T[].
Mọi người nghĩ sao, có ai cảm thấy “ngứa mắt” giống như mình không :))

Văn Dương viết 19:32 ngày 01/10/2018

Cũng chỉ như:

black hole

hố đen

Quen cái nào thì thấy cái đó nó xuôi.
Java thì không biết nhưng int[][] trong C# vốn nó không tương đồng với int** của C++.

C# rõ ràng là nó giống:

int*[] data = new int*[10];

Hoặc còn sáng sủa hơn trong vài trường hợp:

int [,] data = new int[5,10];
int[,,] data = new int[5,10,15];
Trần Hoàn viết 19:29 ngày 01/10/2018

Thế tại sao không phải là

int[][] data = new int[][10];

Chẳng phải int[] trong new int[][10] đóng vai trò kiểu dữ liệu của phần tử sao.

Văn Dương viết 19:24 ngày 01/10/2018

Tại sao lại phải áp dụng cách nghĩ của C++ vào C#, Java. Vốn chúng nó là những ngôn ngữ khác nhau ?
Ngay như cách của C++ cũng đâu chặt chẽ.

Trần Hoàn viết 19:36 ngày 01/10/2018

Thì mình đâu có lấy ví dụ của C++ về kiểu dữ liệu đâu, mình nói về chính C# và Java mà. Cách khai báo mảng của C# và Java đối với mọi kiểu dữ liệu <T> đều là T arr = new T[length]; ngoại trừ kiểu []

Văn Dương viết 19:26 ngày 01/10/2018

Theo ý kiến đoán mò. [][] hoặc [][][] dùng khai báo biến n chiều. Trong đó các [] phía bên trái thể hiện trọng số cao hơn.

Khi khai báo:

int[][] data = new int[level0][];
data[0] = new int[level1];

Thì nó sẽ tương đồng khi sử dụng:

int value = data[level0][level1];

-> Các [] có trọng số ngang hàng đều được sắp xếp cùng vị trí cả khi khai báo và sử dụng.

Văn Dương viết 19:30 ngày 01/10/2018

Sự khác nhau có thể do cách hiểu ở đoạn:

int*[5];
int[5][];

Với C++, int* được hiểu là kiểu biến.
Nhưng với C#, int[5] được tách thành int và [5]. int là kiểu biến,[5] là mức phần tử gốc.

Trần Hoàn viết 19:39 ngày 01/10/2018


Thay đổi quy tắc để nâng cao trải nghiệm à

Bài liên quan
0