2011-10-03 57 views
6

Ai đó có thể giải thích chính xác khái niệm phạm vi và tuổi thọ của biến trong C. Có khác biệt trong C++ không? Tôi đang bối rối giữa phạm vi và cuộc sống.Phạm vi và thời gian biến đổi trong C

+0

Làm thế nào để acept câu trả lời? – vikky

Trả lời

5

Phạm vi là khu vực có thể truy cập biến.
Thời gian sống là khoảng thời gian trong đó một đối tượng vẫn hợp lệ.

Một ví dụ đơn giản:

#include <iostream.h> 

void doSomething() 
{ 
    x = 5; //Error! Not Accessible 
} 

int main() 
{ 

     int x = 4; 
     std::cout<< x << endl; 
     { 
      int x = 2; 
      cout << x << endl; 
     } 
     doSomething(); 
     std::cout<< x << endl; 
     return 0; 
} 

Trên đây đưa ra kết quả:

Trong chương trình trên,
đời của biến x = 4 là t hroughout chính, tức là: Nó vẫn còn sống trong suốt quá trình thực hiện chính, Ngoài ra nó có thể truy cập trong chính, đó là phạm vi của nó. Lưu ý rằng nó không thể truy cập được trong hàm vì nó nằm ngoài phạm vi của biến số x.

trong khi phạm vi và tuổi thọ của biến x = 2 nằm trong dấu ngoặc ôm kèm theo {} bên trong chính.

+0

hiện "vẫn còn hiệu lực" có nghĩa là "đang sử dụng"? Làm thế nào để nó tạo sự khác biệt với phạm vi biến? –

+0

@ R.MartinhoFernandes: cũng không sai khi nói về vòng đời của một biến, vì biến là một đối tượng. như tôi nhớ lại tiêu chuẩn định nghĩa một biến như một đối tượng được đặt tên. Tuy nhiên, tôi có lẽ không có ý nghĩa bây giờ, và có lẽ đó là vì một số sửa đổi lịch sử SO loại bỏ bối cảnh ban đầu của nhận xét của bạn? –

+1

Theo dõi nhận xét của Alf: một biến là một liên kết của một biểu tượng (tên) và một đối tượng. Trọn đời liên quan đến đối tượng (và chỉ đối tượng); phạm vi liên quan đến biểu tượng (và chỉ có biểu tượng). –

20

"Phạm vi" của biến là một vùng mã nguồn, nơi bạn có thể tham chiếu đến biến đó.

"Thời gian tồn tại" là thời gian tồn tại trong quá trình thực thi chương trình.

Bởi mặc định thời gian tồn tại của một biến địa phương cũng giống như phạm vi của nó:

void foo() 
{ 
    int x = 123; 
    cout << x << endl; 
    x += 1; 
} 

int main(){ foo(); foo(); foo(); } 

Ở đây, mỗi lần foo được gọi là mới x được tạo ra (không gian được dành riêng cho nó trên stack), và khi thực hiện rời khỏi khối nơi x được khai báo, x bị hủy (trong đó int chỉ có nghĩa là không gian đã được đặt trước, bây giờ được giải phóng để tái sử dụng).

Ngược lại:

void foo() 
{ 
    static int x = 123; 
    cout << x << endl; 
    x += 1; 
} 

int main(){ foo(); foo(); foo(); } 

Ở đây, kể từ khi được khai báo xstatic, không gian được dành riêng cho x trước khi thực hiện chương trình thậm chí bắt đầu. x có vị trí cố định trong bộ nhớ, đây là biến số tĩnh . Và C++ có các quy tắc đặc biệt về việc khởi tạo biến như vậy: nó xảy ra lần đầu tiên việc thực thi đi qua khai báo.

Do đó, trong lần gọi đầu tiên foo, x được khởi tạo, báo cáo đầu ra hiển thị 123 và gia tăng tăng giá trị bằng 1. Trong lần gọi tiếp theo, việc khởi tạo bị bỏ qua (nó đã được thực hiện), giá trị 124 là đầu ra, và giá trị được tăng lên một lần nữa. Sớm.

Tuổi thọ của x này bắt đầu từ khi bắt đầu thực hiện đến khi kết thúc thực hiện.

0

Phạm vi của biến số được xác định tại thời gian biên dịch. Đây là khu vực trong chương trình mà cùng một đối tượng được xác định thông qua định nghĩa có thể truy cập thông qua mã định danh đó.

Tuổi thọ của đối tượng là tính năng được xác định khi chạy, thông qua luồng thực thi. Một đối tượng có thể được truy cập thông qua một con trỏ ngay cả khi biến mà nó được xác định không nằm trong phạm vi.

void f(char *a) { 
    *a = 'f'; 
} 

void g(void) { 
    char aChar = ' '; 
    f(&aChar); 
} 

Ở đây phạm vi biến aChar (số nhận dạng) là nội dung của g. Trong khi thực thi g, thời gian tồn tại của đối tượng mở rộng đến việc thực thi f. Sử dụng số nhận dạng aChar bên trong f sẽ là bất hợp pháp, trình biên dịch sẽ cho bạn biết điều gì đó như "không xác định số aChar trong hàm f". Sử dụng một con trỏ đến đối tượng đó như đã hoàn thành ở trên là hoàn toàn hợp pháp.

0

Phạm vi của biến số đề cập đến mức độ các phần khác nhau của chương trình có quyền truy cập vào biến. Các biến có thể được khai báo là:

  • Bên trong một hàm được gọi là biến cục bộ hoặc biến nội bộ.

  • Bên ngoài tất cả các chức năng được gọi là biến toàn cầu hoặc biến bên ngoài và tuổi thọ hoặc "mức độ" mở rộng trên toàn bộ quá trình chạy của chương trình.

Dưới đây là hướng dẫn chi tiết về biến với các ví dụ: What is variable in C

+0

Và điều gì về phạm vi so với cuộc sống cho mỗi câu hỏi? Phạm vi – J0e3gan

+0

- xác định phần nào của chương trình có thể truy cập vào vòng đời biến - xác định khi biến được tạo và hủy –

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