2011-09-30 33 views
9

Tôi xin lỗi vì câu hỏi quá đơn giản này, nhưng tôi dường như không thể tìm ra ví dụ này trong cuốn sách tôi đang đọc:Ai đó có thể giải thích đoạn trích này (Tại sao có những niềng răng ở đây)?

void f5() 
{ 
    int x; 
    { 
     int y; 
    } 
} 

dấu ngoặc xung quanh int y cho là gì? Bạn có thể đặt niềng răng bất cứ nơi nào bạn muốn? Nếu vậy, khi nào và tại sao bạn sẽ làm như vậy hoặc đây chỉ là một lỗi trong cuốn sách?

+2

Đây là một kỹ thuật, chủ yếu được áp dụng trong ngôn ngữ C, để tạo các giá trị tạm thời cục bộ sau câu lệnh đầu tiên. Khi thực hiện thoát khỏi dấu ngoặc nhọn kết thúc, tất cả biến được tạo trong phạm vi đó sẽ biến mất. –

Trả lời

13

Niềng răng như thế cho biết mã bên trong dấu ngoặc đang nằm trong một phạm vi khác. Nếu bạn cố gắng truy cập y bên ngoài dấu ngoặc, bạn sẽ gặp lỗi.

+0

Điều đó có ý nghĩa, nhưng điều gây nhầm lẫn cho tôi là tôi nghĩ rằng sẽ phải ở bên trong một chức năng. Nếu bạn chỉ có thể đặt niềng răng bên trong một chức năng, tôi không thể thấy lý do tại sao bạn sẽ phải sử dụng một hàm lồng nhau - Hoặc tôi ở trong trường bên trái ở đâu đó? – Gary

+4

Một hàm có phạm vi riêng, nhưng cũng có thể có phạm vi trong một hàm. Điều này có thể rất hữu ích, ví dụ các đối tượng C++ có các destructors và chúng có thể được sử dụng để giải phóng tài nguyên tại một điểm paricular khi đối tượng nằm ngoài phạm vi. Bạn có thể muốn thực hiện chức năng này giữa. – Benj

4

Đó là phạm vi xác định. Biến Y không thể truy cập được bên ngoài niềng răng.

4

Niềng răng biểu thị phạm vi, biến x sẽ hiển thị trong phạm vi của dấu ngoặc ôm bên trong nhưng y sẽ không hiển thị bên ngoài phạm vi cú đúp của nó.

3

Niềng răng xác định mức phạm vi. Bên ngoài niềng răng, y sẽ không khả dụng.

1

Trông giống như một lỗi (không biết bối cảnh)

Làm mà bạn đã đóng hộp giá trị y bên trong những niềng răng, và như vậy là không có sẵn bên ngoài nó.

Tất nhiên, nếu họ đang cố gắng để giải thích phạm vi, có thể là một mã hợp lệ

6

Đó là một vấn đề của biến Phạm vi, ví dụ:

void f5() 
{ 
    int x = 1; 
    { 
     int y = 3; 
     y = y + x;   // works 
     x = x + y;   // works 
    } 
    y = y + x;    // fails 
    x = x + y;    // fails 
} 
3

Tại lối ra phạm vi các đối tượng bên trong được destructed . Bạn có thể, ví dụ, kèm theo một phần quan trọng trong niềng răng và xây dựng một đối tượng khóa ở đó. Sau đó, bạn không phải lo lắng về việc quên để mở khóa nó - destructor được gọi tự động khi thoát khỏi phạm vi - bình thường hoặc vì một ngoại lệ.

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