2010-10-12 54 views
11

thể trùng lặp:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)khác biệt giữa i = ++ i và i ++

sự khác biệt giữa i = ++i;++i; nơi i là một số nguyên có giá trị 10 là gì?

Theo tôi, cả hai đều thực hiện cùng một công việc gia tăng i tức là sau khi hoàn thành cả hai biểu thức i =11.

+2

Sao chép? http://stackoverflow.com/questions/2902638/post-and-pre-increment-in-c-closed – rkellerm

Trả lời

10

i = ++i; gọi hành vi không xác định trong khi ++i; thì không.

C++ 03 [Phần 5/4] nói Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.

Trong i = ++ii đang được sửa đổi hai lần [tăng trước và chuyển nhượng] mà không có bất kỳ điểm chuỗi can thiệp nào để hành vi này không được xác định trong C cũng như trong C++.

Tuy nhiên i = ++i cũng được định nghĩa trong C++ 0x :)

+5

Predence không liên quan gì đến thứ tự đánh giá. 'i = ++ i' gọi UB vì' i' đang được sửa đổi nhiều hơn một lần giữa hai điểm chuỗi. –

+0

Bạn có thể trích dẫn các nguồn có thẩm quyền về vấn đề này không? Chắc chắn 'i = i ++' có hành vi không xác định: bởi vì nó không được xác định liệu giá trị của 'i ++' sẽ được sao chép vào i trước hoặc sau khi tôi được tăng lên. Nhưng ít rõ ràng hơn với tôi rằng 'i = ++ i' có kết quả phụ thuộc vào thứ tự. Nó hợp lý nhưng không rõ ràng với tôi. – LarsH

+0

@Prasoon Saurav - Hầu hết, có thể tất cả, trình biên dịch tuân thủ quy tắc ưu tiên và đánh giá nó theo giá trị logic. Tôi nhận ra bạn đang trích dẫn từ http://www.cppreference.com/wiki/operator_precedence – DumbCoder

1

Kết quả cho người đầu tiên là không xác định.

+0

Nếu và chỉ khi ++ là toán tử biult-in ++. Nếu nó bị chồng chéo, thì đó KHÔNG phải là hành vi không xác định –

+0

@Armen: đó là những gì tôi định nói về câu trả lời của Prasoon, sau đó tôi nhận thấy rằng người hỏi nói rằng 'i' là một" số nguyên ". Tôi nghĩ rằng đó là hợp lý để giả định rằng điều này có nghĩa là một loại số nguyên, do đó UB. –

7

Viết i = ++i; ghi vào biến i hai lần (một cho số gia tăng, một cho bài tập) mà không có số sequence point giữa hai. Điều này, theo tiêu chuẩn ngôn ngữ C gây ra hành vi không xác định.

Điều này có nghĩa là trình biên dịch miễn phí để thực hiện i = ++i như giống hệt nhau để i = i + 1, như i = i + 2 (điều này thực sự có ý nghĩa trong pipeline- nhất định và hoàn cảnh liên quan đến bộ nhớ cache), hoặc như format C:\ (ngớ ngẩn, nhưng về mặt kỹ thuật cho phép theo tiêu chuẩn).

+0

+1 để đề cập đến các điểm chuỗi, điều gì đó rất hữu ích để nhận biết! –

+0

+1 để cung cấp liên kết đến mô tả các điểm chuỗi. – LarsH

3

i = ++ tôi thường xuyên, nhưng không nhất thiết, cung cấp kết quả của

i = i;

i +1;

mang đến cho i = 10

Như đã chỉ ra bởi các ý kiến, đây là hành vi không xác định và không bao giờ nên được dựa vào

khi ++ i sẽ luôn luôn cung cấp cho

i = i +1;

cho i = 11; do đó

Và là cách chính xác để làm việc đó

+0

Nếu bạn downvote tôi, sau đó atleast có lịch sự kể những gì đã sai với bài viết của tôi – kskjon

+0

Tôi đã không downvote bạn, nhưng nó có thể là vì câu trả lời của bạn là không chính xác, nói rằng nó sẽ "thường xuyên, nhưng không nhất thiết" kết quả nhất định. Đó là hành vi chính thức không xác định, và cố gắng đoán * tỷ lệ cược * mà kết quả bạn sẽ nhận được có thể chỉ cho người đọc ý tưởng sai lầm, rằng bằng cách nào đó có thể dựa vào kết quả. – jalf

+0

@ jalf - Tôi không thể nhìn thấy bất cứ điều gì sai trái với câu trả lời của kskjon. Nó không hoàn toàn chính xác nhưng nó hoàn toàn chính xác, và nó trả lời câu hỏi của OP. kskjon làm cho nó rõ ràng rằng i = 10 kết quả sẽ "không nhất thiết" xảy ra. Tôi không thấy làm thế nào mà có thể cung cấp cho người đọc một ý tưởng không chính xác rằng nó bằng cách nào đó có thể dựa vào kết quả đó. – LarsH

2

Nếu tôi thuộc loại vô hướng, thì i = ++i là UB và ++i tương đương với i+=1. nếu tôi thuộc loại lớp và có toán tử quá tải cho lớp đó thì i = ++i tương đương với i.operator=(operator++(i)), không phải UB và ++i chỉ thực hiện ++ operator, với bất kỳ ngữ nghĩa nào bạn đưa vào đó.

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