Identifiers
Một
tên (indentifiers) hợp lệ là một chuỗi gồm các
chữ cái, chữ số hoặc kí tự gạch
dưới. Chiều dài của một tên là không giới
hạn.
Kí
tự trống, các kí tự đánh dấu đều không
thể có mặt trong một tên. Chỉ có chữ cái, chữ số và kí tự gạch
dưới là được cho phép. Thêm vào đó,
một tên biến luôn phải bắt
đầu bằng một chữ cái. Chúng cũng
có thể bắt đầu bằng kí tự gạch
dưới ( _ ) nhưng kí tự này thường
được dành cho các liên kết bên ngoài (external link).
Không bao giờ chúng bắt đầu bằng một
chữ số.
Một
luật nữa mà bạn phải quan tâm đến khi
tạo ra các tên của riêng mình là chúng không được
trùng với bất kì từ khoá nào
của ngôn ngữ hay của trình dịch, ví dụ các tên
sau đây luôn luôn được coi là từ khoá theo
chuẩn ANSI-C++ và do vậy chúng không thể được
dùng để đặt tên
asm, car, bool, break, marry, catch, to char,
class, const, const_cast, continue, default, delete, do, double, dynamic_cast,
else, enum, explicit, extern, false, float, for, friend, goto, if, inline, int,
long, mutable, namespace, new, operator, private, protected, public, to
register, reinterpret_cast, return, short, signed, sizeof, static, static_cast,
struct, switch, template, this, throw, true, try, typedef, typeid, typename,
union, unsigned, using, virtual, void, volatile, wchar_t
Thêm vào đó, một số
biểu diễn khác của các toán tử (operator) cũng
không được dùng làm tên vì chúng là những từ
được dành riêng trong một số trường
hợp.
and, and_eq, bitand, bitor, compl, not,
not_eq, or, or_eq, xor, xor_eq
Trình dịch của bạn có
thể thêm một từ dành riêng đặc trưng khác. Ví
dụ, rất nhiều trình dịch 16 bit (như các trình
dịch cho DOS) còn có thể các từ khoá far, huge
và near.
Chú ý: Ngôn
ngữ C++ là "case sensitive"
có nghĩa là phân biệt chữ hoa chữ thường. Do
vậy biến RESULT khác với result cũng
như Result.
Các kiểu dữ liệu
Khi lập trình, chúng ta lưu
trữ các biến trong bộ nhớ của máy tính nhưng
máy tính phải biết chúng ta muốn lưu trữ gì trong
chúng vì các kiểu dữ liệu khác nhau sẽ cần
lượng bộ nhớ khác nhau.
Bộ
nhớ của máy tính chúng ta được tổ chức
thành các byte. Một byte là lượng bộ nhớ nhỏ
nhất mà chúng ta có thể quản lí. Một byte có thể
dùng để lưu trữ một loại dữ liệu
nhỏ như là kiểu số nguyên từ 0 đến 255
hay một kí tự. Nhưng máy tính có thể xử lý các
kiểu dữ liệu phức tạp hơn bằng cách
gộp nhiều byte lại với nhau, như số nguyên
dài hay số thập phân. Tiếp theo bạn sẽ có
một danh sách các kiểu dữ liệu cơ bản trong
C++ cũng như miền giá trị mà chúng có thể
biểu diễn
Tên
|
Số byte
|
Mô tả
|
Miền giá trị
|
char
|
1
|
Kí tự hay kiểu số
nguyên 8-bit
|
có dấu: -128 to 127
không dấu: 0 to 255 |
short
|
2
|
kiểu số nguyên 16-bit
|
có dấu: -32763 to 32762
không dấu: 0 to 65535 |
long
|
4
|
kiểu số nguyên 32-bit
|
có dấu:-2147483648 to 2147483647
không dấu: 0 to 4294967295 |
int
|
*
|
Số nguyên. Độ dài
của nó phụ thuộc vào hệ thống, như trong
MS-DOS nó là 16-bit, trên Windows 9x/2000/NT là 32 bit...
|
Xem short, long
|
float
|
4
|
Dạng dấu phẩy
động
|
3.4e + / - 38 (7 digits)
|
double
|
8
|
Dạng dấu phẩy
động với độ chính xác gấp đôi
|
1.7e + / - 308 (15 digits)
|
long double
|
10
|
Dạng dấu phẩy
động với độ chính xác hơn nữa
|
1.2e + / - 4932 (19 digits)
|
bool
|
1
|
Giá trị logic. Nó mới
được thêm vào chuẩn ANSI-C++. Bởi vậy không
phải tất cả các trình dịch đều hỗ
trợ nó.
|
true hoặc false
|
Ngoài
các kiểu dữ liệu cơ bản nói trên còn tồn
tại các con trỏ và các tham số không kiểu (void) mà
chúng ta sẽ xem xét sau.
Khai báo một biến
Để có thể sử
dụng một biến trong C++, đầu tiên chúng ta
phải khai báo nó, ghi rõ nó là kiểu dữ liệu nào. Chúng
ta chỉ cần viết tên kiểu (như int, short,
float...) tiếp theo sau đó là một tên biến
hợp lệ. Ví dụ
int a;
float mynumber;
float mynumber;
Dòng đầu tiên khai báo
một biến kiểu int với tên là a. Dòng
thứ hai khai báo một biến kiểu float với
tên mynumber. Sau khi được khai báo, các biến trên
có thể được dùng trong phạm
vi của chúng trong chương trình.
Nếu
bạn muốn khai báo một vài biến có cùng một
kiểu và bạn muốn tiết kiệm công sức
viết bạn có thể khai báo chúng trên một dòng, ngăn
cách các tên bằng dấu phẩy. Ví dụ
int a, b, c;
khai báo ba biến kiểu int
(a,b và c) và hoàn toàn tương đương
với :
int a;
int b;
int c;
int b;
int c;
Các
kiểu số nguyên (char,
short, long and int) có thể là số có dấu hay
không dấu tuỳ theo miền giá trị mà chúng ta cần
biểu diễn. Vì vậy khi xác định một
kiểu số nguyên chúng ta đặt từ khoá signed hoặc unsigned trước tên kiểu
dữ liệu. Ví dụ:
unsigned
short NumberOfSons;
signed int MyAccountBalance;
signed int MyAccountBalance;
Nếu ta không chỉ rõ signed or unsigned nó sẽ
được coi là có dấu, vì vậy trong khai báo thứ hai chúng ta có thể
viết :
int MyAccountBalance
cũng
hoàn toàn tương đương với dòng khai báo ở
trên. Trong thực tế, rất ít khi người ta dùng
đến từ khoá signed. Ngoại lệ duy nhất
của luật này kiểu char. Trong chuẩn ANSI-C++ nó
là kiểu dữ liệu khác với signed char và unsigned char.
Để
có thể thấy rõ hơn việc khai báo trong chương
trình, chúng ta sẽ xem xét một đoạn mã C++ ví dụ
như sau:
// operating with variables
#include
int main ()
{
// declaring variables:
int a, b;
int result;
// process:
a = 5;
b = 2;
a = a + 1;
result = a - b;
// print out the result:
cout << result;
// terminate the program:
return 0;
}
|
4
|
Đừng
lo lắng nếu như việc khai báo có vẻ hơi
lạ lùng với bạn. Bạn sẽ thấy phần chi
tiết còn lại trong phần tiếp theo
Khởi tạo các biến
Khi khai báo một biến, giá
trị của nó mặc nhiên là không xác định. Nhưng
có thể bạn sẽ muốn nó mang một giá trị xác
định khi được khai báo. Để làm
điều đó, bạn chỉ cần viết dấu
bằng và giá trị bạn muốn biến đó sẽ
mang:
type
identifier =
initial_value ;
Ví dụ, nếu chúng ta muốn
khai báo một biến int là a chứa giá trị 0
ngay từ khi khởi tạo, chúng ta sẽ viết :
int a = 0;
Bổ
xung vào cách khởi tạo kiểu C này, C++ còn có thêm một
cách mới để khởi tạo biến bằng cách
bọc một cặp ngoặc đơn sau giá trị
khởi tạo. Ví dụ :
int a (0);
Cả hai cách đều hợp
lệ trong C++.
Phạm vi hoạt động của các biến
Tất cả các biến mà chúng
ta sẽ sử dụng đều phải được
khai báo trước. Một điểm khác biết giữa
Cvà C++ là trong C++ chúng ta có thể khai báo
biến ở bất kì nơi nào trong chương trình,
thậm chí là ngay ở giữa các lệnh thực hiện
chứ không chỉ là ở đầu khối lệnh
như ở trong C.
Mặc
dù vậy chúng ta vẫn nên theo cách của ngôn ngữ C khi
khai báo các biến bởi vì nó sẽ rất hữu dụng
khi cần sửa chữa một chương trình có
tất cả các phần khai báo được gộp
lại với nhau. Bởi vậy, cách thông dụng nhất
để khai báo biến là đặt nó trong phần
bắt đầu của mỗi hàm (biến cục
bộ) hay trực tiếp trong thân chương trình, ngoài tất
cả các hàm (biến toàn cục).
Global variables (biến toàn cục) có thể được
sử dụng ở bất kì đâu trong chương
trình, ngay sau khi nó được khai báo.
Tầm hoạt động của local variables (biến
cục bộ) bị giới hạn trong phần mã mà nó
được khai báo. Nếu chúng được khai báo
ở đầu một hàm (như hàm main), tầm
hoạt động sẽ là toàn bộ hàm main.
Điều đó có nghĩa là trong ví dụ trên, các
biến được khai báo trong hàm main() chỉ có
thể được dùng trong hàm đó, không
được dùng ở bất kì đâu khác.
Thêm vào các biến toàn cục và cục bộ, còn có
các biến ngoài (external). Các
biến này không những được dùng trong một
file mã nguồn mà còn trong tất cả các file
được liên kết trong chương trình.
Trong C++ tầm hoạt động của một
biến chính là khối lệnh mà nó được khai báo
(một khối lệnh là một tập hợp các
lệnh được gộp lại trong một
bằng các ngoặc nhọn { } ). Nếu nó
được khai báo trong một hàm tầm hoạt
động sẽ là hàm đó, còn nếu được
khai báo trong vòng lặp thì tầm hoạt động
sẽ chỉ là vòng lặp đó....
|
Các hằng số
Một hằng số là
bất kì một biểu thức nào mang một giá trị
cố định, như:
Các số nguyên
1776
707
-273
707
-273
chúng là các hằng mang giá trị
số. Chú ý rằng khi biểu diễn một hằng
kiểu số chúng ta không cần viết dấu ngoặc
kép hay bất kì dấu hiệu nào khác.
Thêm
vào những số ở hệ cơ số 10 ( cái mà
tất cả chúng ta đều đã biết) C++ còn cho phép sử dụng các hằng số
cơ số 8 và 16. Để biểu diễn một
số hệ cơ số 8 chúng ta đặt trước
nó kí tự 0, để biễu diễn số ở hệ
cơ số 16 chúng ta đặt trước nó hai kí tự
0x. Ví dụ:
75 // Cơ số 10
0113 // cơ số 8
0x4b // cơ số 16
Các
số thập phân (dạng dấu phẩy động)
Chúng
biểu diễn các số với phần thập phân và/hoặc
số mũ. Chúng có thể bao gồm phần thập phân,
kí tự e (biểu diễn 10 mũ...).
3.14159 // 3.14159
6.02e23 // 6.02 x 1023
1.6e-19 // 1.6 x 10-19
3.0 // 3.0
Kí tự và xâu kí tự
Trong C++ còn tồn tại các hằng
không phải kiểu số như:
'z'
'p'
"Hello world"
"How do you do?"
'p'
"Hello world"
"How do you do?"
Hai biểu thức đầu
tiên biểu diễn các kí tự đơn, các kí tự
được đặt trong dấu nháy đơn ('), hai
biểu thức tiếp theo biểu thức các xâu kí tự
được đặt trong dấu nháy kép (").
Khi
viết các kí tự đơn hay các xâu kí tự cần
phải đặ chúng trong các dấu nháy để phân
biệt với các tên biến hay các từ khoá. Chú ý:
x
'x'
'x'
x trỏ
đến biến x trong khi 'x' là kí tự hằng 'x'.
Các
kí tự đơn và các xâu kí tự có một tính chất
riêng biệt là các mã điều khiển. Chúng là những kí
tự đặc biệt mà không thể được
viết ở bất kì đâu khác trong chương trình
như là mã xuống dòng (\n) hay tab (\t). Tất cả
đều bắt đầu bằng dấu xổ
ngược (\). Sau đây là danh sách các mã điều khiển đó:
\n
|
xuống dòng
|
\r
|
lùi về đầu dòng
|
\t
|
kí tự tab
|
\v
|
căn thẳng theo chiều
dọc
|
\b
|
backspace
|
\f
|
sang trang
|
\a
|
Kêu bíp
|
\'
|
dấu nháy đơn
|
\"
|
dấu nháy kép
|
\
|
dấu hỏi
|
\\
|
kí tự xổ ngược
|
Ví dụ:
'\n'
'\t'
"Left \t Right"
"one\ntwo\nthree"
'\t'
"Left \t Right"
"one\ntwo\nthree"
Thêm vào đó, để biểu diễn
một mã ASCII bạn cần sử dụng kí tự xổ
ngược (\) tiếp theo đó là mã ASCII viết trong
hệ cơ số 8 hay cơ số 16. Trong trường hợp
đầu mã ASCII được viết ngay sau dấu
sổ ngược, trong trường hợp thứ hai,
để sử dụng số trong hệ cơ số 16
bạn cần viết kí tự x trước số
đó (ví dụ \x20
hay \x4A).
Các hằng chuỗi kí tự có thể được
viết trên nhiều dòng nếu mỗi dòng được
kết thúc bằng một dấu sổ ngược (\):
"string
expressed in \
two lines"
two lines"
Bạn có thể nối
một vài hằng xâu kí tự ngăn cách bằng một
hay vài dấu trống, kí tự tab, xuống dòng hay bất
kì kí tự trống nào khác.
"we form" "a unique" "string" "of characters"
Định nghĩa các hằng (#define)
Bạn có thể định
nghĩa các hằng với tên mà bạn muốn để
có thể sử dụng thường xuyên mà không mất tài
nguyên cho các biến bằng cách sử dụng chỉ
thị #define. Đây là dạng của nó:
#define
identifier
value
Ví dụ:
#define PI 3.14159265
#define NEWLINE '\n'
#define WIDTH 100
#define NEWLINE '\n'
#define WIDTH 100
chúng định nghĩa ba
hằng số mới. Sau khi khai báo bạn có thể sử
dụng chúng như bất kì các hằng số nào khác, ví
dụ
circle
= 2 * PI * r;
cout << NEWLINE;
cout << NEWLINE;
Trong thực tế việc duy nhất
mà trình dịch làm khi nó tìm thấy một chỉ thị #define là
thay thế các tên hằng tại bất kì chỗ nào chúng
xuất hiện (như trong ví dụ trước, PI, NEWLINE
hay WIDTH) bằng giá trị mà chúng được
định nghĩa. Vì vậy các hằng số #define được
coi là các hằng số macro
Chỉ
thị #define
không phải
là một lệnh thực thi, nó là chỉ thị tiền
xử lý (preprocessor), đó là lý do trình dịch coi cả dòng
là một chỉ thị và dòng đó không cần kết thúc
bằng dấu chấm phẩy. Nếu bạn thêm dấu
chấm phẩy vào cuối dòng, nó sẽ được coi
là một phần của giá trị định nghĩa
hằng.
Khai báo các hằng (const)
Với tiền tố const
bạn có thể khai báo các hằng với một kiểu
xác định như là bạn làm với một biến
const int width = 100;
const to char tab = '\t';
const zip = 12440;
const to char tab = '\t';
const zip = 12440;
Trong trường hợp kiểu
không được chỉ rõ (như trong ví dụ cuối)
trình dịch sẽ coi nó là kiểu int.
Tags:
Lập trình C