Chương 2. Biu thc
Chương này gii thiu các toán t xây dng sn cho vic son tho các biu
thc. Mt biu thc là bt k s tính toán nào mà cho ra mt giá tr.
Khi tho lun v các biu thc, chúng ta thường s dng thut ng ước
lượng. Ví d, chúng ta nói rng mt biu thc ước lượng mt giá tr nào đó.
Thường thì giá tr sau cùng ch là lý do cho vic ước lượng biu thc. Tuy
nhiên, trong mt vài trường hp, biu thc cũng có th cho các kết qu ph.
Các kết qu này là s thay đổi lâu dài trong trng thái ca chương trình.
Trong trường hp này, các biu thc C++ thì khác vi các biu thc toán hc.
C++ cung cp các toán t cho vic son tho các biu thc toán hc,
quan h, lun lý, trên bit, và điu kin. Nó cũng cung cp các toán t cho ra
các kết qu ph hu dng như làn, tăng, và gim. Chúng ta s xem xét ln
lượt tng loi toán t. Chúng ta cũng s tho lun v các lut ưu tiên mà nh
hưởng đến th t ước lượng ca các toán t trong mt biu thc có nhiu
toán t.
2.1. Toán t toán hc
C++ cung cp 5 toán t toán hc cơ bn. Chúng được tng kết trong Bng
2.1.
Bng 2.1 Các toán t toán hc.
Toán t Tên d
+ Cng 12 + 4.9 // cho 16.9
- Tr 3.98 - 4 // cho -0.02
* Nhân 2 * 3.4 // cho 6.8
/ Chia 9 / 2.0 // cho 4.5
% Ly phn dư 13 % 3 // cho 1
Ngoi tr toán t ly phn dư (%) thì tt c các toán t toán hc có th
chp nhn pha trn các toán hng s nguyên và toán hng s thc. Thông
thường, nếu c hai toán hng là s nguyên sau đó kết qu s là mt s
Chương 2: Biu thc
17
nguyên. Tuy nhiên, mt hoc c hai toán hng là s thc thì sau đó kết qu s
là mt s thc (real hay double).
Khi c hai toán hng ca toán t chia là s nguyên thì sau đó phép chia
được thc hin như là mt phép chia s nguyên và không phi là phép chia
thông thường mà chúng ta s dng. Phép chia s nguyên luôn cho kết qu
nguyên (có nghĩa là luôn được làm tròn). Ví d:
9 / 2 // được 4, không phi là 4.5!
-9 / 2 // được -5, không phi là -4!
Các phép chia s nguyên không xác định thường là các li lp trình
chung. Để thu được mt phép chia s thc khi c hai toán hng là s nguyên,
bn cn ép mt trong hai s nguyên v s thc:
int cost = 100;
int volume = 80;
double unitPrice = cost / (double) volume; // được 1.25
Toán t ly phn dư (%) yêu cu c hai toán hng là s nguyên. Nó tr v
phn dư còn li ca phép chia. Ví d 13%3 đưc tính toán bng cách chia s
nguyên 13 đi 3 để được 4 và phn dư là 1; vì thế kết qu là 1.
th có trường hp mt kết qu ca mt phép toán toán hc quá ln để
lưu tr trong mt biến nào đó. Trường hp này được gi là tràn. Hu qu ca
tràn là ph thuc vào máy vì thế nó không được định nghĩa.Ví d:
unsigned char k = 10 * 92; // tràn: 920 > 255
Chia mt s cho 0 là hoàn toàn không đúng lut. Kết qu ca phép chia
này là mt li run-time gi là li division-by-zero thường làm cho chương
trình kết thúc.
2.2. Toán t quan h
C++ cung cp 6 toán t quan h để so sánh các s. Các toán t này được tng
kết trong Bng 2.2. Các toán t quan h ước lượng v 1 (thay cho kết qu
đúng) hoc 0 (thay cho kết qu sai).
Bng 2.2 Các toán t quan h.
Toán t Tên d
== So sánh bng 5 == 5 // cho 1
!= So sánh không bng 5 != 5 // cho 0
< So sánh h hơn 5 < 5.5 // cho 1
<= So sánh h hơn hoc bng 5 <= 5 // cho 1
> So sánh ln hơn 5 > 5.5 // cho 0
>= So sánh ln hơn hoc bng 6.3 >= 5 // cho 1
Chương 2: Biu thc
18
Chú ý rng các toán t <=>= ch được h tr trong hình thc hin th.
Nói riêng c hai =<=> đều không hp l và không mang ý nghĩa gì c.
Các toán hng ca mt toán t quan h phi ước lượng v mt s. Các ký
t là các toán hng hp l vì chúng được đại din bi các giá tr s. Ví d (gi
s mã ASCII):
'A' < 'F' // đưc 1 (ging như là 65 < 70)
Các toán t quan h không nên được dùng để so sánh chui bi vì điu
này s dn đến các địa ch ca chui được so sánh ch không phi là ni dung
chui. Ví d, biu thc
"HELLO" < "BYE"
làm cho địa ch ca chui "HELLO" được so sánh vi địa ch ca chui "BYE".
Vì các địa ch này được xác định bi trình biên dch, kết qu có th là 0 hoc
có th là 1, cho nên chúng ta có th nói kết qu là không được định nghĩa.
C++ cung cp các thư vin hàm (ví d, strcmp) để thc hin so sánh
chui.
2.3. Toán t lun lý
C++ cung cp ba toán t lun lý cho vic kết ni các biu thc lun lý. Các
toán t này được tng kết trong Bng 2.3. Ging như các toán t quan h, các
toán t lun lý ước lượng ti 0 hoc 1.
Bng 2.3 Các toán t lun lý.
Toán t Tên d
! Ph định lun lý !(5 == 5) // được 0
&& Và lun lý 5 < 6 && 6 < 6 // được 0
|| Hoc lun lý 5 < 6 || 6 < 5 // được 1
Ph định lun lý là mt toán t đơn hng ch ph định giá tr lun lý toán
hng đơn ca nó. Nếu toán hng ca nó không là 0 thì được 0, và nếu nó là
không thì được 1.
lun lý cho kết qu 0 nếu mt hay c hai toán hng ca nó ước lượng
ti 0. Ngược li, nó cho kết qu 1. Hoc lun lý cho kết qu 0 nếu c hai toán
hng ca nó ước lượng ti 0. Ngược li, nó cho kết qu 1.
Chú ý rng đây chúng ta nói các toán hng là 0 và khác 0. Nói chung,
bt k giá tr không là 0 nào có th được dùng để đại din cho đúng (true),
trong khi ch có giá tr 0 là đại din cho sai (false). Tuy nhiên, tt c các hàng
sau đây là các biu thc lun lý hp l:
Chương 2: Biu thc
19
!20 // được 0
10 && 5 // được 1
10 || 5.5 // được 1
10 && 0 // được 0
C++ không có kiu boolean xây dng sn. Vì l đó mà ta có th s dng
kiu int cho mc đích này. Ví d:
int sorted = 0; // false
int balanced = 1; // true
2.4. Toán t trên bit
C++ cung cp 6 toán t trên bit để điu khin các bit riêng l trong mt s
lượng s nguyên. Chúng được tng kết trong Bng 2.4.
Bng 2.4 Các toán t trên bit.
Toán t Tên d
~ Ph định bit ~'\011' // được '\366'
& Và bit '\011' & '\027' // được '\001'
| Hoc bit '\011' | '\027' // được '\037'
^ Hoc exclusive bit '\011' ^ '\027' // được '\036'
<< Dch trái bit '\011' << 2 // được '\044'
>> Dch phi bit '\011' >> 2 // được '\002'
Các toán t trên bit mong đợi các toán hng ca chúng là các s nguyên
và xem chúng như là mt chui các bit. Ph định bit là mt toán t đơn hng
thc hin đảo các bit trong toán hng ca nó. Và bit so sánh các bit tương ng
ca các toán hng ca nó và cho kết qu là 1 khi c hai bit là 1, ngược li là 0.
Hoc bit so sánh các bit tương ng ca các toán hng ca nó và cho kết qu
0 khi c hai bit là 0, ngược li là 1. XOR bit so sánh các bit tương ng ca
các toán hng ca nó và cho kết qu 0 khi c hai bit là 1 hoc c hai bit là 0,
ngược li là 1.
C hai toán t dch trái bit dch phi bit ly mt chui bit làm toán
hng trái ca chúng và mt s nguyên dương n làm toán hng phi. Toán t
dch trái cho kết qu là mt chui bit sau khi thc hin dch n bit trong chui
bit ca toán hng trái v phía trái. Toán t dch phi cho kết qu là mt chui
bit sau khi thc hin dch n bit trong chui bit ca toán hng trái v phía phi.
Các bit trng sau khi dch được đặt ti 0.
Bng 2.5 minh ha chui các bit cho các toán hng ví d và kết qu trong
Bng 2.4. Để tránh lo lng v bit du (điu này ph thuc vào máy) thường
thì khai báo chui bit như là mt s không du:
unsigned char x = '\011';
unsigned char y = '\027';
Chương 2: Biu thc
20
Bng 2.5 Các bit được tính toán như thế nào.
Ví d Giá tr cơ s 8 Chui bit
x 011 0 0 0 0 1 0 0 1
y 027 0 0 0 1 0 1 1 1
~x 366 1 1 1 1 0 1 1 0
x & y 001 0 0 0 0 0 0 0 1
x | y 037 0 0 0 1 1 1 1 1
x ^ y 036 0 0 0 1 1 1 1 0
x << 2 044 0 0 1 0 0 1 0 0
x >> 2 002 0 0 0 0 0 0 1 0
2.5. Toán t tăng/gim
Các toán t tăng mt (++) gim mt (--) cung cp các tin li tương ng
cho vic cng thêm 1 vào mt biến s hay tr đi 1 t mt biến s. Các toán t
này được tng kết trong Bng 2.6. Các ví d gi s đã định nghĩa biến sau:
int k = 5;
Bng 2.6 Các toán t tăng và gim.
Toán t Tên d
++ Tăng mt (tin t) ++k + 10 // được 16
++ Tăng mt (hu t) k++ + 10 // được 15
-- Gim mt (tin t) --k + 10 // được 14
-- Gim mt (hu t) k-- + 10 // được 15
C hai toán t có th được s dng theo hình thc tin t hay hu t
hoàn toàn khác nhau. Khi được s dng theo hình thc tin t thì toán t
được áp dng trước và kết qu sau đó được s dng trong biu thc. Khi
được s dng theo hình thc hu t thì biu thc được ước lượng trước và sau
đó toán t được áp dng.
C hai toán t có th được áp dng cho biến nguyên cũng như là biến
thc mc dù trong thc tế thì các biến thc hiếm khi được dùng theo hình
thc này.
2.6. Toán t khi to
Toán t khi to được s dng để lưu tr mt biến. Toán hng trái nên là mt
giá tr trái và toán hng phi có th là mt biu thc bt k. Biu thc được
ước lượng và kết qu được lưu tr trong v trí được ch định bi giá tr trái.
Giá tr trái là bt k th gì ch định rõ v trí b nh lưu tr mt giá tr.
Ch mt loi ca giá tr trái mà chúng ta được biết cho đến thi đim này là
Chương 2: Biu thc
21