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 :))
Cũng chỉ như:
và
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:
Hoặc còn sáng sủa hơn trong vài trường hợp:
Thế tại sao không phải là
Chẳng phải
int[]
trongnew int[][10]
đóng vai trò kiểu dữ liệu của phần tử sao.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ẽ.
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[]
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:
Thì nó sẽ tương đồng khi sử dụng:
-> 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.
Sự khác nhau có thể do cách hiểu ở đoạn:
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.
Thay đổi quy tắc để nâng cao trải nghiệm à