Các tài liệu liên quan gcc không nói chuyện của Khởi tạo ra một khoảng nó chỉ nói về (Hoàn thành) Khởi hoặc Không khởi.
Khởi tạo một phần là gì?
Các tiêu chuẩn không xác định khởi tạo một phần đối tượng, hoặc là Hoàn thành khởi tạo hoặc Không khởi tạo. Khởi tạo một phần là thuật ngữ không chuẩn thường đề cập đến một tình huống mà bạn cung cấp một số trình khởi tạo nhưng không phải tất cả nghĩa là: Ít khởi tạo hơn kích thước của mảng hoặc số phần tử cấu trúc được khởi tạo.
Ví dụ:
int array[10] = {1,2}; //Case 1:Partial Initialization
(Hoàn thành) Khởi tạo hoặc Không khởi là gì?
Khởi tạo có nghĩa là cung cấp một số giá trị ban đầu cho biến được tạo cùng lúc khi tạo. tức là: trong cùng một câu lệnh mã.
Ví dụ:
int array[10] = {0,1,2,3,4,5,6,7,8,9}; //Case 2:Complete Initialization
int array[10]; //Case 3:No Initialization
Đoạn trích dẫn mô tả các hành vi cho Case 3
.
Các quy tắc liên quan đến một phần khởi tạo (Case 1
) được xác định rõ bởi tiêu chuẩn và các quy tắc này không phụ thuộc vào loại lưu trữ của biến được khởi tạo.
AFAIK, Tất cả các trình biên dịch chính thống đều tuân thủ 100% các quy tắc này.
Ai đó có thể xin vui lòng cho tôi biết những gì các tiêu chuẩn C và C++ nói về cấu trúc tự động một phần và khởi tạo mảng tự động?
Các tiêu chuẩn C và C++ đảm bảo rằng ngay cả khi một mảng số nguyên nằm trên lưu trữ tự động và nếu có ít initializers trong một danh sách cú đúp kín sau đó các yếu tố chưa được khởi tạo phải được khởi tạo để 0
.
C99 Chuẩn 6.7.8.21
Nếu có ít initializers trong một danh sách cú đúp kín hơn có những yếu tố hoặc thành viên của một tổng hợp, hoặc các ký tự ít trong một chuỗi chữ sử dụng để khởi tạo một mảng kích thước đã biết hơn là có các phần tử trong mảng, phần còn lại của tổng hợp sẽ được khởi tạo hoàn toàn giống như các đối tượng có thời gian lưu trữ tĩnh.
Trong C++, quy tắc được nêu với một chút khác biệt.
C++ 03 Chuẩn 8.5.1 Uẩn
Para 7:
Nếu có ít initializers trong danh sách hơn là có những thành viên trong tổng hợp, sau đó mỗi thành viên không được khởi tạo một cách rõ ràng phải là giá trị được khởi tạo (8.5). [Ví dụ:
struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };
khởi ss.a
với 1
, ss.b
với "asdf"
, và ss.c
với giá trị của một biểu thức có dạng int()
, có nghĩa là, 0
. ]
Trong khi giá trị khởi tạo được định nghĩa trong,
C++ 03 8,5 Initializers
Para 5:
Để giá trị khởi tạo một đối tượng kiểu T có nghĩa là:
- nếu T là một loại lớp (điều 9) với một hàm tạo do người dùng khai báo (12.1), sau đó hàm khởi tạo mặc định cho T được gọi (và khởi tạo bị hỏng nếu T không có hàm khởi tạo mặc định có thể truy cập );
- nếu T là một loại không phải là công đoàn mà không có một hàm tạo do người dùng khai báo, thì mỗi thành phần dữ liệu không thành phần và thành phần cơ bản của T được khởi tạo giá trị;
- nếu T là một loại mảng, thì mỗi phần tử được khởi tạo giá trị;
- nếu không, đối tượng được zero-khởi
Đối với C++ - một phần của câu hỏi, [câu hỏi này] (http://stackoverflow.com/questions/1613341/) có thể bạn quan tâm. –