40
4/21/2015 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ngôn ngữ lập trình C và C++ Bài 4: Hàm và Cấu trúc chương trình TS. Đỗ Đăng Khoa Bộ môn Cơ học Ứng dụng Viện Cơ khí http://chud-dhbkhn.blogspot.com/

Bai 4- Ham va Cau truc chuong trinh.pdf

Embed Size (px)

Citation preview

4/21/2015

1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

Ngôn ngữ lập trình C và C++

Bài 4: Hàm và Cấu trúc chương trình

TS. Đỗ Đăng Khoa

Bộ môn Cơ học Ứng dụngViện Cơ khí

http://chud-dhbkhn.blogspot.com/

4/21/2015

2

Khái niệm về Hàm

�Một vấn đề phức tạp thường được chia nhỏ thành các phần

đơn giản hơn để giải quyết (lập trình top-down)

�Những phần này được gọi là các hàm hay chương trình con

�Là một nhóm các lệnh để thực hiện một việc cụ thể, có thể

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

được dùng lại nhiều lần.

�Hàm main() gọi các hàm này để giải quyết vấn đề phức tạp

ban đầu

�Hai nhóm hàm: Hàm được định nghĩa trước: printf, scanf, cout,

cin...và Hàm người dùng định nghĩa

2

4/21/2015

3

Ưu điểm của Hàm

�Các hàm được sử dụng để rút gọn cho một tậphợp các lệnh được sử dụng lại nhiều lần

�Hàm dễ viết và dễ hiểu

�Gỡ lỗi chương trình dễ dàng hơn khi cấu trúc của

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

�Gỡ lỗi chương trình dễ dàng hơn khi cấu trúc củachương trình rõ ràng với hình thức lập trình theomodule

�Dễ dàng bảo trì, bởi vì sự sửa đổi khi có yêu cầuđược giới hạn trong từng hàm của chương trình

3

4/21/2015

4

Đầu vào và đầu ra của Hàm

Hàm (Function) Kết quả

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

4

Hàm (Function) Kết quảtrả về

Các tham số vào

4/21/2015

5

Khai báo Hàm

� Khai báo một hàm cho trình biên dịch biết về tên của hàm,

kiểu trả về và các tham số

� Khai báo hàm thường được đặt trong tập tin tiêu đề

� Việc khai báo hàm là bắt buộc khi hàm được sử dụng trước

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

� Việc khai báo hàm là bắt buộc khi hàm được sử dụng trước

khi nó được định nghĩa

� Khai báo hàm có dạng sau:

Kiểu_dữ_liệu_trả_về tên_hàm( các_tham_số_vào)

4/21/2015

6

Khai báo hàm

� Ví dụ:int max( int num1, int num2);

� Hàm này nhận hai tham số nguyên và trả về một sốkiểu nguyên

� Tên các tham số không quan trọng trong khai báo hàm,

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

� Tên các tham số không quan trọng trong khai báo hàm,chỉ kiểu của chúng là cần thiết:

int max( int, int) ;�- Hàm khai báo như trên còn được gọi là nguyên mẫuhàm.

4/21/2015

7

Định nghĩa một hàm

Dạng tổng quát:Kiểu_dữ_liệu_trả_về Tên_hàm( Các_tham_số_vào){

phần thân hàm}Một định nghĩa hàm bao gồm đầu hàm và thân hàm.

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

Một định nghĩa hàm bao gồm đầu hàm và thân hàm.- Kiểu_dữ_liệu_trả_về : kiểu của dữ liệu được hàm trả

về. Sử dụng void với hàm không trả về giá trị nào.- Tên_hàm : tên hàm

4/21/2015

8

Ví dụ: hàm trả về số lớn nhất của hai số

- Hàm max với 2 tham số

/* function returning the max between two numbers */int max(int num1, int num2){int result;

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

if (num1 > num2)result = num1;

elseresult = num2;

return result;}

4/21/2015

9

Gọi hàm

� Chương trình không thực hiện các câu lệnh trong mộthàm cho đến khi hàm đó được gọi

� Khi chương trình gọi một hàm, điều khiển chương trìnhđược chuyển đến hàm gọi. Hàm này thực hiện nhiệmvụ đã định và trả lại điều khiển chương trình cho

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

vụ đã định và trả lại điều khiển chương trình chochương trình chính khi câu lệnh return được gọi hoặcđến hết hàm (dấu ngoặc nhọn đóng, }).

� Để gọi hàm, cần truyền các tham số yêu cầu cùng vớitên hàm. Nếu hàm trả về giá trị thì có thể lưu giá trị đó

4/21/2015

10

Gọi hàm

→ Gọi hàm với các

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

→ Gọi hàm với cáctham số yêu cầu

← Trở về câu lệnh tiếptheo

4/21/2015

11

Gọi hàm

�Dấu chấm phẩy được đặt cuối câu lệnh khi gọi hàm,

�Cặp dấu ngoặc () là bắt buộc theo sau tên hàm, chodù hàm có đối số hay không

�Hàm trả về nhiều nhất một giá trị

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

�Hàm trả về nhiều nhất một giá trị

�Chương trình có thể có nhiều hơn một hàm

�Hàm gọi đến một hàm khác được gọi là hàm gọi

�Hàm đang được gọi đến được gọi là hàm được gọi

4/21/2015

12

Ví dụ

#include <iostream>using namespace std;

// Khai báo hàmint max(int num1, int num2);

int main (){

// Định nghĩa hàm

int max(int num1, int num2){

int result;

if (num1 > num2)result = num1;

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

{int a = 100, b = 200, ret;

// gọi hàm để lấy giá trị lớn nhấtret = max(a, b);

cout <<"Max value = “ << ret;

return 0;}

result = num1;else

result = num2;

return result;}

4/21/2015

13

Câu lệnh return

� Kết thúc việc thực hiện hàm và trả lại điều khiển tới nơi gọi

hàm. Các lệnh được thực hiện tiếp tục tại điểm ngay sau nơi

gọi hàm.

� return [expression];

� Giá trị của biểu thức expression được trả lại nơi hàm gọi và

có kiểu tương ứng (hoặc được ép kiểu) tương ứng với kiểu

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

có kiểu tương ứng (hoặc được ép kiểu) tương ứng với kiểu

trả về.

� Nếu bỏ qua expression, giá trị trả về của hàm không xác

định.

� Khi luồng điều khiển ra khỏi khối định nghĩa hàm, kết quả

giống như thực hiện câu lệnh return không có biểu thức.

� Hàm có thể có số lượng câu lệnh return bất kỳ.

4/21/2015

14

Tham số của hàm

� Nếu một hàm phải dùng các tham số, nó phải khai báo các

biến để chấp nhận giá trị của các tham số. Các biến này

được gọi là các tham số hình thức của hàm.

� Tham số hình thức ứng xử giống như các biến cục bộ bên

trong hàm và được tạo ra khi bắt đầu vào hàm và bị hủy khi

ra khỏi hàm.

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

ra khỏi hàm.

� Khi gọi hàm, có 3 cách mà tham số có thể được truyền cho

hàm:

� Gọi theo giá trị (tham trị)

� Gọi theo con trỏ

� Gọi theo tham chiếu

4/21/2015

15

Gọi theo giá trị (tham trị)

Khai báo tham số: kiểu tham_số

Ví dụ: void swap(int a, int b);

Gọi hàm: int c(5), d(7);

swap(c, d);

�Cách thức này sao chép giá trị thực của tham số vào tham số

hình thức của hàm.

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

hình thức của hàm.

� Trong trường hợp này, những thay đổi với tham số hình thức bên

trong hàm không ảnh hưởng đến tham số truyền vào.

�Mặc định, C/C++ sử dụng “gọi theo giá trị” để truyền tham số . Nói

chung, điều này nghĩa là mã lệnh bên trong một hàm không thể

thay đổi các tham số được dùng trong gọi hàm.

4/21/2015

16

Ví dụ: Hoán đổi hai số bằng tham trị

#include <iostream>using namespace std;

// Khai báo hàmvoid swap(int a, int b);

int main (){

// Hàm hoán đổi hai số a và b

void swap(int a, int b);{

int c = a;a = b;b = c;

}

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

int c = 10, d = 20;

// gọi hàm hoán đổiswap (c, d);

cout <<“c = ” << c;cout <<“ d = ” << d;

return 0;}

Kết quả in ra:c = 10, d = 20

Hai biến c và d không thể đổigiá trị cho nhau

4/21/2015

17

Gọi theo con trỏ

Khai báo tham số: kiểu *tham_số

Ví dụ: int swap (int *a, int *b);

Gọi hàm: int c(5), d(7);

swap(&c, &d);

�Cách thức này copy địa chỉ của tham sốvào tham số hình

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

�Cách thức này copy địa chỉ của tham sốvào tham số hình

thức.

�Trong hàm, địa chỉ này được dùng để truy cập đến tham số

thực tế được dùng trong lời gọi.

� Việc này nghĩa là những thay đổi với tham số hình thức ảnh

hưởng đến tham số truyền vào.

Nhắc lại trong phần con trỏ.

4/21/2015

18

Ví dụ: Hoán đổi hai số bằng con trỏ

#include <iostream>using namespace std;

// Khai báo hàmvoid swap(int* a, int* b);

int main (){

// Hàm hoán đổi hai số a và b

void swap(int* a, int* b);{

int c = *a;*a = *b;*b = c;

}

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

int c = 10, d = 20;

// gọi hàm hoán đổiswap (&c, &d);

cout <<“c = ” << c;cout <<“ d = ” << d;

return 0;}

Kết quả in ra:c = 20, d = 10

Hai biến c và d đổi giá trị chonhau

4/21/2015

19

Gọi theo tham chiếu

Khai báo tham số: kiểu &tham_số

Ví dụ: void swap (int &a, int &b);

Gọi hàm: int c(5), d(7);

swap (c, d);

�Cách gọi này copy tham chiếu của một đối số vào tham số hình

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

�Cách gọi này copy tham chiếu của một đối số vào tham số hình

thức.

�Bên trong hàm, tham chiếu được dùng để truy cập tham số thực

được dùng trong lời gọi.

�Điều ngày cũng nghĩa là những thay đổi đối với tham số ảnh hưởng

đến tham số truyền vào.

�Truyền tham số bằng tham chiếu để tạo hàm có nhiều giá trị trả về

4/21/2015

20

Tham chiếu

� Tham chiếu của một biến là bí danh (tên gọi khác) của một biến

� Biến tham chiếu không được cấp phát bộ nhớ và có thể dùng để

truy cập hoặc thay đổi giá trị của biến được tham chiếu.

� Biến tham chiếu phải được khởi gán ngay khi khai báo

� Một khi đã được khởi gán chỉ tới một đối tượng, biến tham chiếu

sẽ không thay đổi được đối tượng chỉ đến

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

sẽ không thay đổi được đối tượng chỉ đến

Ví dụ: int a(5);

int &b = a; // b là biến tham chiếu

printf("a=%d\n",b);// In a=5

b++;

printf("a=%d\n",a);// In a=6

4/21/2015

21

Ví dụ: Hoán đổi hai số bằng tham chiếu

#include <iostream>using namespace std;

// Khai báo hàmint swap(int &a, int &b);

int main (){

// Hàm hoán đổi hai số a và b

int swap(int &a, int &b);{

int c = a;a = b;b = c;

}

Kết quả in ra:c = 20, d = 10Hai biến c và d đã được đổigiá trị cho nhau

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

{int c = 10, d = 20;

// gọi hàm hoán đổiswap (c, d);

cout <<“c = ” << c;cout <<“ d = ” << d;

return 0;}

}

Khi truyền tham số c và d vàohàm, hai biến tham chiếu a, btương ứng với tham số sẽ đượctạo ra và tham chiếu đến hai biếnc, d. Việc hàm thực hiện thay đổigiá trị hai biến tham chiếu a, b sẽảnh hưởng tới tham số c, d vàcho kết quả như yêu cầu.

4/21/2015

22

Giá trị mặc định cho tham số

� Khi định nghĩa một hàm, ta có thể xác định giá trị mặc định

cho từng tham số cuối cùng. Giá trị này sẽ được sử dụng

nếu đối số tương ứng được để trống khi gọi hàm.

� Thực hiện bằng cách sử dụng toán tử gán (=) và gán giá trị

cho các đối số trong định nghĩa hàm.

� Nếu một giá trị cho tham số đó không được truyền khi

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

� Nếu một giá trị cho tham số đó không được truyền khi

hàm được gọi, giá trị mặc định đã cho được dùng.

� Nếu một giá trị được truyền vào, giá trị mặc định được bỏ

qua và giá trị truyền vào được sử dụng thay thế.

� Các tham số có giá trị mặc định phải đứng sau các tham số

không có giá trị mặc định.

4/21/2015

23

Giá trị mặc định cho tham số

#include <iostream>using namespace std;

// Khai báo hàmint sum(int num1, int num2 = 20);

int main (){

// không truyền đối số thứ hai đểsử dụng giá trị mặc định

ret = sum(a); cout <<“sum = ” << ret << endl;

return 0;}// function returning the sum of two

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

{int a = 100, b = 200, ret;

// gọi hàm để lấy tổngret = sum(a, b);

cout <<“sum = ” << ret << endl;

// gọi hàm lần nữa để lấy tổng

// function returning the sum of two numbersint sum(int num1, int num2){

return num1 + num2;}

Kết quả:sum = 300sum = 120

4/21/2015

24

Nạp chồng hàm (C++)

�Đây là kỹ thuật cho phép sử dụng cùng một tên gọi cho các

hàm “giống nhau” nhưng trên các kiểu dữ liệu đối số hoặc số các

đối số khác nhau.

Ví dụ: 1: int max(int a, int b) { return (a > b) ? a: b ; }

2: float max(float a, float b) { return (a > b) ? a: b ; }

3: char max(char a, char b) { return (a > b) ? a: b ; }

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

3: char max(char a, char b) { return (a > b) ? a: b ; }

4: long max(long a, long b) { return (a > b) ? a: b ; }

5: double max(double a, double b) { return (a > b) ? a: b ; }

�Khi gọi hàm, dựa vào đối số truyền vào � gọi hàm tương ứng:

max(3, 5) � gọi hàm 1 max(3.5, 4.5) � gọi hàm 5

max(‘a’, ‘b’)� gọi hàm 3

max(3, 3.5) � k có hàm tương ứng (kiểu int và double)

4/21/2015

25

Hàm mẫu (C++)

� Khi nạp chồng hàm, nhiều hàm có thể cùng định nghĩa. Ví

dụ như hàm max nêu trên.

� Với những trường hợp trên, C++ cho phép định nghĩa hàm

mẫu với kiểu tổng quát.

� Quy tắc định nghĩa hàm mẫu như hàm thông thường nhưng

bổ sung thêm từ khóa template đằng trước và các tham số

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

bổ sung thêm từ khóa template đằng trước và các tham số

mẫu bên trong dấu <>:

� template <template-parameters> function-declaration

�- Ví dụ:template <class Type> Type max(Type a, Type b){ return (a > b) ? a: b ; }c = max<int>(10, 20);d = max<double>(5.0, 3.0);

4/21/2015

26

Hàm đệ qui

� Một hàm gọi đến chính nó gọi là hàm là đệ qui.

� Đệ qui là cách viết rất gọn, dễ viết và đọc chương trình

� Hàm đệ qui được gọi rất nhiều lần, trong mỗi lần chạy chương trình

sẽ tạo nên một tập biến cục bộ mới trên ngăn xếp độc lập với lần

chạy trước đó, từ đó dễ gây tràn ngăn xếp.

� Nếu bài toán có thể giải được bằng phương pháp lặp thì không nên

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

� Nếu bài toán có thể giải được bằng phương pháp lặp thì không nên

dùng đệ qui

� Ví dụ: tính n!

double gt(int n){

if (n==0) return 1;

else return gt(n-1)*n;

}

4/21/2015

27

Quy tắc về phạm vi

� Phạm vi của một tên là phần chương trình bên trong đó tên có thể

được sử dụng

� Những qui tắc quyết định một đoạn mã lệnh có thể truy xuất đến

một đoạn mã lệnh hay dữ liệu khác hay không

int y = 38;

void main( ){

int z=47; Phạm vi biến y

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

int z=47;

while(z<400)

{

int a = 90;

z += a++;

z++;} y = 2 * z;

}

Phạm vi biến a

Phạm vi biến z

Phạm vi biến y

4/21/2015

28

Biến cục bộ

� Được khai báo bên trong một hàm hay một khối lệnh {�}

� Các biến chỉ tồn tại trong phạm vi hàm hoặc khối nơi nó được

khai báo và định nghĩa. Chúng được cấp phát lúc khai báo và bị

hủy lúc ra khỏi hàm hoặc khối (biến tự động)

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

� Các biến cục bộ cùng tên của các hàm khác nhau không có liên

quan gì tới nhau

� Tham số của các hàm cũng được xem như biến cục bộ.

4/21/2015

29

Ví dụ: Biến cục bộ

main(){

int i=4; /* i ñịnh nghĩa trong hàm main */

int j=10; i++;

if (j > 0) {

printf("i is %d\n",i);

}

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

}

if (j > 0){

int i=100; // 'i' ñược ñịnh nghĩa cục bộ trong khối

printf("i is %d\n",i);

} /* 'i' (giá trị 100) bị hủy ở ñây */

printf("i is %d\n",i); /* 'i' (giá trị 5) của hàm main */

}

4/21/2015

30

Biến toàn cục

�Được khai báo bên ngoài tất cả các hàm

�Sử dụng được cho mọi hàm

�Nhiều hàm sử dụng chung một số biến thì có thể sử dụng biến

ngoài để biểu diễn một cách thuận lợi và hiệu quả hơn dùng một danh

sách đối dài dằng dặc cho các hàm.

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

sách đối dài dằng dặc cho các hàm.

�Tồn tại đến trong suốt thời gian chạy chương trình

�Trong trường hợp chương trình có nhiều tệp mã nguồn, biến toàn

cục chỉ cần khai báo ở một tệp nguồn nào đó, còn các hàm trong các

tệp mã nguồn khác mà muốn sử dụng thì chỉ việc khai báo biến tương

tự và thêm từ khóa extern phía trước

4/21/2015

31

Biến toàn cục

in file1:

extern int sp;

extern double val[];

void push(double f) { ... }

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

double pop(void) { ... }

in file2:

int sp = 0;

double val[MAXVAL];

4/21/2015

32

Biến tĩnh (static)

�Biến tĩnh có thể là biến cục bộ hoặc biến tổng thể.

�Biến tĩnh trong là cục bộ đối với hàm chứa nó cũng như biến tự

động (cục bộ), nhưng khác một điểm, chúng vẫn tồn tại sau mỗi lần

gọi hàm mà không bị hủy đi như biến tự động.

�Biến tĩnh ngoài có phạm vi tác dụng từ khi được khai báo tới hết tệp

chương trình, không có tác dụng đối với các tệp khác

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

chương trình, không có tác dụng đối với các tệp khác

�Khai báo: static kiểu_dữ_liệu tên_biến.

�Khai báo static cũng có thể được áp dụng cho hàm. Thông thường,

tên hàm là toàn cục, mọi phần của chương trình đều gọi được. Tuy

nhiên, nếu một hàm được khai báo static, thì hàm chỉ có tác dụng bên

trong tệp chứa nó, không gọi được từ các phần chương trình ở các

tệp khác.

4/21/2015

33

Biến tĩnh (static)

int i = 1; // I là biến toàn cục

void ham(){

static int lanthu = 0; // biến cục bộ tĩnh

lanthu++;

i = 2 * i;

cout << "Hàm chạy lần thứ " << lanthu << ", i = " << i ;

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

cout << "Hàm chạy lần thứ " << lanthu << ", i = " << i ;

}

main(){

ham(); // Hàm chạy lần thứ 1, i = 1

ham(); // Hàm chạy lần thứ 2, i = 2

ham(); // Hàm chạy lần thứ 3, i = 4

}

4/21/2015

34

Biến thanh ghi (register)

�Để tăng tốc độ tính toán C++ cho phép một số biến được đặttrực tiếp vào thanh ghi thay vì ở bộ nhớ.

� Khai báo bằng từ khoá register đứng trước khai báo biến.

�Khai báo này chỉ có tác dụng đối với các biến có kích thước

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

�Khai báo này chỉ có tác dụng đối với các biến có kích thướcnhỏ như biến char, int.

�Ví dụ: register char c; register int dem;

4/21/2015

35

Các hàm trong chương trình có nhiều tập tin

�Các hàm cũng có thể được định nghĩa là static hoặcextern

�Các hàm tĩnh (static) chỉ được nhận biết bên trongtập tin chương trình và phạm vi của nó không vượt

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

ra khỏi tập tin chương trìnhstatic kiểu_trả_về_hàm tên_hàm (ds_tham_số);

�Hàm ngoại (external) được nhận biết bởi tất cả cáctập tin của chương trìnhextern kiểu_trả_về_hàm tên_hàm (ds_tham_số);

4/21/2015

36

Các chỉ thị tiền xử lý #include

�Ghép nội dung các tệp đã có khác vào chương trình trước khi dịch�Các tệp này chứa khai báo nguyên mẫu của các hằng, biến, hàm � có sẵn trong C/C++ hoặc các hàm do lậptrình viên tự viết.

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

trình viên tự viết.1: #include <tệp>2: #include “đường dẫn\tệp”�Dạng khai báo 1 cho phép C++ ngầm định tìm tệp tại thưmục định sẵn�Dạng khai báo 2 cho phép tìm tệp theo đường dẫn, nếukhông có đường dẫn sẽ tìm trong thư mục hiện tại

4/21/2015

37

Các chỉ thị tiền xử lý #define

�Bộ tiền xử lý sẽ tìm trong chương trình và thay thế bất kỳvị trí xuất hiện nào của tên_macro bởi xâu kí tự.� Sử dụng macro để định nghĩa các hằng hoặc thay cụmtừ này bằng cụm từ khác dễ nhớ hơn

#define Tên_macro Xâu_ký_tự

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

#define Tên_macro Xâu_ký_tựVí dụ:#define MAX 100 // thay MAX bằng 100#define max(A,B) ((A) > (B) ? (A): (B))

4/21/2015

38

Các chỉ thị tiền xử lý #define

Chú ý: �Tên macro phải được viết liền với dấu ngoặc của danhsách đối. Ví dụ không viết max (A,B).�#define bp(x) (x*x) viết sai vì bp(5) đúng nhưngbp(a+b) sẽ thành (a+b*a+b) (tức a+b+ab).

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

bp(a+b) sẽ thành (a+b*a+b) (tức a+b+ab).�#define max(A,B) (A > B ? A: B) là sai� Luôn bao các đối bởi dấu ngoặc.

4/21/2015

39

Các chỉ thị biên dịch có điều kiện #if, #ifdef, #ifndef

Chỉ thị:

#if (điều kiên) dãy lệnh � #endif

#if (điều kiện) dãy lệnh � #else dãy lệnh � #endif,

�Các chỉ thị này giống như câu lệnh if, mục đích của nólà báo cho chương trình dịch biết đoạn lệnh giữa #if (điều

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

là báo cho chương trình dịch biết đoạn lệnh giữa #if (điềukiện ) và #endif chỉ được dịch nếu điều kiện đúngChỉ thị:

#ifdef và #ifndef

#ifdef được hiểu là nếu tên đã được định nghĩa thì dịch#ifndef được hiểu là nếu tên chưa được định nghĩa thìdịch

4/21/2015

40

Các chỉ thị biên dịch có điều kiện #if, #ifdef, #ifndef

� #ifdef và #ifndef : có ích khi chèn các tệp thư viện vàođể sử dụng. Một tệp thư viện có thể được chèn nhiều lầntrong văn bản do vậy nó có thể sẽ được dịch nhiều lần, điều này sẽ gây ra lỗi vì các biến được khai báo nhiềulần

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

lần