[Khóa học C++] Bài 18 - Variable definition, initialization, assignment

Share:

Như vậy là chúng ta đã đi qua được phần một của series lập trình C++. Phần một là phần cơ bản về C++, giúp bạn làm quen dễ dàng với ngôn ngữ này, cũng như có một kiến thức nhất định để bước qua phần 2: Variables and Fundamental Data Types.

Ở trong bài đầu tiên của phần 2 này, chúng ta sẽ tìm hiểu về khái niệm về biến, khởi tạo biến, phép gán, vv.

Addressing memory

Bạn đã được học về biến (variable) trong Bài 4 - Variables, initialization, and assignment. Tóm tắt lại, máy tính sẽ có RAM (random access memory) để cho chương trình sử dụng, khi một biến được định nghĩa, máy tính sẽ cấp một vùng nhớ trong RAM để lưu trữ giá trị cho biến đó.

Đơn vị nhỏ nhất trong máy tính binary digit (chúng ta hay được biết với cái tên là bit), và bit chỉ có 2 giá trị là 0 hoặc 1. Một điều chắc chắn, máy tính cũng chỉ hiểu những giá trị 0, 1 này, và nếu bạn xem giá trị của một register nào đó trong bộ nhớ (có thể xem thông qua debug), bạn sẽ nhìn thấy một chuỗi bit tương tự như 1001010110001.

Bộ nhớ máy tính được tổ chức bằng cách thanh ghi (memory register) sắp xếp liên tục với nhau, mỗi thanh ghi sẽ có một địa chỉ nhất định, chúng ta gọi là address. Chúng ta có thể dùng address để truy cập giá trị được lưu trữ trong thanh ghi. Bạn có thể hình dung như hình bên dưới.

Một đơn vị chúng ta hay sử dụng nữa trong máy tính là byte, một byte bằng 8 bit.
Ở hình phía trên, mỗi register sẽ là một byte, mỗi byte sẽ có một address tương ứng.

Trong C++, chúng ta có một khái niệm là data type hay kiểu dữ liệu.
Khi bạn cần khai báo một biến, bạn phải khai báo cho biến này một kiểu dữ liệu xác định. Ví dụ integer (kiểu dữ liệu 4 byte theo các kiến trúc CPU ngày nay), với một biến integer, máy tính sẽ cấp cho biến này 4 register để lưu trữ giá trị của biến, và 4 register này sẽ nằm liên tục với nhau trong bộ nhớ.
Và khi biên dịch, compiler sẽ hiểu rằng vùng nhớ này đang lưu trữ một biến integer và biết cách để sử dụng nó.

Ở những bài sau, bạn sẽ đi sâu về cách sắp xếp từng byte một trong một biến integer (hay biến bất kì) vào các memory register với các khái niệm big-endianlittle-endian.

Fundamental data types

Cũng giống với nhiều ngôn ngữ khác, C++ hổ trợ lập trình viên một vài kiểu dữ liệu cơ bản như bảng bên dưới:

Category
Types
Meaning
Example
Notes
boolean
bool
true or false
true
character
char, wchar_t, char16_t, char32_t
a single ASCII character
‘c’
char16_t, char32_t introduced in C++11
floating point
float, double, long double
a number with a decimal
3.14159
integer
short, int, long, long long
a whole number
64
long long introduced in C99/C++11
void
no type
void
n/a

Defining a variable

Trong phần 1 - C++ basic, bạn đã biết như thế nào là khai báo biến (define).


Việc khai báo một biến cực kì đơn giản trong C++, chỉ cần kiểu dữ liệu (type) và tên biến (varName).
Sau đây là 5 ví dụ về khai báo biến trong C++:


Chý ý rằng, kiểu void không được sử dụng trong việc khai báo biến.

Variable initialization

Khi bạn định nghĩa (define) một biến, bạn có thể khởi tạo luôn giá trị cho biến đó. Việc làm này được gọi là variable initialization.

C++ hổ trở bạn 3 cách để khởi tạo giá trị của một biến.
Cách thứ nhất là sử dụng copy initialization (cách này khá quen thuộc khi viết code) như sau:

Cách thứ 2, bạn có thể dùng direct initialization với dấu ngoặc đơn:

Cách sử dụng này có cú pháp rất giống khi sử dụng function, nhưng C++ sẽ kiểm tra tên của biến hay function để giải quyết vấn đề.
Direct initialization nhanh hơn copy initialization trong nhiều trường hợp. Lợi ích của direct initialization còn đến trong các class - khái niệm của lập trình hướng đối tượng - mà bạn sẽ học sau này.

Chúng tôi khuyên bạn nên sử dụng direct initialization thay vì copy initialization.

Uniform initialization in C++11

C++ 11 đã thêm một cú pháp mới cho việc khởi tạo giá trị biến là uniform initialization. So với 2 cách trên, thì uniform initialization có nhiều lợi ích hơn. Những lợi ích đó là gì? Đây là câu hỏi nâng cao dành cho bạn đọc.

Trên đây là 3 ví dụ sử dụng uniform initialization.

Lời khuyên cho bạn: nếu trình biên dịch bạn dùng hổ trợ C++ 11, thì hãy dùng uniform initialization.

Variable assignment

Trái ngược với variable initialization (biến được khởi tạo giá trị ngay khi nó được define) là variable assignment (biến được khởi tạo giá trị sau khi được định nghĩa). Chúng ta thường gọi đây là copy assignment.

Uninitialized variables

Những biến mà không được khởi tạo giá trị thì được gọi là uninitialized variable, và khi biến không được khởi tạo giá trị, nó sẽ được gán bằng một giá trị rác nào đó. Đây là một việc làm cực kì huy hiểm cho chương trình bạn.

Lời khuyên cho bạn, luôn luôn khởi tạo giá trị cho biến khi được định nghĩa.

Defining multiple variables

C++ hổ trợ chúng ta khai báo nhiều biến cùng kiểu dữ liệu trên một dòng bằng cách sử dụng dấu phẩy.

Bạn cũng có thể khởi tạo giá trị ngay khi define nhiều biến như sau:

Có 3 lỗi mà một newbie thường gặp khi sử dụng multi define được mô tả trong 3 ví dụ bên dưới:

Bạn hãy xem cẩn thận 3 ví dụ trên để tránh các lỗi xãy ra.

Lời khuyên cho bạn, tránh sử dụng multi define để tránh gây ra lỗi nếu không cần thiết.

Where to define variables

Một số trình biên dịch C cũ bắt người dùng phải define tất cả các biến tại phần đầu của hàm, và nếu bạn define biến ở đâu đó giữa chương trình, một lỗi compile sẽ gây ra.
Đây là ví dụ về việc define các biến ở đầu một hàm.

Đây là một style quá lỗi thời. C++ không bắt buộc bạn phải làm việc này, trong một số trường hợp, nếu bạn define tất cả các biến sẽ làm chương trình khó đọc hơn. Thay vào đó, bạn hãy define các biến ngay tại vị trí thích hợp nhất như ví dụ sau:

Cách define biến như trên có một vài lợi ích cho bạn.
Chương trình bạn sẽ dễ đọc hơn, các biến x, y, z dễ sự dụng hơn, bạn biết được lúc nào cần sử dụng biến nào. Tránh trường hợp bạn define biến và "quên" sử dụng.

Lời khuyên cho bạn, hãy define một biến ngay cạnh câu lệnh sử dụng biến đó lần đầu tiên.



1 nhận xét: