Trang chủ » Bài 4 – Phép gán và tầm vực của biến
Lập trình C/C++

Bài 4 – Phép gán và tầm vực của biến

cplusplus

Xin chào các bạn!

Bài viết hôm nay mình sẽ nói về phép gán và tầm vực của biến. Cũng giống như bạn và người khác có trùng tên, biến trong C++ cũng có thể trùng tên, nhưng cách khai báo và tầm vực của nó lại khác hẳn.

Trước tiên mình xin nói về phép gán, nó là phép cơ bản và rất quan trọng. Khi khai báo biến, cũng như khi thao tác với biến, mình phải gán giá trị nhiều lần phù hợp với mục đích. Cú pháp như sau:

<tên biến> = <giá trị>;

Tất nhiên, giá trị phải phù hợp với kiểu dữ liệu của biến. Không thể lấy râu ông này cắm cằm bà kia được (mất lịch sự :v), cũng như lấy chuỗi gán vào biến int được, trừ các trường hợp ép kiểu, mình sẽ giải thích ở những bài sau.

Cần phân biệt giữa phép gán = và phép so sánh ==

Ví dụ:

int a, b, c;
a = 5; // int a = 5;
b = 7 + 8 / 2;
c = b = a = 7;

Phép gán sẽ gán những giá trị từ bên phải qua. Ở ví dụ cuối cùng, 7 gán vào a, sau đó a gán vào b và b gán vào c. Từ đó ta có 1 lưu ý quan trọng: KHÔNG THỂ thay đổi vị trí của biến và giá trị gán. Như 7 = a là không được, dịch ra ngôn ngữ tự nhiên là gán a vào 7 (nghe nó kì kì sao ấy :v)

Ta xét 1 ví dụ khác:

a = a - 5; // Trừ a cho 5
b = b + 1; // Cộng b cho 1

Ở ví dụ trên, ta có thể rút gọn biểu thức lại thành:

a -= 5;
b += 1; // Hoặc b++/++b

Những phép rút gọn trên cũng được áp dụng với các phép toán khác. Một điều lưu ý ở ví dụ cuối cùng (b++ và ++b):

  • b++ (postfix): truy vấn giá trị của b trước khi tăng 1
  • ++b (prefix): truy vấn giá trị của b sau khi tăng 1

Để hiểu thêm, ta xét 1 ví dụ sau:

int a = 0;
cout << a++ << endl; // = 0
a = 0; // Reset gia tri
cout << ++a << endl; // = 1

a++ lấy giá trị a trước rồi mới tăng 1, còn ++a là tăng 1 trước rồi mới lấy giá trị. Mình thì ít gặp trường hợp phải dùng tới chú ý này nên gần như a++ và ++a với mình là giống nhau 😀

Tiếp theo, mình xin nói về tầm vực của biến. Cùng xét ví dụ sau nhé 😀

#include <iostream>
using namespace std;
int a = 0;
void main()
{
int a = 1;
cout << a;
{
int a = 2;
cout << a;
}
}

Ơ sao lại ngộ nhỉ? a được khai báo 3 lần với có 3 giá trị khác nhau, điều đó có thể không? Nếu bạn bỏ cặp móc nhọn thì điều đó KHÔNG THỂ, khi có nó thì ta phải xét tới 1 vấn đề khác, đó là tầm vực (scope) của biến.

Tầm vực, hay phạm vi của biến, là cặp móc nhọn (blocks) chứa nó. Ở ví dụ trên, phạm vi của a = 2 là block phía trong, a = 1 là hàm main (block lớn), a = 0 là toàn bộ chương trình. Ta gọi biến a = 1, a = 2 là biến cục bộ (local variable), còn a = 0 là biến toàn cục (global variable). Một số lưu ý về tầm vực của biến như sau:

  • Biến cục bộ chỉ tồn tại cho đến khi kết thúc block (gặp dấu đóng móc nhọn “}”)
  • Độ ưu tiên từ trong ra ngoài (từ block con tới block cha)
  • Có thể sử dụng biến toàn cục cùng tên với biến cục bộ phía trong bằng toán tử ::

Xét ví dụ sau:

#include <iostream> 
using namespace std;
int a = 0;
void main()
{
int a = 1;
cout << a; // = 1
cout << ::a; // = 0
}

Tuy nhiên mình không khuyến khích điều đó vì như vậy sẽ làm cho đoạn code rối rắm hơn. Mình thích viết code “trong sáng” hết mức có thể 😀

Trên đây là bài viết về phép gán và tầm vực của biến. Cảm ơn các bạn đã theo dõi!

Tags

About the author

Võ Hoài Sơn

Tính tình bất định
Chọc vào là bịnh
Rất yêu lập trình
Luôn code hết mình
Mình hiện đang là sinh viên của trường ĐH Khoa học tự nhiên TPHCM. Bản thân rất thích code, kiêm luôn cả mần thơ nên thường hơi hâm hâm dở dở. Ngoài ra chém gió, chém chuối, chém trái cây các kiểu cũng là sở trường của mình. Rất mong được làm quen với các bạn :D

Add Comment