2013-07-07 10 views
6

Tôi đang chạy các chương trình sau trong Visual C++ và Java:Hành vi của PreIncrement và PostIncrement điều hành trong C và Java

Visual C++

void main() 
{ 
    int i = 1, j; 
    j = i++ + i++ + ++i; 
    printf("%d\n",j); 
} 

Output:

6 

Java:

public class Increment { 
    public static void main(String[] args) { 
     int i = 1, j; 
     j = i++ + i++ + ++i; 
     System.out.println(j); 
    } 
} 

Output:

7 

Tại sao đầu ra trong hai ngôn ngữ này là khác nhau? Làm thế nào cả hai ngôn ngữ xử lý các toán tử trước và sau phát hành khác nhau?

+0

Trong C và C++, thứ tự các biểu thức được đánh giá và thứ tự mà các hiệu ứng phụ được áp dụng là * không xác định *; kết quả sẽ thay đổi từ triển khai sang triển khai. Các tiêu chuẩn tương ứng để lại hành vi như vậy * undefined * để trình biên dịch trình biên dịch không phải lo lắng về cách xử lý các biểu thức như vậy; bất kỳ kết quả nào được coi là "chính xác". Java và C#, OTOH, chỉ định rằng tất cả các biểu thức được đánh giá từ trái sang phải, và tất cả các hiệu ứng phụ được áp dụng ngay lập tức, vì vậy các biểu thức như thế này được xác định rõ. –

Trả lời

2

Trong C/C++ hành vi là undefined vì Trong cụm từ này i được sửa đổi nhiều sau đó một lần mà không có một điểm tự can thiệp. đọc: What's the value of i++ + i++?

Tất nhiên trong hành vi Java của this kind of codes cũng được xác định. Dưới đây là câu trả lời của tôi cho Java, từng bước:

Khi bắt đầu i1.

j = i++ + i++ + ++i; 
// first step, post increment 
j = i++ + i++ + ++i; 
// ^^^ 
j = 1 + i++ + ++i; 
// now, i is 2, and another post increment: 
j = i++ + i++ + ++i; 
// ^^^^^^^^^ 
j = 1 + 2 + ++i; 
// now, i is 3 and we have a pre increment: 
j = i++ + i++ + ++i; 
// ^^^^^^^^^^^^^^^^ 
j = 1 + 2 + 4; 
j = 7; 
+0

câu trả lời của bạn là rất tốt cho Java, tôi đã thêm cho c trong câu trả lời của bạn, nếu bạn không thích quay trở lại phiên bản của bạn. –

4

Ví dụ C++ gợi lên hành vi không xác định. Bạn không được sửa đổi giá trị nhiều hơn một lần trong một biểu thức. giữa các điểm trình tự. [Được chỉnh sửa chính xác hơn.]

Tôi không chắc chắn nếu điều này cũng đúng cho Java. Nhưng nó chắc chắn đúng với C++.

Dưới đây là một tài liệu tham khảo tốt:
Undefined behavior and sequence points

+1

trích dẫn xin vui lòng? Tôi chưa bao giờ nghe nói về điều đó ... chỉ là nó không được khuyến khích. – Mgetz

+0

@Mgetz: Đã chỉnh sửa ở trên để thêm tham chiếu chính xác. Cuộn xuống "1) Giữa điểm chuỗi trước đó và tiếp theo đối tượng vô hướng phải có giá trị được lưu trữ được sửa đổi nhiều nhất một lần bằng cách đánh giá biểu thức." –