Nếu tôi có ví dụ một lớp học với phương pháp dụ và các biếnHành vi trả về x ++; được xác định?
class Foo
{
...
int x;
int bar() { return x++; }
};
là hành vi trả lại một biến sau tăng lên được xác định?
Nếu tôi có ví dụ một lớp học với phương pháp dụ và các biếnHành vi trả về x ++; được xác định?
class Foo
{
...
int x;
int bar() { return x++; }
};
là hành vi trả lại một biến sau tăng lên được xác định?
Có, đó là tương đương với:
int bar()
{
int temp = x;
++x;
return temp;
}
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.
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ề.
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
@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. –
@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ũ. –
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.
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. –
Đó 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. –
Giải thích tốt, cảm ơn. – patros
Nếu 'int' không phải là' int', mà là 'MyClassWithOverloadedOperators', thì bạn chỉ sai. –
@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