- Back to Home »
- C »
- C - Scope Rules
Monday, April 27, 2015
1. Local variables
Local variables là biến được khai báo bên trong một hàm hoặc một block code
local.c
#include <stdio.h>
void func_count();
int main()
{
{ /* block code */
int count = 5; /* local variables */
printf("%s<%d>: count = %d \n", __FUNCTION__, __LINE__, count) ;
}
int a = 0;
switch(a){
case 0:{ /* block code */
int count = 0; /* local variables */
printf("%s<%d>: count = %d \n", __FUNCTION__, __LINE__, count) ;
}
break;
case 1:{
int count = 1; /* local variables */
printf("%s<%d>: count = %d \n", __FUNCTION__, __LINE__, count) ;
}
break;
default:
break;
}
func_count();
return 0;
}
void func_count(){ /* function */
int count = 0; /* local variables */
while(count < 5){
printf("%s: count = %d \n", __FUNCTION__, count) ;
count++;
}
}
Compile & Execute
$ gcc local.c
$ ./a.out
main<11>: count = 5
main<18>: count = 0
func_count: count = 0
func_count: count = 1
func_count: count = 2
func_count: count = 3
func_count: count = 4
Mặc dù các biến cùng tên la count nhưng chúng là local variable, chỉ có phạm vi hoạt động bên trong hàm và block mà chúng được khai báo.
2. Global variables
Global variables là biến được khai báo bên ngoài tất cả các hàm, được truy xuất bên trong hàm, trong trường hợp trong hàm có khai báo một biến local thì biến global này có độ ưu tiên thấp hơn.
global.c
#include <stdio.h>
int count = 5; /* global variables */
void func_count();
int main()
{
printf("%s<%d>: count = %d \n", __FUNCTION__, __LINE__, count) ;
func_count();
return 0;
}
void func_count(){
int count = 0; /* local variables */
while(count < 5){
printf("%s: count = %d \n", __FUNCTION__, count) ;
count++;
}
}
Compile & Execute
$ gcc global.c
$ ./a.out
main<13>: count = 5
func_count: count = 0
func_count: count = 1
func_count: count = 2
func_count: count = 3
func_count: count = 4
Trong hàm con có khai báo biến local cùng tên count, trong trường hợp này biến global có độ ưu tiên thấp hơn, tức mất khả năng truy xuất trong hàm này.
3. Initializing local and global variables
Giá trị khởi tạo của biến được cho theo bảng sau
Data Type | Initial Default Value |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
Note: Trong thực tế, giá trị khởi tạo còn phụ thuộc vào trình biên dịch nữa, vậy nên tốt nhất là khi khai báo biến nên chủ động đặt giá trị khởi tạo cho chúng, nhất là đối với biến con trỏ, và trong lập trình hướng đối tượng luôn phải nhớ khởi tạo giá trị ban đầu của các biến (thuộc tính) trong hàm khởi tạo Constructor
Ex
int *p;
if(!p){
p = (int*)malloc(sizeof(int));
*p = 10;
printf("%s<%d>: *p = %d \n", __FUNCTION__, __LINE__, *p) ;
}
if(p) free(p);
theo lý thuyết p = NULL và vì thế đoạn code trong if sẽ được thực hiện, tuy nhiên trong thực tế một số trình biên dich được viết chưa hoàn thiện nên xảy ra trường hợp "lấp lửng" và khi chạy run-time thì chương trình thỉnh thoảng sẽ bị crash ở đoạn if, lúc được lúc không, để chắc chắn thì coder nên khai báo rõ giá trịn khởi tạo
int *p = NULL;