2010-03-04 35 views

Trả lời

34

Có, đó là tương đương với:

int bar() 
{ 
    int temp = x; 
    ++x; 
    return temp; 
} 
+0

Giải thích tốt, cảm ơn. – patros

+0

Nếu 'int' không phải là' int', mà là 'MyClassWithOverloadedOperators', thì bạn chỉ sai. –

+4

@Pavel: Tôi không đồng ý. Một lớp có toán tử tăng sau quá tải không thực hiện ngữ nghĩa sau tăng dần là sai. – Void

7

Có, nó sẽ trả về giá trị của x trước khi tăng giá trị và sau đó giá trị của x sẽ là + 1 ... nếu nó quan trọng.

4

Nó được xác định.

Nó trả về giá trị x trước khi tăng. Nếu x là một biến cục bộ (không tĩnh), tăng gia số này không có hiệu lực vì các biến cục bộ của hàm ngừng tồn tại khi hàm trả về. Nhưng nếu x là biến tĩnh cục bộ, biến toàn cầu hoặc biến mẫu (như trong trường hợp của bạn), giá trị của nó sẽ được tăng lên sau khi trả về.

+0

Nhưng điều gì xảy ra trong trường hợp quá tải '++' -operator trên một lớp tùy chỉnh? Liệu hiệu ứng của nó có được thực hiện không? – Dario

+2

@Dario Có, nó sẽ được. Biểu thức sau "return" sẽ được đánh giá đầy đủ trước khi trả về được thực thi. –

+1

@Dario. Vâng, với chính xác lý do tương tự nếu bạn làm 'return x.dosomething();', hiệu ứng của 'dosomething' sẽ được thực hiện trước khi trả về. Quá tải post-increment không phải là ma thuật, nó chỉ là một hàm trả về một giá trị, điều đó xảy ra là giá trị cũ. –

4

Yes.

Trong postincrement (x ++) giá trị của x được đánh giá (được trả lại trong trường hợp của bạn) trước 1 được thêm vào.

Trong preincrement (++ x) giá trị của x được đánh giá sau 1 được thêm vào.

Chỉnh sửa: Bạn có thể so sánh định nghĩa số prepost gia tăng trong các liên kết.

1

Hầu hết các ngôn ngữ lập trình, như C++, được đệ quy theo thứ tự các thao tác được thực hiện (tôi không có ý nghĩa gì về cách mã thực sự được trình biên dịch thực hiện tại đây). Các hoạt động hợp nhất bao gồm bất kỳ hoạt động được xác định rõ ràng nào cũng được xác định rõ ràng, vì mỗi thao tác được thực hiện trên cơ sở cuối cùng, đầu tiên.

Trả sau tăng giá trị của biến được tăng lên trước khi tăng nó, do đó thao tác return nhận được giá trị đó. Không có định nghĩa đặc biệt nào về hành vi này phải được thực hiện.

+1

Tôi không nghĩ rằng mối quan tâm là về những gì giá trị sẽ được trả lại, mà là về việc liệu sự gia tăng sẽ xảy ra. Đó là một mối quan tâm dễ hiểu nếu mô hình tinh thần của bạn có nó rằng "trở lại" gây ra một kết thúc ngay lập tức cho chức năng - là có thực sự thời gian cho gia tăng được áp dụng nếu chức năng đã kết thúc? Tất nhiên chúng ta biết câu trả lời là * có *, nhưng chỉ vì trình biên dịch thực hiện một phép biến đổi như trong câu trả lời của Poita để đảm bảo rằng hàm không thực sự trở lại cho đến khi tất cả các hiệu ứng phụ đã được áp dụng. –

+0

Đó là ý của tôi. Câu lệnh 'return' được gặp sau khi' x ++ '" trả về ". Vì 'x ++' là một phép toán, nên được coi là trả về như trong mã trình diễn mà Poita_ cung cấp. Bằng cách đó, thật dễ dàng để thấy rằng vì 'x ++' được thực thi và giá trị trả về của nó được chuyển cho câu lệnh' return'. Nó không có nghĩa là 'x ++' sẽ trả về và * sau đó * increment. –

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