2013-07-12 45 views
6
int a = a ; 

Theo quy tắc của toán tử gán, nó nên đọc dòng từ phải sang trái. Sau khi nhìn thấy 'a' trình biên dịch không khai báo nên cung cấp cho lỗi biên dịch.
Nhưng it is giving garbage value. Hãy làm rõ nó.Tại sao điều này không cung cấp lỗi biên dịch?

+0

Nó sẽ không thực sự cho phép 'a' được tuyên bố - với rác - và sau đó có lẽ in rác đó? Cũng dựa trên logic của bạn không có gì sẽ có thể được chỉ định trong một tuyên bố. 'int a = 1;' sẽ thất bại vì phép gán "đọc từ phải sang trái" và do đó 'a' không khai báo; Không? – ChiefTwoPencils

+3

nó là cùng một giá trị rác trong 'a' để bắt đầu với vì bạn chưa bao giờ khởi tạo' a'. – dandan78

+0

bản sao có thể có của [Tự khởi tạo 'A a = a;' được phép?] (http://stackoverflow.com/questions/981714/is-self-initialization-aaa-allowed) Cũng ở đây: http://stackoverflow.com/questions/3173462/int-var-1-void-main -int-ii – jogojapan

Trả lời

2

Thực ra, trình biên dịch có thể cung cấp cho bạn gợi ý. Tôi nói: "cảnh báo C4700: biến cục bộ 'a' được sử dụng mà không bị khởi tạo".

Nhưng đây không phải là lỗi trên mỗi lần khai báo, khai báo chỉ cung cấp tên biến cho một số bit bộ nhớ mà không cần chạm vào nó, nó hợp lệ và nhanh chóng. Và sự khẳng định ở đây không thực sự là một sự khẳng định, chỉ cần di chuyển các bit từ phải sang trái. Không kiểm tra lại. Rất hiệu quả, rất không an toàn.

Mọi hoạt động đều hợp pháp, nhưng toàn bộ điều là vô nghĩa. Vì vậy, trình biên dịch làm điều tốt nhất có thể - nó biên dịch mã, nhưng cũng đưa ra một cảnh báo.

+1

Khởi tạo không "chỉ cần cung cấp một tên biến cho một số bit bộ nhớ mà không cần tou ching nó ". _Declaration_ thực hiện điều đó. Khởi tạo là bước bạn cung cấp bit bộ nhớ có tên với giá trị ban đầu. –

+0

Vâng, chính xác. Nhưng trong trường hợp này về cơ bản không có khởi tạo. Những gì có vẻ là một chỉ là một tuyên bố và phân công. – akalenuk

+0

Ồ, tôi nói nên chỉnh sửa câu trả lời của mình để tránh nhầm lẫn. Cảm ơn! – akalenuk

9

§3.3.2/1:

Điểm kê khai cho một tên là ngay sau khi declarator hoàn chỉnh của nó (khoản 8) và trước khi khởi tạo của nó (nếu có), ngoại trừ được nêu dưới đây. [Ví dụ:

int x = 12; 
{ int x = x; } 

Ở đây x thứ hai được khởi tạo với giá trị (không xác định) của riêng mình. —end example]

+0

Lưu ý, trong bản thảo C++ 1y mới nhất [ điều này đã thay đổi] (http://stackoverflow.com/questions/23415661/has-c-standard-changed-with-respect-to-the-use-of-indeterminate-values-and-und) –

Các vấn đề liên quan