2017-12-14 169 views
5
#include <stdio.h> 
int main() 
{ 
    int i; 
    for (i=0; i<5; i++) 
    { 
     int i = 10; 
     printf ("%d", i); 
     i++; 
    } 
return 0; 
} 

Trong biến i này được khai báo bên ngoài for vòng lặp và nó được một lần nữa tuyên bố và khởi tạo bên trong for vòng lặp. C cho phép nhiều khai báo như thế nào?Nhiều tờ khai cùng các biến bên trong và bên ngoài vòng lặp for

+4

Thậm chí nếu bạn có 'for (int i = 0; i <5; i ++)' thì 'i' tiếp theo có phạm vi lồng nhau. Nhưng tôi không thích nó, tính năng ngôn ngữ không có ý định được sử dụng để tái chế các tên biến. Luôn sử dụng tên biến quảng cáo không xung đột hoặc bóng. –

+1

Xem phạm vi _ phạm vi/phạm vi bên ngoài_ C11 §6.2.1 4 – chux

Trả lời

5

i bên ngoài vòng lặp và i bên trong vòng lặp là hai biến khác nhau.

  • Bên ngoài i sẽ tồn tại trong toàn bộ thời gian main.

  • Bên trong i sẽ chỉ hoạt động trong thời gian lặp lại một vòng lặp.

Các bên trong một shadows một bên ngoài trong phạm vi này:

{ 
    int i = 10; 
    printf ("%d", i); 
    i++; 
} 

Do shadowing quy tắc, đó là không thể đề cập đến một bên ngoài trong khi bên trong phạm vi nói trên.


Lưu ý rằng không thể để khai báo hai biến với cùng tên trong cùng một phạm vi:

{ 
    int i = 0; 
    int i = 1; // compile-time error 
} 
+1

FYI, thuật ngữ mà tiêu chuẩn C sử dụng là "ẩn" chứ không phải là "bóng tối." –

3

biến trong một phạm vi có thể mặt nạ biến ở phạm vi cao hơn.

Trong ví dụ này, i được xác định bên trong mặt nạ vòng lặp i được xác định bên ngoài. Trong cơ thể vòng lặp, các printf in giá trị của khu vực nội i, thường là 10. Các i++ sau đó hoạt động trở lại vào bên trong i đặt nó vào 11.

Khi vòng lặp chạm đáy và quay ngược lại lên, bên trong i nằm ngoài phạm vi. Các mệnh đề thứ hai và thứ ba của for sau đó hoạt động ở bên ngoài i. Khi nội dung vòng lặp được nhập lại, một thể hiện mới của bên trong i được xác định và được khởi tạo thành 10.

+0

FYI, thuật ngữ sử dụng tiêu chuẩn C là "ẩn" thay vì "mặt nạ. ” –

1

Bạn nên xem trang sau để biết định nghĩa của các loại phạm vi khác nhau mà biến có thể có bằng ngôn ngữ C .

http://aelinik.free.fr/c/ch14.htm

int i đầu tiên của bạn là trong phạm vi của toàn bộ khối, và thứ hai int i chỉ có phạm vi của bạn từ bên trong đó vòng lặp lồng nhau. Khi bên ngoài vòng lặp lồng nhau, phiên bản phạm vi khối ban đầu của i sẽ được áp dụng lại.

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