2013-05-06 18 views
5

Tôi ngạc nhiên phát hiện ra ngày hôm nay rằng đoạn mã sau là hoàn toàn hợp lệ (gcc 4.4.5):trường hợp thú vị của shadowing tham số C++ (tham số không shadowed trong khối lệnh if)

int get_int(const int& i) 
{ 
    if(i == 0) 
    { 
     int i = 1; 
     return i; 
    } 
    return i;  
} 

Tôi thực sự ngạc nhiên. Nếu tôi phải chấp nhận nó, thì chắc chắn tôi có thể nói rằng nó có ý nghĩa bởi vì biến mới nằm trong khối riêng của nó, vì vậy phần còn lại của mã bên ngoài vẫn có thể truy cập tham số, vì vậy tham số không thực sự bị che khuất. Nhưng nó vẫn không có ý nghĩa với tôi tại sao chúng ta không làm cho cú pháp này không hợp lệ? Tôi thấy không có lợi ích cho phép điều này, và trên thực tế, tôi chỉ cần đào sâu vào một lỗi gây ra bởi điều này. Đó là một hàm dài và tôi tạo biến của riêng mình mà không nhận ra nó có cùng tên như tham số và một số dòng mã sau (cùng một khối) có sự phụ thuộc vào biến thông số rất lớn đó và hiện tại nó đang sử dụng phiên bản của tôi và có một giờ trong ngày của tôi.

Tôi có kiến ​​thức rất bề ngoài về trình biên dịch, vì vậy ai đó có thể giải thích cho tôi toàn bộ câu chuyện đằng sau hành vi này? Như một so sánh, trong mã Java như thế này là không hợp lệ (biến trùng lặp).

+0

Không phải là một chuyên gia trong trình biên dịch, nhưng tôi sẽ nghi ngờ thực tế rằng đối số là một int & và biến "bóng" chỉ là một int được trong vòng lặp ở đây. –

+0

Tôi cũng đã cố gắng 'get_int (int i)' nó làm cho không có sự khác biệt – user1861088

+5

Phạm vi của 'int i' là khối trong đó nó được khai báo. Điều này đổ bóng các tham số bên trong khối, nhưng không phải bên ngoài nó. Nếu bạn đang hỏi "Tại sao một biến được dàn vào khối thay vì hàm?" câu trả lời là "Đó là những gì các quy tắc ngôn ngữ nói." Các ngôn ngữ khác nhau tuân theo các quy tắc khác nhau. Đó là những gì làm cho chúng khác nhau. –

Trả lời

1

Nếu bạn đang thắc mắc tại sao C++ cho phép này , câu trả lời rất đơn giản: Để chấp nhận mã C hợp lệ.

Nó cũng làm cho các quy tắc đơn giản hơn, để xử lý các nghĩa khác nhau cho cùng một số nhận dạng trong các phạm vi khác nhau theo cùng một cách, mà không cần quan tâm xem phạm vi có liên quan là không gian tên, lớp, chức năng hay phạm vi khối.

+0

tâm giải thích nhiều hơn một chút? bạn có thể minh họa điều này có liên quan gì đến việc chấp nhận mã C hợp lệ không? – user1861088

+0

Mức độ phổ biến của C++ khi nó được giới thiệu phụ thuộc vào thực tế là hầu như tất cả các mã C tốt đều được chấp nhận theo các quy tắc C++. –

-4

Bạn không chuyển biến nhưng tham chiếu. Trích dẫn Bjarne Stroustroup trong cáC++ Ngôn ngữ lập trình C - "Một tài liệu tham khảo có thể được sử dụng để thực hiện một chức năng đó là nghĩa vụ để thay đổi giá trị của đối số của nó" p.62

+0

Điều này bỏ lỡ điểm của câu hỏi, đó là "Tại sao tôi được phép che một phần thông số?" –

+0

bạn không nhận được câu hỏi .. xin lỗi tôi đã không đặt nó một cách rõ ràng hơn. Ngoài ra tôi đã thông qua một tham chiếu const vì vậy nó sẽ không làm cho một sự khác biệt anyways – user1861088

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