1. Trang chủ
  2. » Công Nghệ Thông Tin

Câu lệnh, biểu thức và toán tử

7 307 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Câu lệnh, biểu thức và toán tử
Trường học Đại học Đà Nẵng
Chuyên ngành Lập trình C
Thể loại Giáo trình môn học
Năm xuất bản 2023
Thành phố Đà Nẵng
Định dạng
Số trang 7
Dung lượng 121,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Trình biên dịch sẽ bỏ qua các kí tự không nhìn thấy như tab, enter, spacebar, vì vậy 2 câu lệnh sau đây là tương đương với nhau : x=y+z; và x = y + z ; Khoảng trắng chỉ có ý nghĩa trong

Trang 1

Ch−¬ng III CÂU LỆNH, BIỂU THỨC, VÀ TOÁN TỬ

I Câu lệnh:

Câu lệnh là 1 chỉ thị hoàn chỉnh, ra lệnh cho máy tính thực hiện công việc nào đó Các câu lệnh kết thúc bởi dấu chấm phẩy, thường được viết trên 1 dòng để chương trình rõ ràng

Trình biên dịch sẽ bỏ qua các kí tự không nhìn thấy như tab, enter, spacebar, vì vậy 2 câu lệnh sau đây là tương đương với nhau :

x=y+z;

và x = y + z ;

Khoảng trắng chỉ có ý nghĩa trong xâu kí tự như “Dai hoc Da Nang”

Với xâu kí tự để có thể viết trên các dòng khác nhau thì ta phải dùng kí tự \

Ví dụ : int x,\

y,z;

printf(“\nDai hoc \

Da Nang”);

Câu lệnh đơn giản là những lệnh không chứa lệnh khác như phép gán, lời gọi hàm kiểu void (hàm không có giá trị trả về), lệnh nhảy không điều kiện

Câu lệnh cấu trúc là khối lệnh, lệnh thử và lệnh rẽ nhánh, lệnh lặp

II Khối lệnh:

Khối lệnh là một nhóm câu lệnh được bao bởi cặp dấu ngoặc {}

Ví dụ : { câu lệnh 1;

câu lệnh 2;

câu lệnh n;

} Những nơi có thể đặt một lệnh đơn thì có thể đặt 1 khối lệnh Bên trong khối lệnh có thể có khối lệnh khác

III Biểu thức:

Biểu thức bao gồm các toán hạng và toán tử

Toán hạng có thể là biến, hằng, hàm

Toán tử là + - * / % & |

Ví dụ : biểu thức tan(x)*y - 2 gồm các toán hạng là hàm tan của x, biến y và hằng 2; các toán hạng là *, -

• Biểu thức số học là biểu thức có kết quả là giá trị số học

• Biểu thức logic là biểu thức có kết quả là TRUE hoặc FALSE ( thông qua 0 và 1)

• Biểu thức quan hệ là các biểu thức logic đơn giản, chứa các toán tử quan hệ như

>,<,>=,<=,==,!= Các toán hạng trong biểu thức này không nhất thiết phải tương thích với nhau về kiểu

Trang 2

IV Toán tử:

Toán tử là một kí hiệu nhằm thực hiện các tính toán trên 1 hay nhiều số hạng

IV.1 Phép tính theo bit:

Không áp dụng cho kiểu float và double

& phép AND theo từng bit

| phép OR theo từng bit

^ phép XOR theo từng bit

~ phép đảo từng bit

Ví dụ : 3 = 0000 0000 0000 0011

~3 = 1111 1111 1111 1100

Ta cần phải phân biệt giữa các toán tử & và && :

3 & 4 = 0, 3 && 4 = 1

Tương tự như vậy với các toán tử | và || :

3 | 4 = 7, 3 || 4 = 1

Ta dùng các phép tính theo bit để xoá hoặc lập các bit trong các số nhị phân

Ví dụ : để lập bit thứ 0 và bit thứ 3 của số nguyên x, ta dùng lệnh x = x | 0x9;

để xoá bit thứ 1 và bit thứ 2 của số nguyên x, ta dùng lệnh x = x & 0xF9;

• Phép dịch số học >> và << :

I<<M : dịch số nguyên I sang trái đi M bit, tương đương với I*2M

I>>M : dịch số nguyên I sang phải đi M bit, tương đương với I/2M

Ví dụ : để tính I*20 ta viết (I<<4) + (I<<2) vì 20 = 24 + 22

Ví dụ : int i=0x123;

i=i>>3;

printf(“\n i=%#x”,i); 0x24 printf(“\n i=%#o”,i); 044 Chú ý :

1 int i=0xFFFF;

printf("\ni=%d",i) ; -1 i=i<<2;

printf("\ni=%d",i) ; -4

2 int x=0xFFFF;

x=x<<2;

printf(“\nx=%#x”,x);

Kết quả: 0xFFFC; /* không phải x*22 */

3 I>>M tương đương với I/2M khi I > 0

Ví dụ: int i=-15;

clrscr();

printf("\ni=%d",i) ; -15 i=i>>3;

Trang 3

IV.2 Phép gán mở rộng :

x-=y <=> x=x-y

x/=y <=> x=x/y

x>>=y <=> x=x>>y

x<<=y <=> x=x<<y

x&=y <=> x=x&y

x|=y <=> x=x|y

Chú ý : a = a*b+c; không tương đương với a*=b+c;

Vì a*=b+c; tương đương với a=a*(b+c);

Việc dùng phép gán mở rộng có thể gây khó hiểu nhưng nhiều bộ biên dịch tạo ra mã hiệu quả hơn nếu ta dùng nó

IV.3 Phép tăng / giảm giá trị 1 đơn vị (dùng với các biến):

i=i+1 <=> i++ hoặc ++i

i=i-1 <=> i hoặc i

Sự khác nhau giữa 2 lệnh gán a= ++i và a= i++ :

++i : tăng i lên 1 đơn vị, sau đó mới gán

i++ : gán trước, sau đó mới tăng i lên 1 đơn vị

Ví dụ : x=0;a=x++; // a=x; x++; : a=0, x=1;

x=0;a=++x; // x++; a=x; : a=1,x=1;

IV.4 Toán tử quan hệ :

== toán hạng 1 có bằng toán hạng 2 không ?

> toán hạng 1 có lớn hơn toán hạng 2 không ?

< toán hạng 1 có nhỏ hơn toán hạng 2 không ?

>= toán hạng 1 có lớn hơn hoặc bằng toán hạng 2 không ?

<= toán hạng 1 có nhỏ hơn hoặc bằng toán hạng 2 không ?

!= toán hạng 1 có khác toán hạng 2 không ?

Ta cần phải phân biệt toán tử quan hệ == và toán tử gán =

IV.5 Toán tử sizeof():

Toán tử sizeof(x) trả lại số byte mà x chiếm

Ta còn có thể viết sizeof(kiểu_dữ_liệu)

Ví dụ : float x;

printf(“\n Kích thước của kiểu số thực là : %d”, sizeof(x));

printf(“\n Kích thước của kiểu số nguyên là : %d”, sizeof(int));

Trang 4

IV.6 Toán tử điều kiện :

biểu_thức1 ? biểu_thức2 : biểu_thức3;

Nếu biểu_thức1 là đúng (khác 0) thì giá trị của biểu thức trên là biểu_thức2, nếu biểu_thức1 là sai (bằng 0) thì giá trị của biểu thức trên là biểu_thức3

Ví dụ : Giả sử ta muốn tìm giá trị lớn nhất max của 2 số a và b Ta có thể viết như sau : max = a > b ? a : b

Nếu a > b là TRUE thì max được gán bằng a, nếu không thì được gán bằng b

Ví dụ: printf(“There %s %d fish”, (n>1) ? ”are”:”is”, n);

printf("There %s %d dog%s", (n>1)?"are":"is", n, (n>1)?"s":"");

V Thứ tự ưu tiên giữa các phép toán:

- ++ ! ~ sizeof() &(địa chỉ) *(con trỏ) toán tử ép kiểu : toán tử 1 ngôi R → L

Nếu không nhớ thứ tự thì ta có thể dùng các dấu ngoặc đơn ()

Nếu các toán tử cùng cấp thì làm theo chiều tính toán

Ta không nên viết : x = f ( ) + g ( ); nếu 1 trong 2 hàm f và/hoặc g có thể làm thay đổi giá trị của các biến truyền cho hàm còn lại C không chỉ rõ hàm nào sẽ được thực hiện trước

Tương tự : * printf("%d %d\n", ++n, power(2, n)); /* sai */

* a[i] = i++;

VI Sự hiệu chỉnh khi tính toán :

Ngôn ngữ C cho phép sự trộn lẫn các toán hạng thuộc các kiểu khác nhau

VI.1 Sự chuyển đổi số học :

Trang 5

Việc chuyển đổi kiểu giá trị xảy ra tự động khi trong biểu thức có các toán hạng khác kiểu Việc chuyển đổi kiểu giá trị cũng xảy ra khi gán giá trị kiểu này cho biến (hoặc phần tử mảng) kiểu kia, khi truyền giá trị các đối số cho các tham số, trong câu lệnh return

int → long → float → double → long double

Khi chuyển đổi theo chiều ngược lại thì sẽ bị mất mát thông tin, có thể có cảnh báo nhưng không có lỗi

Ví dụ: int n;

long p;

float x,s;

s=n*p+x;

đầu tiên khi tính n*p, n được đổi thành kiểu long Tích có kiểu long nên khi tính tổng, tích được chuyển thành kiểu float Tổng có kiểu float sẽ được gán cho s

VI.2 Sự ưu tiên cho kiểu số :

Các phép tính số học không định nghĩa cho kiểu char và short C tự động hiệu chỉnh kiểu char và kiểu short thành kiểu int

VI.3 Chuyển đổi đối với kiểu kí tự char:

Kiểu kí tự char khi ở trong biểu thức số học sẽ được chuyển đổi thành kiểu int dựa vào bảng mã ASCII

Ví dụ : char ch;

ch = ‘A’ + 1; // ‘A’=65 nên ‘A’+1=66 từ đó ch=’B’

VII Cố ý chuyển đổi kiểu giá trị:

Để nhận được kết quả mong muốn đôi khi ta phải chuyển đổi kiểu của giá trị

Ví dụ :

#include <stdio.h>

#include <conio.h>

main()

{

int m,n;

float x;

m=3;n=2;

x=m/n; // phép chia lấy phần nguyên, sau đó chuyển sang kiểu float để gán vào x printf(“\n Khi chua chuyen doi : m/n = %f”,x);

printf(“\n Khi da chuyen doi : m/n = %f”,(float)m/n);

getch();

return 0;

}

Ở đây (float)m có nghĩa là chuyển đổi n sang kiểu số thực

Khi đó (float)m/n là phép chia giữa 2 số thực

Ta có thể viết (float)(m) hoặc (float)m

Trang 6

VIII Các hàm số học chuẩn:

Các hàm số học chuẩn nhận các đối số là các số nguyên hoặc số thực, các hàm này nằm trong file math.h Vì vậy trước khi sử dụng ta cần khai báo #include <math.h>

int abs(int i) trả lại giá trị tuyệt đối của số nguyên i

double fabs(double d) trả lại giá trị tuyệt đối của số thực d

double sin(double d) trả lại hàm sin

double cos(double d) trả lại hàm cos

double cosh(double d) trả lại hàm ch (hyberbolic)

double tan(double d) trả lại hàm tg

double exp(double d) trả lại giá trị e mũ d

double log(double d) trả lại hàm loga cơ số e

double log10(double d) trả lại hàm loga cơ số 10

double pow(double d1, double d2) trả lại giá trị d1 mũ d2

double floor(double d) trả lại hàm cắt tròn số

double ceil(double d) trả lại hàm làm tròn số

double fmod(double d1, double d2) trả lại hàm phần dư của phép chia d1/d2 double sqrt(double d) trả lại hàm căn bậc hai

void srand(double d) khởi tạo bộ số ngẫu nhiên

Ví dụ :

floor(3.2) = 3 floor(3.7) = 3

ceil(3.2) = 4 ceil(3.7) = 4

Để làm tròn các số thực từ 2.5 đến cận 3.5 thành 3 ta dùng floor(i+0.5)

IX Bài tập :

1 Giả sử ta có :

float x,y;

x=(int)3.4;

y=(int)3.8;

Tính x,y (3,3)

2 Giả sử ta có :

int x=3,y=5;

x=y++;

y=++x;

Tính x,y ( 6,6)

3 float x,y;

x=14/5;

y=(float)14/5;

Tính x,y ( 2.000 , 2.8 )

4 Tính 10101 | 11001, 10101 & 11001

Trang 7

5 Ban đầu 4 số x,y,z,t đều bằng 5 Thực hiện các lệnh :

y=x++;

t=++z;

Hỏi kết quả cuối cùng của 4 số trên

6 Lập lệnh tính biểu thức :

) ( cos 3 )

e

7 Viết chương trình nhập 4 số nguyên, tính tổng 2 số nguyên ở giữa

Ví dụ : nhập 4 số a <= b <= c <= d , xuất ra b + c

8 Viết đoạn lệnh tính hàm dấu như sau :

>

=

<

=

0

n nếu

0

n nếu 0

0

n nếu 1

1 ) (n sign

Lời giải: Cách 1: sign = n > 0 ? 1 : 0 ;

sign = n < 0 ? -1: sign ; Cách 2: sign = n > 0 ? 1 : ( n == 0 ? 0 : -1 ) ; Hoặc sign = n > 0 ? 1 : ( n < 0 ? -1 : 0 ) ;

Ngày đăng: 02/10/2013, 20:20

TỪ KHÓA LIÊN QUAN

w