Trong bài trước bạn đã được học về kiểu dữ liệubiến trong C++. Thế nhưng nội dung bài viết trước sẽ chưa thật sự hoàn thiện nếu không đề cập tới hằng và phạm vi hoạt động của biến và hằng trong C++. Và bài viết này, mình sẽ hoàn thiện tiếp nội dung của bài trước đó. Nội dung bài viết này sẽ tập trung hướng dẫn bạn phương pháp khai báo hằng. Bên cạnh đó mình cũng sẽ hướng dẫn luôn phạm vi hoạt động của biến và hằng trong C++.


Hằng và khai báo hằng trong C++


Bản chất của hằng và biến là gần giống nhau. Do đó bạn cần phải hiểu được biến là gì thì bạn sẽ dễ tiếp cận được những kiến thức về hằng trong C++.

Hằng là gì?

Tương tự biến, hằng cũng là một đại lượng thể hiện cho một dữ liệu nào đó. Nhưng dữ liệu mà hằng nắm giữ sẽ không được sửa đổi trong suốt thời gian thực thi chương trình. Mỗi một hằng sẽ có tên và giá trị mà nó nắm giữ. Bên cạnh đó hằng cũng có thể có kiểu dữ liệu tương tự như biến. Hiểu theo một cách khác, bạn cũng có thể xem như hằng là một trường hợp đặc biệt của biến.

Khai báo hằng

Trong C++, bạn sẽ có 02 cách để khai báo hằng

Cách 01: Khai báo hằng bằng từ khoá #define

Đối với cách này bạn sẽ không cần phải chỉ định kiểu dữ liệu cho hằng. Cú pháp như sau:
Khai báo hằng➤ Ví dụ: bạn hãy thử xét ví dụ sau đây.
Khai báo hằngTrong ví dụ trên mình khai báo 02 hằng tại dòng 4 và 5. Hằng MAX mang giá trị 100, còn hằng weburl lại mang giá trị là một chuỗi có nội dụng “fabiti.com”. Với cách khai báo hằng thế này thường hay được đặt bên dưới #include để có thể dễ dàng truy xuất giá trị của hằng. Tất nhiên là bạn cũng có thể đặt bên trong hàm main nếu muốn.

Cách 02: Khai báo hằng bằng từ khoá const

Đây là cách hay được sử dụng, việc khai báo hằng lúc này sẽ gần tương tự như khai báo biến. Với cách này, bạn sử dụng tiền tố const đặt trước hoặc sau kiểu dữ liệu đều được. Cú pháp như sau:
Khai báo hằngHoặc bạn cũng có thể khai báo như thế này:
Khai báo hằng

➤ Ví dụ: bạn hãy thử xét ví dụ sau.
Khai báo hằngTừ ví dụ trên, bạn có thấy giống với việc khai báo biến không? Đó chính là lý do vì sao mình nói rằng hằng có thể xem như một trường hợp đặc biệt của biến. Chỉ khác là bạn sẽ không được sửa đổi giá trị của hằng sau khi đã khai báo.

Phân loại hằng

Tuỳ vào giá trị hằng nắm giữ mà hằng được phân loại như sau:

  • Hằng số: là những hằng lưu giữ các giá trị là một con số. Hằng số có thể là số nguyên (có kiểu dữ liệu int, short, …) hay số thực (có kiểu dữ liệu là float, double). Như ví dụ ở trên, MAX được xem là một hằng số.
  • Hằng ký tự: là những hằng lưu giữ các ký tự đơn. Ký tự đơn được đặt trong cặp dấu nháy đơn. Ví dụ: ‘A‘, ‘a‘ tương ứng với giá trị nguyên 65, 97 trong bảng mã ASCII.
  • Hằng chuỗi: là những hằng lưu giữ các chuỗi ký tự. Chuỗi là tập hợp các ký tự được đặt trong cặp dấu nháy kép ” “. Hằng weburl trong ví dụ trên được xem là hằng chuỗi.
    ➤ Lưu ý: Mỗi một hằng chuỗi sẽ có ký tự tận cùng null, ký hiệu ‘\0‘. Đây là ký tự kết thúc một chuỗi và bạn sẽ không nhìn thấy ký tự này được.

Phạm vi hoạt động của biến và hằng


Mỗi một biến/hằng được khai báo đều chỉ hoạt động trong một phạm vi nhất định. Hiểu theo cách khác, bạn chỉ có thể sử dụng được biến/hằng trong khu vực mà biến/hằng được khai báo. Phạm vi hoạt động của biến/hằng phụ thuộc vào vị trí mà bạn khai báo biến/hằng. Trong lập trình, việc xác định được phạm vi hoạt động của biến/hằng tương đối quan trọng. Điều này thể hiện việc bạn kiểm soát dữ liệu trong chương trình có tốt hay không. Có 03 dạng khai báo biến/hằng hay gặp:

Khai báo biến cục bộ

Biến cục bộ là biến được khai báo bên trong một khối lệnh nào đó. Bạn chỉ có thể sử dụng biến cục bộ bên trong chính khối lệnh nó được khai báo mà thôi. Nếu ra ngoài khối lệnh, biến này sẽ không còn tác dụng và bạn cũng không thể truy xuất được biến này nữa.

➤ Ví dụ: Xét ví dụ sau.
Biến cục bộNào, bây giờ chúng ta cùng phân tích một chút nhé:

  • Biến mainVariable khai báo ở dòng 3, là biến cục bộ bên trong hàm main. Do đó bạn có thể truy xuất biến mainVariable tuỳ ý ở bất kỳ vị trí nào bên trong thân hàm main. Bạn lưu ý thêm dòng số 10 nhé, dòng này mình thực hiện thay đổi giá trị mới cho biến mainVariable. Bạn cần hiểu rằng, khối lệnh từ dòng 6 đến dòng 11 nằm bên trong hàm main. Trong khi đó biến mainVariable lại có thể truy xuất mọi nơi trong main, vì vậy việc thay đổi giá trị của biến mainVariable tại dòng 10 là hợp lệ.
  • Biến blockVariable khai báo ở dòng 7, được xem là biến cục bộ của khối lệnh chứa nó. Vì vậy bạn chỉ có thể truy xuất biến này bên trong khối lệnh từ dòng 6 đến dòng 11 mà thôi. Sau khi kết thúc khối lệnh (bắt đầu từ dòng 12 trở đi) thì biến blockVariable sẽ không còn được lưu giữ, nếu bạn cố gắng truy xuất ở đây thì chương trình sẽ báo lỗi.

Bạn đã hiểu thế nào là biến cục bộ chưa? Hãy cố gắng viết lại chương trình trên và chạy thử để thấy kết quả nhé.

Khai báo biến toàn cục

Biến toàn cục là biến được khai báo bên ngoài hàm main và cũng không khai báo trong bất kỳ hàm nào. Thông thường biến toàn cục được khai báo trên đầu chương trình (nhưng dưới dòng #include). Biến toàn cục có thể được truy xuất tại bất kỳ vị trí nào trong toàn bộ chương trình.

➤ Ví dụ: Xét ví dụ sau.

Biến toàn cụcTrong ví dụ trên, mình khai báo biến globalVariable bên ngoài hàm main. Do biến globalVariable không nằm trong bất kỳ khối lệnh nào, vì thế bạn có thể truy xuất biến này ở bất kỳ chỗ nào trong chương trình mà không bị bất kỳ giới hạn nào cả. Trong ví dụ này, mình thực hiện truy xuất giá trị biến globalVariable ngay trong hàm main, đều được.

Khai báo biến là tham số của một hàm

Phần này thì tạm thời mình không trình bày nhé, sang tới phần hàm thì mình sẽ giới thiệu bạn được rõ hơn.

Mối quan hệ giữa biến toàn cục và biến cục bộ

Trong quy tắc đặt tên biến, mình có nói rằng “Không được trùng với các biến đã được khai báo trong cùng một phạm vi“. Vậy thì mình có một câu hỏi như sau, bạn hãy suy nghĩ trả lời trước khi đọc đáp án nhé.

Câu hỏi đặt ra là:

Giả sử đặt tên theo như ví dụ bên dưới thì biến toàn cục và biến cục bộ có được đặt tên trùng nhau như vậy không?

Biến toàn cục và biến cục bộ
Trước khi trả lời câu hỏi này, chúng ta hãy cùng nhau phân tích một chút nhé. Quy tắc là không được khai báo trùng tên trong cùng một phạm vi. Vậy thì biến toàn cục và biến cục bộ có cùng phạm vi khai báo không? Có thể có bạn sẽ cho là cùng phạm vi và có thể cũng có bạn cho là không cùng phạm vi.

  • Bạn A, cho là cùng phạm vi giải thích rằng: “Biến toàn cục có thể truy xuất bất kỳ chỗ nào trong toàn bộ chương trình. Do đó phạm vi của biến toàn cục bao phủ luôn phạm vi của biến cục bộ”.
  • Bạn B, cho là không cùng phạm vi thì giải thích: “Biến toàn cục khai báo ngoài hàm main, còn biến cục bộ khai báo trong hàm main. Do đó 02 biến này không cùng phạm vi với nhau”.

Đáp án:

Thực ra thì cả 02 ý trên đều đúng bạn ạ. Biến toàn cục và biến cục bộ không cùng phạm vi với nhau, do đó bạn được phép khai báo trùng tên cho cả biến toàn cục và biến cục bộ. Đây chính là đáp án cho câu hỏi ở trên.

Thế nhưng, biến toàn cục lại có khả năng truy xuất bên trong main. Vậy thì câu lệnh cout giá trị của biến unknowVariable ở trên sẽ in giá trị nào? Có thể bạn A lúc này vẫn đang còn thắc mắc như vậy. Để cho rõ ràng hơn, mình sẽ tiết lộ thêm cho bạn một ý như sau: “Trong cùng một khối lệnh, biến cục bộ sẽ được xét ưu tiên hơn biến toàn cục nếu cả 02 có cùng tên“. Và đây chính là kết quả khi mình chạy thực thi chương trình trên:
Biến toàn cục và biến cục bộMình nghĩ chắc là bạn A vẫn chưa hài lòng đâu. Bởi có thể bạn A sẽ còn thắc mắc là: “Vậy làm sao để truy xuất biến toàn cục trong trường hợp trùng tên thế này?”.

Giải pháp cho trường hợp này là sử dụng toán tử phạm vi “::” để truy xuất biến toàn cục. Ví dụ như sau:
Biến toàn cục và biến cục bộBạn hãy chạy thử chương trình để thấy kế quả. Đến đây thì mọi chuyện đã rõ ràng cả rồi nhé ????.


Tổng kết


Bài viết này là mảnh ghép cuối cùng còn thiếu của chủ đề về biến và hằng trong C++. Mình đã cố gắng trình bày trong khả năng có thể để diễn đạt nội dung tới bạn một cách chi tiết nhất. Và có thể bài viết này hơi nhiều chữ và nhiều code đối với bạn mới học. Đọc được tới phần kết này cho thấy bạn đã rất cố gắng trong việc học lập trình. Điều này rất đáng hoan nghênh, tuy nhiên trong quá trình diễn đạt có thể mình chưa giúp được bạn nắm hết toàn bộ các ý trong bài viết. Vì vậy nếu có gì thắc mắc bạn hãy gửi comment bên dưới nhé.

5 1 vote
Đánh giá bài viết
0 Góp ý
Inline Feedbacks
View all comments