2012-08-30 31 views
6

tôi đã có một người tuyên bố rằng dòng này không thuộc phạm vi C++ tiêu chuẩn:Mảng [i] = i ++ có được bao gồm trong tiêu chuẩn C++ không?

int i(1); 
array_of_int[i] = i++; 

Người nói rằng nó sẽ gán 1 nhưng chúng ta không thể biết liệu nó sẽ được ở array_of_int[1] hoặc array_of_int[2] mặc dù visual studio và hầu hết của các trình biên dịch sẽ có trong array_of_int[1].

Anh ấy có đúng không?

+0

Như tôi đã hiểu, hành vi này được xác định bởi trình biên dịch và không được giải quyết rõ ràng trong tiêu chuẩn C++ – CatShoes

+4

Có thể dup: http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors -iiiii-etc - đây là một trong những câu trả lời. – Mat

+0

Vui lòng đóng hoặc xóa câu hỏi của tôi nếu nó là một sự lừa đảo, tôi đã cố gắng tìm nó đã được hỏi nhưng không xây dựng tìm kiếm của tôi với các từ khóa chính xác. – BlueTrin

Trả lời

6

Đây là hành vi không xác định. Theo nghĩa đen, mọi hành vi đều hợp pháp.

Đoạn rằng cấm mà dòng mã là thế này:

Giữa điểm chuỗi trước và bên cạnh một đối tượng có trách nhiệm đã được lưu trữ giá trị của nó biến đổi cùng lúc nhiều nhất bởi việc đánh giá một biểu thức. Hơn nữa, giá trị trước khi được chỉ đọc để xác định giá trị được lưu trữ

Không có điểm chuỗi giữa a[i]i++ và đọc để i trong a[i] không nhằm mục đích xác định những gì giá trị được lưu trữ trong i bởi i++.

+0

Cảm ơn lời giải thích, tôi đã thêm liên kết đến trang wiki của các điểm chuỗi – BlueTrin

+1

các điểm trình tự đã bị xóa khỏi C++ và được thay thế bằng trình tự mối quan hệ giữa các câu lệnh/biểu thức con. [xem tại đây] (http://stackoverflow.com/a/10655884/365496). Điều này thay đổi một số trường hợp của hành vi không xác định để hành vi được xác định rõ, nhưng không phải trong trường hợp cụ thể này. – bames53

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