Chương 3. Lnh
Chương này gii thiu các hình thc khác nhau ca các câu lnh C++ để son
tho chương trình. Các lnh trình bày vic xây dng các khi mc độ thp
nht ca mt chương trình. Nói chung mi lnh trình bày mt bước tính toán
có mt tác động chính yếu. Bên cnh đó cũng có th có các tác động ph
khác. Các lnh là hu dng vì tác dng chính yếu mà nó gây ra, s kết ni ca
các lnh cho phép chương trình phc v mt mc đích c th (ví d, sp xếp
mt danh sách các tên).
Mt chương trình đang chy dành toàn b thi gian để thc thi các câu
lnh. Th t mà các câu lnh được thc hin được gi là dòng điu khin
(flow control). Thut ng này phn ánh vic các câu lnh đang thc thi hin
thi có s điu khin ca CPU, khi CPU hoàn thành s được chuyn giao ti
mt lnh khác. Đặc trưng dòng điu khin trong mt chương trình là tun t,
lnh này đến lnh kế, nhưng có th chuyn hướng ti đường dn khác bi các
lnh r nhánh. Dòng điu khin là mt s xem xét trng yếu bi vì nó quyết
định lnh nào được thc thi và lnh nào không được thc thi trong quá trình
chy, vì thế làm nh hưởng đến kết qu toàn b ca chương trình.
Ging nhiu ngôn ng th tc khác, C++ cung cp nhng hình thc khác
nhau cho các mc đích khác nhau. Các lnh khai báo được s dng cho định
nghĩa các biến. Các lnh như gán được s dng cho các tính toán đại s đơn
gin. Các lnh r nhánh được s dng để ch định đường dn ca vic thc thi
ph thuc vào kết qu ca mt điu kin lun lý. Các lnh lp được s dng
để ch định các tính toán cn được lp cho ti khi mt điu kin lun lý nào
đó được tha. Các lnh điu khin đưc s dng để làm chuyn đường dn
thc thi ti mt đường dn khác ca chương trình. Chúng ta s ln lượt tho
lun tt c nhng vn đề này.
Chương 3: Lnh
30
3.1. Lnh đơn và lnh phc
Lnh đơn là mt s tính toán được kết thúc bng du chm phy. Các định
nghĩa biến và các biu thc được kết thúc bng du chm phy như trong ví
d sau:
int i; // lnh khai báo
++i; // lnh này có mt tác động chính yếu
double d = 10.5; // lnh khai báo
d + 5; // lnh không hu dng
Ví d cui trình bày mt lnh không hu dng bi vì nó không có tác động
chính yếu (d được cng vi 5 và kết qu b vt b).
Lnh đơn gin nht là lnh rng ch gm du chm phy mà thôi.
; // lnh rng
Mc du lnh rng không có tác động chính yếu nhưng nó có mt vài
vic dùng xác tht.
Nhiu lnh đơn có th kết ni li thành mt lnh phc bng cách rào
chúng bên trong các du ngoc xon. Ví d:
{ int min, i = 10, j = 20;
min = (i < j ? i : j);
cout << min << '\n';
}
Bi vì mt lnh phc có th cha các định nghĩa biến và định nghĩa mt
phm vi cho chúng, nó cũng được gi mt khi. Phm vi ca mt biến C++
được gii hn bên trong khi trc tiếp cha nó. Các khi và các lut phm vi
s được mô t chi tiết hơn khi chúng ta tho lun v hàm trong chương kế.
3.2. Lnh if
Đôi khi chúng ta mun làm cho s thc thi mt lnh ph thuc vào mt điu
kin nào đó cn được tha. Lnh if cung cp cách để thc hin công vic này,
hình thc chung ca lnh này là:
if (biu thc)
lnh;
Trước tiên biu thc được ước lượng. Nếu kết qu khác 0 (đúng) thì sau đó
lnh được thc thi. Ngược li, không làm gì c.
d, khi chia hai giá tr chúng ta mun kim tra rng mu s có khác 0
hay không.
if (count != 0)
Chương 3: Lnh
31
average = sum / count;
Để làm cho nhiu lnh ph thuc trên cùng điu kin chúng ta có th s
dng lnh phc:
if (balance > 0) {
interest = balance * creditRate;
balance += interest;
}
Mt hình thc khác ca lnh if cho phép chúng ta chn mt trong hai
lnh: mt lnh được thc thi nếu như điu kin được tha và lnh còn li
được thc hin nếu như điu kin không tha. Hình thc này được gi là lnh
if-else và có hình thc chung là:
if (biu thc)
lnh 1;
else
lnh 2;
Trước tiên biu thc được ước lượng. Nếu kết qu khác 0 thì lnh 1 được
thc thi. Ngược li, lnh 2 được thc thi.
d:
if (balance > 0) {
interest = balance * creditRate;
balance += interest;
} else {
interest = balance * debitRate;
balance += interest;
}
Trong c hai phn có s ging nhau lnh balance += interest vì thế toàn b câu
lnh có th viết li như sau:
if (balance > 0)
interest = balance * creditRate;
else
interest = balance * debitRate;
balance += interest;
Hoc đơn gin hơn bng vic s dng biu thc điu kin:
interest = balance * (balance > 0 ? creditRate : debitRate);
balance += interest;
Hoc ch là:
balance += balance * (balance > 0 ? creditRate : debitRate);
Các lnh if có th được lng nhau bng cách để cho mt lnh if xut hin
bên trong mt lnh if khác. Ví d:
Chương 3: Lnh
32
if (callHour > 6) {
if (callDuration <= 5)
charge = callDuration * tarrif1;
else
charge = 5 * tarrif1 + (callDuration - 5) * tarrif2;
} else
charge = flatFee;
Mt hình thc được s dng thường xuyên ca nhng lnh if lng nhau
liên quan đến phn else gm có mt lnh if-else khác. Ví d:
if (ch >= '0' && ch <= '9')
kind = digit;
else {
if (ch >= 'A' && ch <= 'Z')
kind = upperLetter;
else {
if (ch >= 'a' && ch <= 'z')
kind = lowerLetter;
else
kind = special;
}
}
Để cho d đọc có th s dng hình thc sau:
if (ch >= '0' && ch <= '9')
kind = digit;
else if (ch >= 'A' && ch <= 'Z')
kind = capitalLetter;
else if (ch >= 'a' && ch <= 'z')
kind = smallLetter;
else
kind = special;
3.3. Lnh switch
Lnh switch cung cp phương thc la chn gia mt tp các kh năng da
trên giá tr ca biu thc. Hình thc chung ca câu lnh switch là:
switch (biu thc) {
case hng :
1
các lnh;
...
case hng :
n
các lnh;
default:
các lnh;
}
Biu thc (gi là th switch) được ước lượng trước tiên và kết qu được so
sánh vi mi hng s (gi là các nhãn) theo th t chúng xut hin cho đến
khi mt so khp được tìm thy. Lnh ngay sau khi so khp được thc hin
Chương 3: Lnh
33
sau đó. Chú ý s nhiu: mi case có th được theo sau bi không hay nhiu
lnh (không ch là mt lnh). Vic thc thi tiếp tc cho ti khi hoc là bt gp
mt lnh break hoc tt c các lnh xen vào đến cui lnh switch được thc
hin.Trường hp default cui cùng là mt tùy chn và được thc hin nếu
như tt c các case trước đó không được so khp.
d, chúng ta phi phân tích cú pháp mt phép toán toán hc nh hng
thành ba thành phn ca nó và phi lưu tr chúng vào các biến operator,
operand1, và operand2. Lnh switch sau thc hin phép toán và lưu tr kết qu
vào result.
switch (operator) {
case '+': result = operand1 + operand2;
break;
case '-': result = operand1 - operand2;
break;
case '*': result = operand1 * operand2;
break;
case '/': result = operand1 / operand2;
break;
default: cout << "unknown operator: " << operator << '\n';
break;
}
Như đã được minh ha trong ví d, chúng ta cn thiết chèn mt lnh
break cui mi case. Lnh break ngt câu lnh switch bng cách nhy đến
đim kết thúc ca lnh này. Ví d, nếu chúng ta m rng lnh trên để cho
phép x cũng có th được s dng như là toán t nhân, chúng ta s có:
switch (operator) {
case '+': result = operand1 + operand2;
break;
case '-': result = operand1 - operand2;
break;
case 'x':
case '*': result = operand1 * operand2;
break;
case '/': result = operand1 / operand2;
break;
default: cout << "unknown operator: " << operator << '\n';
break;
}
Bi vì case 'x' không có lnh break nên khi case này được tha thì s thc thi
tiếp tc thc hin các lnh trong case kế tiếp và phép nhân được thi hành.
Chúng ta có th quan sát rng bt k lnh switch nào cũng có th được
viết như nhiu câu lnh if-else. Ví d, lnh trên có th được viết như sau:
Chương 3: Lnh
34