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ụ:
Mã nguồn:
1
2
3
4
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:
Mã nguồn:
1
2
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:
Mã nguồn:
1
2
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:
Mã nguồn:
1
2
3
4
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é 😀
Mã nguồn:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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:
Mã nguồn:
1
2
3
4
5
6
7
8
9
10
#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!
Đánh giá bài viết này để tác giả có động lực hơn nhé!
Axact

Administrator:

Xin chào, tôi là Nguyễn Quý Quang Huy. Tôi 14 tuổi và sinh sống tại Hoài Đức, Hà Nội. Tôi lập ra Rinne-IT Blog này nhằm chia sẻ những kiến thức mình có và những bài viết hay trên mạng do tôi tổng hợp. Blog đang trong giai đoạn phát triển nên nếu có lỗi mong các bạn bỏ qua. Tôi luôn chào đón những ý kiến phát triển từ từ các bạn. Giờ thì hãy khám phá blog của tôi nào ^_^

Bình Luận:

0 bình luận: