xem xét sau mã ví dụ:initialisation của biến tĩnh với chính nó
#include <iostream>
static int bar = bar;
int main()
{
int foo = foo;
std::cout << "foo = " << foo << std::endl;
std::cout << "bar = " << bar << std::endl;
}
tôi nhận được sau cảnh báo trình biên dịch:
main.cpp: In function 'int main()':
main.cpp:7:15: warning: 'foo' is used uninitialized in this function [-Wuninitialized]
int foo = foo;
^
Output:
foo = 0
bar = 0
tôi mong đợi cảnh báo này như foo là được sử dụng unitialised. Thay vì 0, 'foo' có thể là bất cứ thứ gì. Tự gán không được xác định.
Nhưng tại sao việc tự gán 'thanh' không được cảnh báo? Đây có phải là sự phân công của 'bar' được xác định hoặc hành vi không xác định và tại sao?
Tôi biết, các biến tĩnh của kiểu dữ liệu elementar được khởi tạo bằng '0' nhưng trong trường hợp này, biến 'thanh' được sử dụng trong quá trình khởi tạo. Tôi tự hỏi, nếu điều này được xác định hành vi và '0' là đầu ra dự kiến. (Mà sẽ giải thích, rằng không có cảnh báo trình biên dịch xảy ra).
Khởi tạo tĩnh có nhiều hơn một giai đoạn. – chris
Có thể do các biến tĩnh trong phạm vi toàn cục luôn luôn được khởi tạo bằng 0, do đó trình biên dịch biết 'bar' là có hiệu quả' 0' trước khi gán. –
@ FrédéricHamidi: Lưu ý rằng chúng không được khởi tạo bằng 0, nhưng được xây dựng mặc định. Điều đó tạo nên sự khác biệt cho cấu trúc/lớp học! – anderas