2015-05-15 25 views
11
#include <iostream> 
using namespace std; 

int main() 
{ 
    int x=80; 
    int &y=x; 
    cout<<"x"<<x<<" "<<"y"<<y++; 
    return 0; 
} 

Đoạn mã trên đã cho tôi kết quả như sau:Sự thay đổi để tham khảo các biến trong C++

81 80 

bất cứ ai có thể giải thích cho tôi như thế nào giá trị của x thay đổi 81? Giá trị của y80 và sau đó được tăng lên thành 81, nhưng cách nó phản ánh trong x?

Phản ánh có phải vì y là biến tham chiếu không? Sau đó, giá trị phải được sửa đổi trong cả hai xy?

+0

Có, 'y' chỉ là một tài liệu tham khảo cho' x', vì vậy 'y ++' thực sự là thay đổi 'x',' y' không có giá trị của riêng nó. –

Trả lời

15

Bạn có hành vi không xác định vì hoạt động của bạn nằm giữa hai liên tiếp sequence points (không có điểm chuỗi giữa các đánh giá đối số chức năng). Bạn có thể suy nghĩ một cách lỏng lẻo về các điểm trình tự như các điểm đánh dấu "thời gian" và giữa hai điểm liên tiếp mà bạn không được phép sửa đổi cùng một biến nhiều lần.

Về cơ bản mã của bạn là tương đương với

std::cout << x << x++; // undefined behaviour 

từ y chỉ là một tài liệu tham khảo (bí danh) cho x.

1.9 thực hiện Chương trình [intro.execution] (nhấn mạnh của tôi)

14) Mọi tính toán đều giá trị phía tác liên kết với một full-biểu được lập trình tự trước mỗi tính toán giá trị và bên hiệu ứng kết hợp với biểu thức đầy đủ tiếp theo được đánh giá.

15) Trừ khi được ghi chú, đánh giá toán hạng của cá nhân toán tử và biểu thức con của biểu thức riêng lẻ là không được kết nối. [Lưu ý: Trong một biểu thức được đánh giá nhiều hơn một lần trong khi thực hiện chương trình, không được kết quả và không xác định đánh giá trình tự các biểu thức con của nó không cần phải được thực hiện nhất quán trong các đánh giá khác nhau. - end note] Giá trị tính toán của toán hạng của toán tử được sắp xếp trước khi tính toán giá trị của kết quả của toán tử. Nếu tác dụng phụ trên đối tượng vô hướng không liên quan đến tác dụng phụ khác trên đối tượng vô hướng giống nhau hoặc tính giá trị sử dụng giá trị đối tượng vô hướng giống nhau và chúng không đồng thời (1.10), hành vi là không xác định. [Lưu ý: Phần tiếp theo áp đặt tương tự, nhưng các hạn chế phức tạp hơn đối với tính toán đồng thời tiềm ẩn. -endnote]

Khi gọi một hàm (có hoặc không có chức năng là inline), mỗi giá trị tính toán và phụ ảnh hưởng kết hợp với bất kỳ tranh cãi biểu hiện, hoặc với các biểu hiện postfix chỉ định được gọi là chức năng, được lập trình tự trước thực hiện mọi biểu thức hoặc câu lệnh trong phần thân của hàm được gọi. [Lưu ý: Giá trị tính toán và tác dụng phụ liên quan đến đối số khác nhau các biểu thức không được kết nối. - kết thúc lưu ý] Mọi đánh giá trong hàm gọi (bao gồm cả các cuộc gọi chức năng khác) không phải là nếu không được sắp xếp cụ thể trước hoặc sau khi thực hiện nội dung của hàm được gọi là không xác định trình tự với sự tôn trọng . .9 Một số ngữ cảnh trong C++ gây ra đánh giá về một cuộc gọi hàm, mặc dù không có cú pháp gọi hàm tương ứng xuất hiện trong đơn vị dịch. [Ví dụ: Đánh giá biểu thức mới gọi một hoặc nhiều phân bổ và hàm tạo hàm; xem 5.3.4. Ví dụ khác, việc gọi hàm chuyển đổi (12.3.2) có thể phát sinh trong các ngữ cảnh trong đó không có cú pháp cuộc gọi hàm xuất hiện.

liên quan: https://stackoverflow.com/a/10782972/3093378

+0

Tôi nghĩ rằng bạn có thêm không ở đó, chúng nằm giữa hai điểm chuỗi giống nhau (nghĩa là không có điểm chuỗi giữa hai thao tác) – Borgleader

+0

@Borgleader cảm ơn, đã sửa. – vsoftco

+0

Tôi không tin rằng điều này là khá đúng đối với tài liệu tham khảo. Sau khi tất cả, nếu các lập trình viên nhận được hai tham chiếu như các tham số, làm thế nào ông có thể biết nếu họ bí danh? Tôi không chắc chắn nếu các quy tắc cho các hoạt động trên tài liệu tham khảo là giống như đối với các biến thông thường. – Puppy

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