2010-07-22 29 views
63

Tôi có câu hỏi này, mà tôi nghĩ về trước đó, nhưng tìm nó không phải tầm thường để trả lờiViệc tự khởi tạo này có hợp lệ không?

int x = x + 1; 
int main() { 
    return x; 
} 

Câu hỏi của tôi là liệu hành vi của các chương trình được xác định hoặc không xác định nếu nó có giá trị gì cả. Nếu nó được xác định, là giá trị của x được biết đến trong main?

+0

Thú vị. Ít nhất GCC cho 1, ngay cả với '-std = C++ 98 -pantic'. – Philipp

+0

Soạn thảo điều này với MSVC9 (15.00.30729.01) cho 1. – akira

+0

Điểm chuỗi xuất hiện trong đầu http://en.wikipedia.org/wiki/Sequence_point –

Trả lời

98

Tôi chắc rằng nó đã được xác định và x phải có giá trị 1. §3.6.2/1 nói: "Đối tượng có thời lượng lưu trữ tĩnh (3.7.1) sẽ được khởi tạo bằng không (8.5) trước bất kỳ giá trị nào khác khởi tạo diễn ra. "

Sau đó, tôi nghĩ mọi thứ khá đơn giản.

+10

+1 và cho câu trả lời trích dẫn của tiêu chuẩn mạnh –

+12

Hm, tuyệt vời như thế nào tinh tế nhưng quan trọng "trước khi bất kỳ khởi tạo khác diễn ra." Là. – GManNickG

+4

Tôi ước nó không được xác định là chúng ta có thể nói đừng viết những thứ như thế để cố gắng tìm ra ý nghĩa của bạn mà không cần tìm kiếm nó trong tiêu chuẩn. –

6

Biến 'x' được lưu trữ trong .bss, được điền bằng 0 khi bạn tải chương trình. Do đó, giá trị của 'x' là 0 khi chương trình được nạp vào bộ nhớ.

Sau đó trước khi gọi chính, "x = x + 1" được thực hiện.

Tôi không biết liệu nó có hợp lệ hay không, nhưng hành vi không được xác định.

11

Câu hỏi của tôi là liệu hành vi của chương trình được xác định hoặc không xác định nếu nó có hiệu lực. Nếu nó được xác định, là giá trị của x được biết đến trong chính?

Mã này chắc chắn không sạch sẽ, nhưng với tôi, nó sẽ hoạt động được dự đoán.

int x đặt biến vào phân đoạn dữ liệu được xác định bằng 0 khi bắt đầu chương trình. Trước main(), bộ khởi tạo tĩnh được gọi. Đối với x, đó là mã số x = x + 1. x = 0 + 1 = 1. Do đó, hàm main() sẽ trả về 1.

Mã chắc chắn sẽ hoạt động theo kiểu không thể đoán trước nếu x là một biến cục bộ, được cấp phát trên ngăn xếp. Trạng thái ngăn xếp, không giống như phân đoạn dữ liệu, được đảm bảo khá nhiều để chứa rác không xác định.

0

Trước khi cuộc gọi chính x phải được khởi tạo thành 0 do đó giá trị của nó phải là 1 mà bạn nhập chính và bạn sẽ trả về 1. Đó là hành vi được xác định.

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