2010-10-14 36 views
14

Tôi rất thuyết phục với lời giải thích tôi đã tìm thấy rằng nói rằng i = ++i is not undefined theo như C++ 0x là có liên quan, nhưng tôi không thể đánh giá liệu hành vi của i += ++i có được xác định rõ hay không. Có ai không?Có phải i + = ++ i không xác định hành vi trong C++ 0x không?

+0

g ++ nói * vâng, đó là UB. * – kennytm

+1

@KennyTM: Tôi có phiên bản 4.5.0 và cảnh báo tôi thậm chí i = ++ tôi không được xác định. Phiên bản nào bạn đang sử dụng? Bạn đã thành công trong việc biên dịch i = ++ i mà không có cảnh báo? –

+0

cả i = ++ i và i + = ++ i là UB –

Trả lời

9

Lý do làm cho i = ++i được xác định rõ có thể được sử dụng để chứng minh rằng i += ++i cũng phải được xác định rõ.

i += ++i tương đương với i += (i += 1) và các quy tắc sắp xếp mới yêu cầu rằng việc chuyển nhượng diễn ra trước khi tính giá trị của biểu thức phụ i += 1.
Điều này có nghĩa là kết quả của biểu thức i += ++i phải giống như đối với i = 2 * i + 1.

Chỉnh sửa: Tôi phải sửa lại câu trả lời của mình, vì hành vi không được xác định sau khi tất cả.
Hành vi của i += ++i không xác định, vì giá trị tính toán của biểu thức phụ i (đối số bên trái) và ++i không được liên hệ với nhau và một trong số chúng chứa bản cập nhật đối tượng i.

Đây không phải là vấn đề đối với biểu thức i = ++i, bởi vì có i ở phía bên tay trái không trải qua chuyển đổi lvalue-to-rvalue, điều này xảy ra trong trường hợp i += ++i.


Lưu ý phụ: Không viết mã như vậy trong bất kỳ dự án nghiêm túc nào. Nó dựa quá nhiều vào việc biết chính xác các quy tắc sắp xếp và sẽ có nhiều người không hiểu chính xác các quy tắc sắp xếp, không biết về sự thay đổi trong các quy tắc là kết quả của DR 637 hoặc bị vấp ngã do thiếu một số điều quan trọng các khía cạnh của biểu thức được đề cập (như đã xảy ra với tôi khi soạn thảo bản sửa đổi đầu tiên của câu trả lời này).

+0

i + = ++ i sẽ tương đương với i = i + ++ i; sao cho tôi chỉ được đánh giá một lần. Nhưng, liệu nó có được định nghĩa một trong những i hay ++ được đánh giá đầu tiên không? –

+0

@Saurabh: Bạn nói đúng. Sự khác biệt giữa 'i = ++ i' và' i + = ++ i' là giá trị tính toán của 'i' bên trái, mà không được kết quả với' ++ i'. Điều này làm cho kết quả không xác định. Tôi sẽ cập nhật câu trả lời của tôi cho phù hợp. –

+0

Cảm ơn.Tôi đã có cùng một suy nghĩ, nhưng không hoàn toàn chắc chắn. –

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