2013-04-25 33 views
18

int a=1, b=a++; gọi hành vi không xác định không? Không có điểm chuỗi can thiệp giữa việc khởi tạo a và truy cập và sửa đổi của nó trong bộ khởi tạo cho b, nhưng theo như tôi có thể nói, khởi tạo không phải là "sửa đổi" của đối tượng; một initializer được xác định để cung cấp cho các "giá trị ban đầu" của đối tượng. Mỗi 6.7.8 Khởi tạo, đoạn 8:Có int a = 1, b = a ++; gọi hành vi không xác định?

Trình khởi tạo chỉ định giá trị ban đầu được lưu trữ trong một đối tượng.

và có vẻ hợp lý khi thực hiện "ban đầu" khi được sắp xếp theo trình tự trước khi bất kỳ quyền truy cập nào vào đối tượng. Vấn đề này đã được xem xét trước đây chưa, và có một giải thích được chấp nhận không?

+0

Tôi muốn nói Chú thích 97 nói rằng điều này giống hệt 'int a = 1; int b = a ++; '. –

+0

@KerrekSB: Chú thích chân trang 97 trong phiên bản nào (hoặc bản nháp) của tiêu chuẩn? Các số chú thích ngắn hơn nhiều so với số phần. –

+0

IIRC, trong các phiên bản mới nhất của tiêu chuẩn, khái niệm "các điểm chuỗi" đang bị lỗi thời. Đối với các chú thích, gần đây đã có một cuộc thảo luận về một chú thích đã xác định thứ tự xử lý cấu trúc khai báo và khởi tạo, và chú thích đó thực sự có vẻ khá cũ và ổn định :) – quetzalcoatl

Trả lời

24

Nó không gọi hành vi không xác định. Trong 6.7.6 (3), nó được nêu là

Người khai báo đầy đủ là người khai báo không phải là một phần của người kê khai khác. Sự kết thúc của một tuyên bố đầy đủ là một điểm chuỗi.

rằng phần cuối của người khai báo đầy đủ là điểm chuỗi.

int a = 1, b = a++; 
    //^end of full declarator 
+0

'6.7.6 (3)' <- đó là gì? – Sayakiss

+1

Mục 6.7.6, mục 3, của tiêu chuẩn (tốt, bản dự thảo N1570, vì tôi không có tiền để mua một tiêu chuẩn đắt tiền mà tôi không thực sự cần). Phần đó đề cập đến người khai báo. –

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