Câu trả lời duy nhất cho câu hỏi của bạn là chính xác là: Bởi vì nó không được xác định.
Ok, trước khi tất cả các bạn đốt cháy tôi ..
Tất cả các bạn đã trả lời tại sao i+=i++
là ok và hợp lý để dẫn đếni=0
.
Tôi đã cố gắng bỏ phiếu cho mỗi câu trả lời của bạn nhưng danh tiếng mà tôi tính được sẽ quá cao ..
Tại sao tôi rất giận bạn? không phải vì những gì câu trả lời của bạn giải thích ..
Ý tôi là, mọi câu trả lời tôi đọc đều có nỗ lực vượt trội để giải thích điều không thể, tôi Vỗ tay!
Nhưng kết quả là gì ?? Là kết quả trực quan - nó có phải là kết quả chấp nhận được không ??
Mỗi người trong số các bạn đã nhìn thấy "vị vua trần trụi" và bằng cách nào đó đã chấp nhận nó như một vị vua hợp lý.
Bạn là tất cả SAU!
i+=i++;
kết quả 0
là không xác định.
một lỗi trong cơ chế đánh giá ngôn ngữ nếu bạn sẽ .. hoặc thậm chí tệ hơn! một lỗi trong thiết kế.
muốn một bằng chứng? tất nhiên bạn muốn
int t=0; int i=0; t+=i++; //t=0; i=1
Bây giờ đây ... là kết quả trực quan! bởi vì lần đầu tiên chúng tôi đánh giá t
được gán nó với một giá trị và chỉ sau khi đánh giá và chuyển nhượng, chúng tôi mới có hoạt động đăng bài xảy ra - có hợp lý không?
nó có hợp lý không: i=i++
và i=i
mang lại kết quả tương tự cho i
?
trong khi t=i++
và t=i
có kết quả khác nhau cho i
.
Các hoạt động bài là một cái gì đó nên xảy ra sau khi đánh giá tuyên bố.
Vì thế:
int i=0;
i+=i++;
Nên giống nhau nếu chúng ta viết:
int i=0;
i = i + i ++;
và do đó giống như:
int i=0;
i= i + i;
i ++;
và do đó giống như:
int i=0;
i = i + i;
i = i + 1;
Bất kỳ kết quả nào không 1
chỉ ra lỗi trong trình biên dịch hoặc lỗi trong thiết kế ngôn ngữ nếu chúng ta suy nghĩ hợp lý - tuy nhiên MSDN và nhiều nguồn khác cho chúng ta biết "này - điều này không xác định!"
Bây giờ, trước khi tôi tiếp tục, ngay cả tập hợp các ví dụ tôi đưa ra cũng không được ai ủng hộ hay thừa nhận .. Tuy nhiên đây là những gì theo cách trực quan và hợp lý nên có kết quả.
Các lập trình viên nên không có kiến thức về cách lắp ráp được viết hoặc dịch!
Nếu nó được viết theo cách không tôn trọng các định nghĩa ngôn ngữ - đó là một lỗi!
Và để kết thúc, tôi đã sao chép nó từ Wikipedia, toán tử tăng và giảm :
Do toán tử tăng / giảm điều chỉnh toán hạng của nó, sử dụng toán hạng đó nhiều lần trong cùng một biểu thức có thể tạo ra kết quả không xác định . Ví dụ, trong các biểu thức, chẳng hạn như x - ++ x, không rõ ràng về trình tự phép trừ và toán tử gia tăng nào. Các tình huống như thế này thậm chí còn tồi tệ hơn khi trình tối ưu hóa được áp dụng bởi trình biên dịch, điều này có thể dẫn đến thứ tự thực hiện các hoạt động khác với những gì lập trình viên dự định.
Và do đó.
Câu trả lời đúng là điều này KHÔNG NÊN SỬ DỤNG! (vì nó được HIỂU!)
Có .. - Nó có kết quả không thể đoán trước ngay cả khi trình biên dịch C # đang cố gắng bình thường hóa bằng cách nào đó.
Tôi không tìm thấy bất kỳ tài liệu nào về C # mô tả hành vi mà tất cả các bạn ghi lại là hành vi bình thường hoặc được xác định rõ ràng của ngôn ngữ. Những gì tôi đã tìm thấy là hoàn toàn ngược lại!
[ được sao chép từ tài liệu MSDN cho Toán tử tăng và giảm Postfix: ++ và - ]
Khi một toán tử postfix được áp dụng cho một đối số hàm, giá trị của đối số không được đảm bảo được tăng hoặc giảm trước khi nó được truyền cho hàm. Xem phần 1.9.17 trong tiêu chuẩn C ++ để biết thêm thông tin.
Lưu ý rằng những từ không được bảo đảm ...
Hãy tha thứ cho tôi nếu câu trả lời đó có vẻ kiêu ngạo - tôi không phải là người kiêu ngạo. Tôi chỉ xem xét rằng hàng ngàn người đến đây để tìm hiểu và những câu trả lời tôi đọc sẽ đánh lừa họ và sẽ làm hại logic và sự hiểu biết của họ về chủ đề này.