Lập trình C Aptech - Bài 4: Toán tử và biểu thức
Mục tiêu:
Kết thúc bài học này, bạn có thể:
Hiểu được Toán tử gán
Hiểu được biểu thức số học
Nắm được toán tử quan hệ (Relational Operators) và toán tử luận lý (Logical Operators)
Hiểu toán tử luận lý nhị phân (Bitwise Logical Operators) và biểu thức (Expressions)
Hiểu khái niệm ép kiểu
Hiểu độ ưu tiên của các toán tử.
ho kết quả là kiểu float, dòng mã sau được viết: (float) a/b; Ép kiểu có thể áp dụng cho các giá trị hằng, biểu thức hay biến, ví dụ: (int) 17.487; (double) (5 * 4 / 8); (float) (a + 7); Trong ví dụ thứ hai, toán tử ép kiểu không đạt mục đích của nó bởi vì nó chỉ thực thi sau khi toàn biểu thức trong dấu ngoặc đã được tính. Biểu thức 5 * 4 / 8 cho ra giá trị là 2 (vì nó có kiểu là số nguyên nên đã cắt đi phần thập phân), vì vậy, giá trị kết quả với kiểu double cũng là 2.0. Ví dụ: int i = 1, j = 3; x = i / j; /* x = 0.0 */ x = (float) i/(float) j; /* x = 0.33 */ 4.6 Độ ưu tiên của toán tử (Precedence) Độ ưu tiên của toán tử thiết lập thứ tự ưu tiên tính toán khi một biểu thức số học cần được ước lượng. Tóm lại, độ ưu tiên đề cập đến thứ tự mà C thực thi các toán tử. Thứ tự ưu tiên của toán tử số học được thể hiện như bảng dưới đây. Loại toán tử Toán tử Tính kết hợp Một ngôi - , ++, -- Phải sang trái Hai ngôi ^ Trái sang phải *, /, % +, - = Phải sang trái Bảng 4.4: Thứ tự ưu tiên của toán tử số học Những toán tử nằm cùng một hàng ở bảng trên có cùng quyền ưu tiên. Việc tính toán của một biểu thức số học sẽ được thực hiện từ trái sang phải cho các toán tử cùng độ ưu tiên. Toán tử *, /, và % có cùng đô ưu tiên và cao hơn + và - (hai ngôi). Độ ưu tiên của những toán tử này có thể được thay đổi bằng cách sử dụng dấu ngoặc đơn. Một biểu thức trong ngoặc luôn luôn được tính toán trước. Một cặp dấu ngoặc đơn này có thể được bao trong cặp khác. Ðây là sự lồng nhau của những dấu ngoặc đơn. Trong trường hợp đó, việc tính toán trước tiên được thực hiện tại cặp dấu ngoặc đơn trong cùng nhất rồi đến dấu ngoặc đơn bên ngoài. Nếu có nhiều bộ dấu ngoặc đơn thì việc thực thi sẽ theo thứ tự từ trái sang phải. Tính kết hợp cho biết cách thức các toán tử kết hợp với các toán hạng của chúng. Ví dụ, đối với toán tử một ngôi: toán hạng nằm bên phải được tính trước, trong phép chia thì toán hạng bên trái được chia cho toán hạng bên phải. Đối với toán tử gán thì biểu thức bên phải được tính trước rồi gán giá trị cho biến bên trái toán tử. Tính kết hợp cũng cho biết thứ tự mà theo đó C đánh giá các toán tử trong biểu thức có cùng độ ưu tiên. Các toán tử như vậy có thể tính toán từ trái sang phải hoặc ngược lại như thấy trong bảng 4.5. Ví dụ: a = b = 10/2; Giá trị 5 sẽ gán cho b xong rồi gán cho a. Vì vậy thứ tự ưu tiên sẽ là phải sang trái. Hơn nữa, -8 * 4 % 2 – 3 được tính theo trình tự sau: Trình tự Thao tác Kết quả 1. - 8 (phép trừ một ngôi) số âm của 8 2. - 8 * 4 - 32 3. - 32 % 2 0 4. 0-3 -3 Theo trên thì toán tự một ngôi (dấu - ) có quyền ưu tiên cao nhất được tính trước tiên. Giữa * và % thì được tính từ trái sang phải. Tiếp đến sẽ là phép trừ hai ngôi. Thứ tự ưu tiên của các biểu thức con Những biểu thức phức tạp có thể chứa những biểu thức nhỏ hơn gọi là biểu thức con. C không xác định thứ tự mà các biểu thức con được lượng giá. Một biểu thức sau: a * b /c + d *c; bảo đảm rằng biểu thức con a * b/c và d*c sẽ được tính trước phép cộng. Hơn nữa, quy tắc từ trái sang phải cho phép toán nhân và chia bảo đảm rằng a sẽ được nhân với b và sau đó sẽ chia cho c. Nhưng không có quy tắc xác định hoặc a*b /c được tính trước hay sau d*c. Tùy chọn này là ở người thiết kế trình biên dịch quyết định. Quy tắc trái sang phải hay ngược lại chỉ áp dụng cho một chuỗi toán tử cùng độ ưu tiên. Cụ thể, nó áp dụng cho phép nhân và chia trong a*b/c. Nhưng nó không áp dụng cho toán tử + vì đã khác cấp. Bởi vì không thể xác định thứ tự tính toán các biểu thức con, do vậy, ta không nên dùng các biểu thức nếu giá trị biểu thức phụ thuộc vào thứ tự tính toán các biểu thức con . Xét ví dụ sau: a * b + c * b++ ; Có thể trình biên dịch này tính giá trị mục bên trái trước và dùng cùng giá trị b cho cả hai biểu thức con. Nhưng trình biên dịch khác lại tính giá trị mục bên phải và tăng giá trị b trước khi tính giá trị mục bên trái. Ta không nên dùng toán tử tăng hay giảm cho một biến mà nó xuất hiện nhiều hơn một lần trong một biểu thức. Thứ tự ưu tiên giữa những toán tử so sánh (toán tử quan hệ) Ta đã thấy trong phần trước một số toán tử số học có độ ưu tiên cao hơn các toán tử số học khác. Riêng với toán tử so sánh, không có thứ tự ưu tiên giữa các toán tử và chúng được ước lượng từ trái sang phải. Thứ tự ưu tiên giữa những toán tử luận lý Bảng dưới đây trình bày thứ tự ưu tiên cho toán tử luận lý. Thứ tự Toán tử 1 NOT 2 AND 3 OR Bảng 4.5: Thứ tự ưu tiên cho toán tử luận lý Khi có nhiều toán tử luận lý trong một điều kiện, chúng được lượng giá từ phải sang trái. Ví dụ, xét điều kiện sau: False OR True AND NOT False AND True Ðiều kiện này được tính như sau: False OR True AND [NOT False] AND TrueNOT có độ ưu tiên cao nhất. False OR True AND [True AND True]Ở đây, AND là toán tử có độ ưu tiên cao nhất và những toán tử có cùng ưu tiên được tính từ phải sang trái. False OR [True AND True] [False OR True] True Thứ tự ưu tiên giữa các kiểu toán tử khác nhau Khi một biểu thức có nhiều hơn một kiểu toán tử thì thứ tự ưu tiên phải được thiết lập giữa các kiểu toán tử với nhau. Bảng dưới đây cho biết thứ tự ưu tiên giữa các kiểu toán tử khác nhau. Thứ tự Kiểu toán tử 1 Số học 2 So sánh (Quan hệ) 3 Luận lý Bảng 4.6. Thứ tự ưu tiên giữa các kiểu toán tử khác nhau Do vậy, trong một biểu thức gồm cả ba kiểu toán tử, các toán tử số học được tính trước, kế đến là toán tử so sánh và sau đó là toán tử luận lý. Thứ tự ưu tiên của các toán tử trong cùng một kiểu thì đã được nói tới ở những phần trước. Xét ví dụ sau: 2*3+4/2 > 3 AND 3<5 OR 10<9 Việc thực hiện tính toán sẽ như sau: [2*3+4/2] > 3 AND 3<5 OR 10<9Ðầu tiên toán tử số học sẽ được tính theo thứ tự ưu tiên như bảng 4.4. [[2*3]+[4/2]] > 3 AND 3<5 OR 10<9 [6+2] >3 AND 3<5 OR 10<9 [8 >3] AND [3<5] OR [10<9]Kế đến sẽ tính tất cả những toán tử so sánh có cùng độ ưu tiên theo quy tắc tính từ trái sang phải. True AND True OR FalseCuối cùng tính toán các toán tử kiểu luận lý. AND sẽ có độ ưu tiên cao hơn OR. [True AND True]OR False True OR False True Dấu ngoặc đơn Thứ tự ưu tiên của các toán tử có thể thay đổi bởi các dấu ngoặc đơn. Khi đó, chương trình sẽ tính toán các phần dữ liệu trong dấu ngoặc đơn trước. Khi một cặp dấu ngoặc đơn này được bao trong cặp khác, việc tính toán thực hiện trước tiên tại cặp dấu ngoặc đơn trong cùng nhất, rồi đến dấu ngoặc đơn bên ngoài. Nếu có nhiều bộ dấu ngoặc đơn thì việc thực hiện sẽ theo thứ tự từ trái sang phải. Xét ví dụ sau: 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR (211)) Cách tính sẽ là: 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR (True AND False)) Dấu ngoặc đơn trong cùng sẽ được tính trước tất cả các toán tử khác và áp dụng quy tắc cơ bản trong bảng 4.6 cho tính toán bên trong cặp dấu ngoặc này. 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR False) 5+9*3^2-4 > 10 AND (2+16-8/4 > 6 OR False)Kế đến dấu ngoặc đơn ở ngoài được xét đến. Xem lại các bảng nói về thứ tự ưu tiên của các toán tử. 5+9*3^2-4 > 10 AND (2+16-2 > 6 OR False) 5+9*3^2-4 > 10 AND (18-2 > 6 OR False) 5+9*3^2-4 > 10 AND (16 > 6 OR False) 5+9*3^2-4 > 10 AND (True OR False) 5+9*3^2-4 > 10 AND True 5+9*9-4>10 AND TrueTa tính biểu thức bên trái trước theo các quy tắc 5+81-4>10 AND True 86-4>10 AND True 82>10 AND True True AND True True. Tóm tắt bài học C định nghĩa bốn loại toán tử: số học, quan hệ (so sánh), luận lý và luận lý nhị phân. Tất cả toán tử trong C được tính toán theo thứ tự độ ưu tiên. Toán tử quan hệ được dùng kiểm tra mối quan hệ giữa hai biến hay giữa một biến và một hằng. Toán tử luận lý là những ký hiệu dùng để kết hợp hay phủ định những biểu thức chứa các toán tử quan hệ. Toán tử luận lý nhị phân xét các toán hạng như là bit nhị phân chứ không phải là các giá trị số thập phân. Phép gán (=) được xem như là một toán tử có tính kết hợp từ phải sang trái. Độ ưu tiên thiết lập sự phân cấp của một tập các toán tử so với tập các toán tử khác khi ước lượng một biểu thức. Kiểm tra tiến độ học tập ______ là những công cụ thao tác dữ liệu. A. Những toán tử B. Những toán hạng C. Những biểu thức D. Không câu nào đúng Một _______ bao gồm sự kết hợp của các toán tử và các toán hạng. A. Biểu thức B. Hàm C. Con trỏ D. Không câu nào đúng ________ thiết lập sự phân cấp của một tập các toán tử so với tập các toán tử khác khi ước lượng một biểu thức. A. Những toán hạng B. Độ ưu tiên C. Toán tử D. Không câu nào đúng ____________ là một biểu thức có các toán hạng thuộc nhiều kiểu dữ liệu khác nhau. A. Biểu thức đơn B. Biểu thức hỗn hợp C. Quyền ưu tiên D. Không câu nào đúng Một biểu thức được ép thành một kiểu nhất định bằng cách dùng ____. A. Ép kiểu B. Quyền ưu tiên C. Toán tử D. Không câu nào đúng _________ được dùng để kết hợp hay phủ định biểu thức chứa các toán tử quan hệ. A. Những toán tử luận lý B. Những toán tử luận lý nhị phân C. Những toán tử phức D. Không câu nào đúng Những toán tử luận lý nhị phân là __, ___, __ và __ . A. % , ^ , * and @ B. &,|,~ and ^ C. !,],& and * D. Không câu nào đúng 8. Ðộ ưu tiên của các toán tử có thể được thay đổi bằng cách đặt các phần tử được yêu cầu của biểu thức trong _________ . A. Dấu ngoặc xoắn ({ }) B. Ký hiệu mũ ( ^) C. Những dấu ngoặc đơn (()) D. Không câu nào đúng Bài tập tự làm Viết một chương trình nhập và cộng ba số. Viết một chương trình tính giá trị của biểu thức với các giá trị sau: z = a*b+(c/d)-e*f ; a = 10 b = 7 c = 15.75 d = 4 e = 2 f = 5.6 Viết một chương trình tính diện tích và chu vi của hình chữ nhật. Viết một chương trình tính thể tích của một hình trụ. Viết một chương trình tính lương thực lãnh của một nhân viên theo công thức dưới đây Lương cơ bản : $ 12000 DA : 12% lương cơ bản HRA : $150 TA : $120 Các mục khác : $450 Thuế : PF :14% lương cơ bản và IT: 15% lương cơ bản Lương thực lãnh = Lương cơ bản + DA + HRA + TA + Các mục khác – (PF + IT)
File đính kèm:
- Lập trình C Aptech - Bài 4 Toán tử và biểu thức.doc