Chào mừng bạn đến với vũ trụ của C++! Đối với câu hỏi của bạn, câu trả lời nằm trong một khái niệm gọi là 'Point-of-declaration'.
>>int x = 1;
>>{ int x = x; } // garbage value of x
Từ Mục: -3.3.1.1 (C++ Dự thảo Tiêu chuẩn) Điểm kê khai cho một tên là ngay sau khi declarator hoàn chỉnh của nó và trước khi khởi tạo của nó (nếu có), ngoại trừ được nêu dưới đây.
int x = 12;
{ int x = x; }
Ở đây; 'operator =' là trình khởi tạo. Bạn có thể nói rằng điểm khai báo cho 'x' chưa được đạt tới, vì vậy giá trị của 'x' không xác định.
>>int const arr = 3;
>>{ int arr[arr]; } // i am told this is perfectly valid and declares an array of 3 ints !!
Tại sao? Từ phần: -3.3.1.4 (Bản nháp chuẩn C++) Tên không phải địa phương vẫn hiển thị cho đến điểm khai báo tên địa phương ẩn nó. Ở đây, điểm tuyên bố đạt được tại ';' tính cách. Vì vậy, giá trị có thể nhìn thấy trước của 'arr' được sử dụng tức là = 3.
Ngoài ra, bạn có thể muốn biết rằng sau đây là hợp lệ: -
const int e = 2;
{ enum { e = e }; } // enum e = 2
Từ Mục: -Chapter-3.3.1.4 (Bản thảo chuẩn C++): - Điểm khai báo cho điều tra viên ngay sau định nghĩa của điều tra viên.
Nhưng, không làm điều này
const int Spades = 1, Clubs = 2, Hearts = 3, Diamonds = 4;
enum Suits
{
Spades = Spades, // error
Clubs, // error
Hearts, // error
Diamonds // error
};
Tại sao? Bởi vì điều tra viên được xuất khẩu đến phạm vi kèm theo của điều tra. Trong ví dụ trên, các bảng liệt kê Spades, Clubs, Hearts, và Diamonds được khai báo. Bởi vì các điều tra viên được xuất khẩu đến phạm vi bao quanh, chúng được coi là có phạm vi toàn cầu. Các định danh trong ví dụ đã được định nghĩa trong phạm vi toàn cục. Vì vậy, nó là một lỗi.
Để biết thêm chi tiết và cạm bẫy (:-)), đọc trên phần 3.3 'Vùng khai báo và phạm vi' từ Dự thảo Tiêu chuẩn C++, nếu bạn quan tâm, bạn có thể giữ bản pdf từ here (http://www.research.att.com/~bs/SC22-N-4411.pdf).
Bạn có thể làm rõ câu hỏi của mình không? Bạn đang đề cập đến sự khác biệt nào? – trshiv
Tôi sử dụng cùng một tên khi tryiing những thứ đơn giản như int x = x, nó không hợp lệ, tôi thử làm nó cho các cấu trúc phức tạp như int arr [arr] nó hợp lệ. Làm tôi bối rối. –
Có lẽ điều này là hiển nhiên, nhưng bất kể mã trên có hợp lý với trình biên dịch hay không, do đó bạn khó có thể nhìn thấy nó trong mã hiện tại và không khôn ngoan để đưa nó vào của riêng bạn. – flies