Biểu thức trong Ngôn ngữ lập trình C - Bài 5

Biểu thức trong Ngôn ngữ lập trình C - Bài 5
access_time 10/1/2019 12:00:00 AM
person Lê Đình Thành

Biểu thức trong lập trình C

1. Giới thiệu

Một trong các đặc tính quan trọng trong lập trình C đó là các biểu thức liên quan tới việc tính toán. Biểu thức đơn giản nhất trong lập trình đó là biến và hằng. Một biến lưu trữ giá trị phục vụ cho việc tính toán với một nghiệp vụ cụ thể trong bài toán. Vậy Một phép gán một giá trị cho một biến cũng là một biểu thức:

Ví dụ :

x = 20;

Trong câu lệnh trên phép đánh giá hay định lượng chính là phép gán có giá trị là 20 cho biến x .

Hằng là giá trị không thay đổi. Giá trị của hằng được khởi tạo tại thời điểm khai báo hằng. Với các trường hợp phức tạp hơn thì Biểu thức bao gồm tập hợp các toán tử và toán hạng kết hợp với nhau. Ví dụ biểu thức a + (b*c), toán tử +, *, các toán hạng bao gồm a, b,c;

Các toán tử chính là các công cụ chính để xây dựng lên biểu thức. Trong ngôn ngữ lập trình C cung cấp các toán tử như sau:

+ Toán tử số học (Arithmetic operators)        

+ Toán tử quan hệ (Relational operator)

+ Toán tử logic (Logical operator)

+ Toán tử điều kiện (Condition operator)

+ Các toán tử tăng, giảm (Increment and decrement operator)

+ Toán tử gán (Assignment operator) 

2. Toán tử số học

Ngôn ngữ C cung cấp năm toán tử toán học, bao gồm bốn toán tử đầu các phép toán cơ bản. Toán tử cuối cùng là toán tử chia nguyên lấy phần dư. Chúng ta sẽ tìm hiểu chi tiết các phép toán này trong phần tiếp sau.

Các phép toán số học cơ bản (+,-,*,/) : Đây là các phép toán số học đơn giản, các phép toán này được hỗ trợ hầu hết các ngôn ngữ lập trình

Phép toán chia lấy dư : Để tìm phần dư của phép chia nguyên, chúng ta sử dụng toán tử chia lấy dư (%). Ví dụ, câu lệnh sau 10%3 thì kết quả trả về là 1. 

3. Toán tử tăng, giảm

Khi sử dụng các biến số ta thường có thao tác là cộng một giá trị vào biến, trừ đi một giá trị từ biến đó, hay thực hiện các tính toán thay đổi giá trị của biến sau đó gán giá trị mới vừa tính toán cho chính biến đó (Tính toán và gán trả lại).

Ví dụ :

x = x + 1;

Do việc tăng hay giảm giá trị của một biến rất thường xảy ra trong khi tính toán nên C cung cấp các phép toán tự gán. Bảng sau liệt kê phép toán tự gán :

Bảng số 1 : Toán tử tăng giảm

Ví dụ :

x += 100; // x sẽ thực hiện phép toán x = x + 100

y -= 100; // y sẽ thực hiện phép toán y = y – 100;

Do việc tăng hay giảm 1 rất phổ biến trong lập trình nên C cung cấp hai toán tử đặc biệt là tăng một (++) hay giảm một (--).

Toán tử tăng giảm tiền tố và tăng giảm hậu tố

Giả sử muốn kết hợp các phép toán như gia tăng giá trị của một biến và gán giá trị của biến cho biến thứ hai, ta viết như sau:

x= y++;

Câu hỏi được đặt ra là gán giá trị trước khi cộng hay gán giá trị sau khi đã cộng. Hay nói cách khác giá trị ban đầu của biến y là 10, sau khi thực hiện ta muốn giá trị của x là 10, y là 11, hay x là 11, y cũng 11?

Để giải quyết yêu cầu trên C cung cấp thứ tự thực hiện phép toán tăng/giảm với phép toán gán, thứ tự này được gọi là tiền tố (prefix) hay hậu tố (postfix). Do đó ta có thể viết:

x = y++; // Hậu tố

Khi lệnh này được thực hiện thì phép gán sẽ được thực hiện trước tiên, sau đó mới đến phép toán tăng.

Kết quả là x = 10 và y = 11.

Còn đối với trường hợp tiền tố:

x = ++y; Khi đó phép tăng sẽ được thực hiện trước tức là giá trị của biến y sẽ là 11 và cuối cùng phép gán được thực hiện. Kết quả cả hai biến x và y điều có giá trị là 11.

Ví dụ :


Hình số 1 : Kết quả chạy chương trình với tăng giảm

4.2 Toán tử quan hệ.

Thường dùng cho phép so sánh, thể hiện sự tương quan giữa 2 giá trị. Kết quả của phép toán quan hệ thường trả về giá trị thuộc kiểu bool tương ứng với 2 trạng thái true (Đúng), false (sai).

Ví dụ : Ví dụ toán tử so sánh lớn hơn (>) trả về giá trị là true nếu giá trị bên trái của toán tử lớn hơn giá trị bên phải của toán tử. Do vậy 5 > 2 trả về một giá trị là true, trong khi

3 > 5 trả về giá trị false.

Bảng mô tả toán tử quan hệ:


Bảng số 2 : Toán tử quan hệ

Ví dụ:


Hình số 2 : Ví dụ toán tử quan hệ

4.3 Toán tử logic

Thường dùng cho mục đích phối hợp nhiều biểu thức logic với nhau để cho ra 1 giá trị logic duy nhất. Toán tử logic bao gồm && : Khi các biểu thức logic đồng thời cùng mang giá trị true thì kết quả phối hợp của chúng sẽ trả về là true. Trong trường hợp có 1 biểu thức false hoặc tất cả cùng false thì kết quả phối hợp sẽ là false.

Áp dụng toán tử logic trong các câu lệnh if, while …,do…while …

Bảng dưới đâu mô tả toán tử logic của 2 biến x,y làm minh họa

Bảng số 3 : Toán tử logic

5. Độ ưu tiên của toán tử

Trình biên dịch phải xác định thứ tự thực hiện các toán tử trong trường hợp một biểuthức có nhiều phép toán, giả sử, có biểu thức sau:

x = 10+8*3;

Biểu thức trên có ba phép toán để thực hiện bao gồm (=, +,*). Ta thử xét các phép toán theo thứ tự từ trái sang phải, đầu tiên là gán giá trị 10 cho biến x, sau đó cộng 8 vào 10 là 18 cuối cùng là nhân với 3, kết quả trả về là 54, điều này thật sự có vấn đề, không đúng với mục đích yêu cầu của chúng ta.

Do vậy việc xây dựng một trình tự xử lý các toán tử là hết sức cần thiết. Các luật về độ ưu tiên xử lý sẽ bảo trình biên dịch biết được toán tử nào được thực hiện trước trong biểu thức.Tương tự như trong phép toán đại số thì phép nhân có độ ưu tiên thực hiện trước phép toán cộng, do vậy 10+8*3 cho kết quả là 34 đúng hơn kết quả 54. Và cả hai phép

toán cộng và phép toán nhân điều có độ ưu tiên cao hơn phép gán. Như vậy trình biên dịch sẽ thực hiện các phép toán rồi sau đó thực hiện phép gán ở bước cuối cùng. Kết quả đúng của câu lệnh trên là biến x sẽ nhận giá trị là 34.

Trong ngôn ngữ C, dấu ngoặc được sử dụng để thay đổi thứ tự xử lý, điều này cũng giống trong tính toán đại số.

Khi đó muốn kết quả 54 cho biến x có thể viết:

x = (10+8) * 3;

Biểu thức trong ngoặc sẽ được xử lý trước và sau khi có kết quả là 18 thì phép nhân được thực hiện.


Bảng số 4: Thứ tự ưu tiên các phép toán


vertical_align_top
share
Chat...