Lập trình C++ - Chương 2: Biểu thức

Chương này giới thiệu các toántửxây dựng sẵn cho việc soạn thảo các biểu

thức. Một biểu thức là bất kỳsựtính toán nào mà cho ra một giá trị.

Khi thảo luận vềcác biểu thức, chúng ta thường sửdụng thuật ngữ ước

lượng. Ví dụ, chúng ta nói rằng một biểu thức ước lượng một giá trịnào đó.

Thường thì giá trịsau cùng chỉlà lý do cho việc ước lượng biểu thức. Tuy

nhiên, trong một vài trường hợp, biểu thức cũng cóthểchocác kết quảphụ.

Các kết quảnày là sựthay đổi lâu dài trong trạng thái của chương trình.

Trong trường hợp này, các biểu thức C++ thì khác với các biểu thức toán học.

C++ cung cấp các toántửcho việc soạn thảo các biểu thức toán học,

quan hệ, luận lý, trên bit, và điều kiện. Nó cũng cung cấp các toántửcho ra

các kết quảphụhữu dụng nhưlàgán,tăng, và giảm.Chúng ta sẽxemxét lần

lượt từng loại toán tử. Chúng ta cũng sẽthảo luận vềcác luật ưu tiênmà ảnh

hưởng đến thứtự ước lượng của các toán tửtrong một biểu thức có nhiều

toán tử.

pdf11 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1998 | Lượt tải: 1download
Tóm tắt nội dung Lập trình C++ - Chương 2: Biểu thức, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
đó được sử dụng trong biểu thức. Khi 
được sử dụng theo hình thức hậu tố thì biểu thức được ước lượng trước và sau 
đó toán tử được áp dụng. 
 Cả hai toán tử có thể được áp dụng cho biến nguyên cũng như là biến 
thực mặc dù trong thực tế thì các biến thực hiếm khi được dùng theo hình 
thức này. 
2.6. Toán tử khởi tạo 
Toán tử khởi tạo được sử dụng để lưu trữ một biến. Toán hạng trái nên là một 
giá trị trái và toán hạng phải có thể là một biểu thức bất kỳ. Biểu thức được 
ước lượng và kết quả được lưu trữ trong vị trí được chỉ định bởi giá trị trái. 
 Giá trị trái là bất kỳ thứ gì chỉ định rõ vị trí bộ nhớ lưu trữ một giá trị. 
Chỉ một loại của giá trị trái mà chúng ta được biết cho đến thời điểm này là 
Chương 2: Biểu thức 21 
biến. Các loại khác của giá trị trái (dựa trên con trỏ và tham chiếu) sẽ được 
thảo luận sau. 
 Toán tử khởi tạo có một số biến thể thu được bằng cách kết nối nó với 
các toán tử toán học và các toán tử trên bit. Chúng được tổng kết trong Bảng 
2.7. Các ví dụ giả sử rằng n là một biến số nguyên. 
Bảng 2.7 Các toán tử khởi tạo. 
Toán tử Ví dụ Tương đương với 
= n = 25 
+= n += 25 n = n + 25
-= n -= 25 n = n – 25
*= n *= 25 n = n * 25
/= n /= 25 n = n / 25
%= n %= 25 n = n % 25
&= n &= 0xF2F2 n = n & 0xF2F2
|= n |= 0xF2F2 n = n | 0xF2F2
^= n ^ = 0xF2F2 n = n ^ 0xF2F2
<<= n <<= 4 n = n << 4
>>= n >>= 4 n = n >> 4
 Phép toán khởi tạo chính nó là một biểu thức mà giá trị của nó là giá trị 
được lưu trong toán hạng trái của nó. Vì thế một phép toán khởi tạo có thể 
được sử dụng như là toán hạng phải của một phép toán khởi tạo khác. Bất kỳ 
số lượng khởi tạo nào có thể được kết nối theo cách này để hình thành một 
biểu thức. Ví dụ: 
int m, n, p; 
m = n = p = 100; // nghĩa là: n = (m = (p = 100)); 
m = (n = p = 100) + 2; // nghĩa là: m = (n = (p = 100)) + 2; 
Việc này có thể ứng dụng tương tự cho các hình thức khởi tạo khác. Ví dụ: 
m = 100; 
m += n = p = 10; // nghĩa là: m = m + (n = p = 10); 
2.7. Toán tử điều kiện 
Toán tử điều kiện yêu cầu 3 toán hạng. Hình thức chung của nó là: 
 toán hạng 1 ? toán hạng 2 : toán hạng 3 
Toán hạng đầu tiên được ước lượng và được xem như là một điều kiện. Nếu 
kết quả không là 0 thì toán hạng 2 được ước lượng và giá trị của nó là kết quả 
sau cùng. Ngược lại, toán hạng 3 được ước lượng và giá trị của nó là kết quả 
sau cùng. Ví dụ: 
Chương 2: Biểu thức 22 
int m = 1, n = 2; 
int min = (m < n ? m : n); // min nhận giá trị 1 
 Chú ý rằng trong các toán hạng thứ 2 và toán hạng thứ 3 của toán tử điều 
kiện thì chỉ có một toán hạng được thực hiện. Điều này là quan trọng khi một 
hoặc cả hai chứa hiệu ứng phụ (nghĩa là, việc ước lượng của chúng làm 
chuyển đổi giá trị của biến). Ví dụ, với m=1 và n=2 thì trong 
int min = (m < n ? m++ : n++); 
m được tăng lên bởi vì m++ được ước lượng nhưng n không tăng vì n++ 
không được ước lượng. 
 Bởi vì chính phép toán điều kiện cũng là một biểu thức nên nó có thể 
được sử dụng như một toán hạng của phép toán điều kiện khác, có nghĩa là 
các biểu thức điều kiện có thể được lồng nhau. Ví dụ: 
int m = 1, n = 2, p =3; 
int min = (m < n ? (m < p ? m : p) 
 : (n < p ? n : p)); 
2.8. Toán tử phẩy 
Nhiều biểu thức có thể được kết nối vào cùng một biểu thức sử dụng toán tử 
phẩy. Toán tử phẩy yêu cầu 2 toán hạng. Đầu tiên nó ước lượng toán hạng trái 
sau đó là toán hạng phải, và trả về giá trị của toán hạng phải như là kết quả 
sau cùng. Ví dụ: 
int m=1, n=2, min; 
int mCount = 0, nCount = 0; 
//... 
min = (m < n ? mCount++, m : nCount++, n); 
Ở đây khi m nhỏ hơn n, mCount++ được ước lượng và giá trị của m được lưu 
trong min. Ngược lại, nCount++ được ước lượng và giá trị của n được lưu 
trong min. 
2.9. Toán tử lấy kích thước 
C++ cung cấp toán tử hữu dụng, sizeof, để tính toán kích thước của bất kỳ 
hạng mục dữ liệu hay kiểu dữ liệu nào. Nó yêu cầu một toán hạng duy nhất có 
thể là tên kiểu (ví dụ, int) hay một biểu thức (ví dụ, 100) và trả về kích thước 
của những thực thể đã chỉ định theo byte. Kết quả hoàn toàn phụ thuộc vào 
máy. Danh sách 2.1 minh họa việc sử dụng toán tử sizeof cho các kiểu có sẵn 
mà chúng ta đã gặp cho đến thời điểm này. 
Chương 2: Biểu thức 23 
Danh sách 2.1 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
#include 
int main (void) 
{ 
 cout << "char size = " << sizeof(char) << " bytes\n"; 
 cout << "char* size = " << sizeof(char*) << " bytes\n"; 
 cout << "short size = " << sizeof(short) << " bytes\n"; 
 cout << "int size = " << sizeof(int) << " bytes\n"; 
 cout << "long size = " << sizeof(long) << " bytes\n"; 
 cout << "float size = " << sizeof(float) << " bytes\n"; 
 cout << "double size = " << sizeof(double) << " bytes\n"; 
 cout << "1.55 size = " << sizeof(1.55) << " bytes\n"; 
 cout << "1.55L size = " << sizeof(1.55L) << " bytes\n"; 
 cout << "HELLO size = " << sizeof("HELLO") << " bytes\n"; 
} 
 Khi chạy, chương trình sẽ cho kết quả sau (trên máy tính cá nhân): 
char size = 1 bytes 
char* size = 2 bytes 
short size = 2 bytes 
int size = 2 bytes 
long size = 4 bytes 
float size = 4 bytes 
double size = 8 bytes 
1.55 size = 8 bytes 
1.55L size = 10 bytes 
HELLO size = 6 bytes 
2.10.Độ ưu tiên của các toán tử 
Thứ tự mà các toán tử được ước lượng trong một biểu thức là rất quan trọng 
và được xác định theo các luật ưu tiên. Các luật này chia các toán tử C++ ra 
thành một số mức độ ưu tiên (xem Bảng 2.8). Các toán tử ở mức cao hơn sẽ 
có độ ưu tiên cao hơn các toán tử có độ ưu tiên thấp hơn. 
Bảng 2.8 Độ ưu tiên của các toán tử. 
Mức Toán tử Loại Thứ tự 
Cao nhất :: Đơn hạng Cả hai 
 () [] -> . Nhị hạng Trái tới phải 
 + 
- 
++ 
-- 
! 
~ 
* 
& 
new 
delete 
sizeof 
() Đơn hạng Phải tới trái 
 ->* .* Nhị hạng Trái tới phải 
 * / % Nhị hạng Trái tới phải 
 + - Nhị hạng Trái tới phải 
 > Nhị hạng Trái tới phải 
 >= Nhị hạng Trái tới phải 
 == != Nhị hạng Trái tới phải 
 & Nhị hạng Trái tới phải 
Chương 2: Biểu thức 24 
 ^ Nhị hạng Trái tới phải 
 | Nhị hạng Trái tới phải 
 && Nhị hạng Trái tới phải 
 || Nhị hạng Trái tới phải 
 ? : Tam hạng Trái tới phải 
 = 
+= 
-= 
*= 
/= 
^= 
%= 
&= 
|= 
<<= 
>>= Nhị hạng Phải tới trái 
Thấp nhất , Nhị hạng Trái tới phải 
Ví dụ, trong biểu thức 
a == b + c * d 
c * d được ước lượng trước bởi vì toán tử * có độ ưu tiên cao hơn toán tử + và 
==. Sau đó kết quả được cộng tới b bởi vì toán tử + có độ ưu tiên cao hơn toán 
tử ==, và sau đó == được ước lượng. Các luật ưu tiên có thể được cho quyền 
cao hơn thông qua việc sử dụng các dấu ngoặc. Ví dụ, viết lại biểu thức trên 
như sau 
a == (b + c) * d 
sẽ làm cho toán tử + được ước lượng trước toán tử *. 
 Các toán tử với cùng mức độ ưu tiên được ước lượng theo thứ tự được 
ước lượng trong cột cuối cùng trong Bảng 2.8. Ví dụ, trong biểu thức 
a = b += c 
thứ tự ước lượng là từ phải sang trái, vì thế b += c được ước lượng trước và kế 
đó là a = b. 
2.11.Chuyển kiểu đơn giản 
Một giá trị thuộc về những kiểu xây dựng sẵn mà chúng ta biết đến thời điểm 
này đều có thể được chuyển về bất kỳ một kiểu nào khác. Ví dụ: 
(int) 3.14 // chuyển 3.14 sang int để được 3 
(long) 3.14 // chuyển 3.14 sang long để được 3L 
(double) 2 // chuyển 2 sang double để được 2.0 
(char) 122 // chuyển 122 sang char có mã là 122 
(unsigned short) 3.14 // được 3 như là một unsigned short 
 Như đã được trình bày trong các ví dụ, các định danh kiểu xây dựng sẵn 
có thể được sử dụng như các toán tử kiểu. Các toán tử kiểu là đơn hạng 
(nghĩa là chỉ có một toán hạng) và xuất hiện bên trong các dấu ngoặc về bên 
trái toán hạng của chúng. Điều này được gọi là chuyển kiểu tường minh. 
Khi tên kiểu chỉ là một từ thì có thể đặt dấu ngoặc xung quanh toán hạng: 
int(3.14) // như là: (int) 3.14 
Chương 2: Biểu thức 25 
 Trong một vài trường hợp, C++ cũng thực hiện chuyển kiểu không 
tường minh. Điều này xảy ra khi các giá trị của các kiểu khác nhau được trộn 
lẫn trong một biểu thức. Ví dụ: 
double d = 1; // d nhận 1.0 
int i = 10.5; // i nhận 10 
i = i + d; // nghĩa là: i = int(double(i) + d) 
Trong ví dụ cuối , i + d bao hàm các kiểu không hợp nhau, vì thế trước tiên i 
được chuyển thành double (thăng cấp) và sau đó được cộng vào d. Kết quả là 
double không hợp kiểu với i trên phía trái của phép gán, vì thế nó được chuyển 
thành int (hạ cấp) trước khi được gán cho i. 
 Luật trên đại diện cho một vài trường hợp chung đơn giản để chuyển 
kiểu. Các trường hợp phức tạp hơn sẽ được trình bày ở phần sau của giáo 
trình sau khi chúng ta thảo luận các kiểu dữ liệu khác. 
Bài tập cuối chương 2 
2.1 Viết các biểu thức sau đây: 
• Kiểm tra một số n là chẵn hay không. 
• Kiểm tra một ký tự c là một số hay không. 
• Kiểm tra một ký tự c là một mẫu tự hay không. 
• Thực hiện kiểm tra: n là lẽ và dương hoặc n chẵn và âm. 
• Đặt lại k bit của một số nguyên n tới 0. 
• Đặt k bit của một số nguyên n tới 1. 
• Cho giá trị tuyệt đối của một số n. 
• Cho số ký tự trong một chuỗi s được kết thúc bởi ký tự null. 
2.2 Thêm các dấu ngoặc phụ vào các biểu thức sau để hiển thị rõ ràng thứ tự các 
toán tử được ước lượng: 
(n = p - q || n == 0) 
(++n * q-- / ++p - q) 
(n | p & q ^ p << 2 + q) 
(p < q ? n < p ? q * n - 2 : q / n + 1 : q - n) 
2.3 Cho biết giá trị của mỗi biến sau đây sau khi khởi tạo nó: 
double d = 2 * int(3.14); 
long k = 3.14 - 3; 
char c = 'a' + 2; 
char c = 'p' + 'A' - 'a'; 
2.4 Viết một chương trình cho phép nhập vào một số nguyên dương n và xuất ra 
giá trị của n mũ 2 và 2 mũ n. 
Chương 2: Biểu thức 26 
2.5 Viết một chương trình cho phép nhập ba số và xuất ra thông điệp Sorted nếu 
các số là tăng dần và xuất ra Not sorted trong trường hợp ngược lại. 
Chương 2: Biểu thức 27 

File đính kèm:

  • pdfC++Chuong_02.pdf
Tài liệu liên quan