Các biểu thức trong C++
Chương Biểu thức Chương giới thiệu toán tử xây dựng sẵn cho việc soạn thảo biểu thức Một biểu thức tính tốn mà cho giá trị Khi thảo luận biểu thức, thường sử dụng thuật ngữ ước lượng Ví dụ, nói biểu thức ước lượng giá trị Thường giá trị sau lý cho việc ước lượng biểu thức Tuy nhiên, vài trường hợp, biểu thức cho kết phụ Các kết thay đổi lâu dài trạng thái chương trình Trong trường hợp này, biểu thức C++ khác với biểu thức toán học C++ cung cấp toán tử cho việc soạn thảo biểu thức toán học, quan hệ, luận lý, bit, điều kiện Nó cung cấp toán tử cho kết phụ hữu dụng gán, tăng, giảm Chúng ta xem xét loại toán tử Chúng ta thảo luận luật ưu tiên mà ảnh hưởng đến thứ tự ước lượng tốn tử biểu thức có nhiều tốn tử 2.1 Toán tử toán học C++ cung cấp toán tử toán học Chúng tổng kết Bảng 2.1 Bảng 2.1 Các toán tử toán học Toán tử + * / % Tên Cộng Trừ Nhân Chia Lấy phần dư Ví dụ 12 + 4.9 3.98 - * 3.4 / 2.0 13 % // cho 16.9 // cho -0.02 // cho 6.8 // cho 4.5 // cho Ngoại trừ toán tử lấy phần dư (%) tất tốn tử tốn học chấp nhận pha trộn tốn hạng số ngun tốn hạng số thực Thơng thường, hai tốn hạng số ngun sau kết số Chương 2: Biểu thức 17 nguyên Tuy nhiên, hai toán hạng số thực sau kết số thực (real hay double) Khi hai toán hạng tốn tử chia số ngun sau phép chia thực phép chia số nguyên phép chia thông thường mà sử dụng Phép chia số nguyên ln cho kết ngun (có nghĩa ln làm trịn) Ví dụ: 9/2 -9 / // 4, 4.5! // -5, -4! Các phép chia số nguyên không xác định thường lỗi lập trình chung Để thu phép chia số thực hai toán hạng số nguyên, bạn cần ép hai số nguyên số thực: int int double cost = 100; volume = 80; unitPrice = cost / (double) volume; // 1.25 Toán tử lấy phần dư (%) yêu cầu hai tốn hạng số ngun Nó trả phần dư cịn lại phép chia Ví dụ 13%3 tính tốn cách chia số ngun 13 để phần dư 1; kết Có thể có trường hợp kết phép toán toán học lớn để lưu trữ biến Trường hợp gọi tràn Hậu tràn phụ thuộc vào máy khơng định nghĩa.Ví dụ: unsigned char k = 10 * 92; // tràn: 920 > 255 Chia số cho hồn tồn khơng luật Kết phép chia lỗi run-time gọi lỗi division-by-zero thường làm cho chương trình kết thúc 2.2 Tốn tử quan hệ C++ cung cấp toán tử quan hệ để so sánh số Các toán tử tổng kết Bảng 2.2 Các toán tử quan hệ ước lượng (thay cho kết đúng) (thay cho kết sai) Bảng 2.2 Các toán tử quan hệ Toán tử == != < >= Chương 2: Biểu thức Tên So sánh So sánh không So sánh hỏ So sánh hỏ So sánh lớn So sánh lớn Ví dụ == // cho != // cho < 5.5 // cho 5.5 // cho 6.3 >= // cho 18 Chú ý toán tử = hỗ trợ hình thức hiển thị Nói riêng hai =< => khơng hợp lệ khơng mang ý nghĩa Các tốn hạng toán tử quan hệ phải ước lượng số Các ký tự toán hạng hợp lệ chúng đại diện giá trị số Ví dụ (giả sử mã ASCII): 'A' < 'F' // (giống 65 < 70) Các tốn tử quan hệ khơng nên dùng để so sánh chuỗi điều dẫn đến địa chuỗi so sánh nội dung chuỗi Ví dụ, biểu thức "HELLO" < "BYE" làm cho địa chuỗi "HELLO" so sánh với địa chuỗi "BYE" Vì địa xác định trình biên dịch, kết là 1, nói kết không định nghĩa C++ cung cấp thư viện hàm (ví dụ, strcmp) để thực so sánh chuỗi 2.3 Toán tử luận lý C++ cung cấp ba toán tử luận lý cho việc kết nối biểu thức luận lý Các toán tử tổng kết Bảng 2.3 Giống toán tử quan hệ, toán tử luận lý ước lượng tới Bảng 2.3 Các toán tử luận lý Toán tử ! && || Tên Phủ định luận lý Và luận lý Hoặc luận lý Ví dụ !(5 == 5) < && < < || < // // // Phủ định luận lý toán tử đơn hạng phủ định giá trị luận lý toán hạng đơn Nếu tốn hạng khơng 0, khơng Và luận lý cho kết hay hai tốn hạng ước lượng tới Ngược lại, cho kết Hoặc luận lý cho kết hai tốn hạng ước lượng tới Ngược lại, cho kết Chú ý nói tốn hạng khác Nói chung, giá trị khơng dùng để đại diện cho (true), có giá trị đại diện cho sai (false) Tuy nhiên, tất hàng sau biểu thức luận lý hợp lệ: Chương 2: Biểu thức 19 !20 10 && 10 || 5.5 10 && // // // // C++ khơng có kiểu boolean xây dựng sẵn Vì lẽ mà ta sử dụng kiểu int cho mục đích Ví dụ: int int sorted = 0; balanced = 1; // false // true 2.4 Toán tử bit C++ cung cấp toán tử bit để điều khiển bit riêng lẻ số lượng số nguyên Chúng tổng kết Bảng 2.4 Bảng 2.4 Các toán tử bit Toán tử ~ & | ^ > Tên Phủ định bit Và bit Hoặc bit Hoặc exclusive bit Dịch trái bit Dịch phải bit Ví dụ ~'\011' '\011' & '\027' '\011' | '\027' '\011' ^ '\027' '\011' > // '\366' // '\001' // '\037' // '\036' // '\044' // '\002' Các toán tử bit mong đợi toán hạng chúng số nguyên xem chúng chuỗi bit Phủ định bit toán tử đơn hạng thực đảo bit tốn hạng Và bit so sánh bit tương ứng toán hạng cho kết hai bit 1, ngược lại Hoặc bit so sánh bit tương ứng toán hạng cho kết hai bit 0, ngược lại XOR bit so sánh bit tương ứng toán hạng cho kết hai bit hai bit 0, ngược lại Cả hai toán tử dịch trái bit dịch phải bit lấy chuỗi bit làm toán hạng trái chúng số nguyên dương n làm toán hạng phải Toán tử dịch trái cho kết chuỗi bit sau thực dịch n bit chuỗi bit toán hạng trái phía trái Tốn tử dịch phải cho kết chuỗi bit sau thực dịch n bit chuỗi bit tốn hạng trái phía phải Các bit trống sau dịch đặt tới Bảng 2.5 minh họa chuỗi bit cho tốn hạng ví dụ kết Bảng 2.4 Để tránh lo lắng bit dấu (điều phụ thuộc vào máy) thường khai báo chuỗi bit số không dấu: unsigned char x = '\011'; unsigned char y = '\027'; Chương 2: Biểu thức 20 Bảng 2.5 Các bit tính tốn Ví dụ Giá trị số x y ~x x&y x|y x^y x > 011 027 366 001 037 036 044 002 Chuỗi bit 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 2.5 Toán tử tăng/giảm Các toán tử tăng (++) giảm ( ) cung cấp tiện lợi tương ứng cho việc cộng thêm vào biến số hay trừ từ biến số Các toán tử tổng kết Bảng 2.6 Các ví dụ giả sử định nghĩa biến sau: int Bảng 2.6 k = 5; Các toán tử tăng giảm Toán tử ++ ++ - Tên Tăng (tiền tố) Tăng (hậu tố) Giảm (tiền tố) Giảm (hậu tố) Ví dụ ++k + 10 k++ + 10 k + 10 k + 10 // 16 // 15 // 14 // 15 Cả hai tốn tử sử dụng theo hình thức tiền tố hay hậu tố hoàn toàn khác Khi sử dụng theo hình thức tiền tố tốn tử áp dụng trước kết sau sử dụng biểu thức Khi sử dụng theo hình thức hậu tố biểu thức ước lượng trước sau tốn tử áp dụng Cả hai tốn tử áp dụng cho biến ngun biến thực thực tế biến thực dùng theo hình thức 2.6 Toán tử khởi tạo Toán tử khởi tạo sử dụng để lưu trữ biến Toán hạng trái nên giá trị trái toán hạng phải biểu thức Biểu thức ước lượng kết lưu trữ vị trí định giá trị trái Giá trị trái thứ định rõ vị trí nhớ lưu trữ giá trị Chỉ loại giá trị trái mà biết thời điểm Chương 2: Biểu thức 21 biến Các loại khác giá trị trái (dựa trỏ tham chiếu) thảo luận sau Tốn tử khởi tạo có số biến thể thu cách kết nối với toán tử toán học toán tử bit Chúng tổng kết Bảng 2.7 Các ví dụ giả sử n 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 -= 25 n *= 25 n /= 25 n %= 25 n &= 0xF2F2 n |= 0xF2F2 n ^= 0xF2F2 n = n = n + 25 n = n – 25 n = n * 25 n = n / 25 n = n % 25 n = n & 0xF2F2 n = n | 0xF2F2 n = n ^ 0xF2F2 n = n > Phép tốn khởi tạo biểu thức mà giá trị giá trị lưu tốn hạng trái Vì phép tốn khởi tạo sử dụng tốn hạng phải phép toán khởi tạo khác Bất kỳ số lượng khởi tạo kết nối theo cách để hình thành 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 ứng dụng tương tự cho 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 u cầu tốn hạng Hình thức chung là: tốn hạng ? tốn hạng : toán hạng Toán hạng ước lượng xem điều kiện Nếu kết khơng tốn hạng ước lượng giá trị kết sau Ngược lại, toán hạng ước lượng giá trị kết sau Ví dụ: Chương 2: Biểu thức 22 int m = 1, n = 2; int = (m < n ? m : n); // nhận giá trị Chú ý toán hạng thứ tốn hạng thứ tốn tử điều kiện có tốn hạng thực Điều quan trọng hai chứa hiệu ứng phụ (nghĩa là, việc ước lượng chúng làm chuyển đổi giá trị biến) Ví dụ, với m=1 n=2 int = (m < n ? m++ : n++); m tăng lên m++ ước lượng n khơng tăng n++ khơng ước lượng Bởi phép tốn điều kiện biểu thức nên sử dụng toán hạng phép toán điều kiện khác, có nghĩa biểu thức điều kiện lồng Ví dụ: int m = 1, n = 2, p =3; int = (m < n ? (m < p ? m : p) : (n < p ? n : p)); 2.8 Tốn tử phẩy Nhiều biểu thức kết nối vào biểu thức sử dụng toán tử phẩy Toán tử phẩy yêu cầu toán hạng Đầu tiên ước lượng tốn hạng trái sau toán hạng phải, trả giá trị toán hạng phải kết sau Ví dụ: int m=1, n=2, min; int mCount = 0, nCount = 0; // = (m < n ? mCount++, m : nCount++, n); Ở m nhỏ n, mCount++ ước lượng giá trị m lưu Ngược lại, nCount++ ước lượng giá trị n lưu 2.9 Tốn tử lấy kích thước C++ cung cấp tốn tử hữu dụng, sizeof, để tính tốn kích thước hạng mục liệu hay kiểu liệu Nó u cầu tốn hạng tên kiểu (ví dụ, int) hay biểu thức (ví dụ, 100) trả kích thước thực thể định theo byte Kết hoàn toàn phụ thuộc vào máy Danh sách 2.1 minh họa việc sử dụng tốn tử sizeof cho kiểu có sẵn mà gặp thời điểm Chương 2: Biểu thức 23 Danh sách 2.1 #include int main (void) { cout