Bài giảng Ngôn ngữ lập trình C và C+ - Bài 4: Hàm và cấu trúc chương trình - Đỗ Đăng Khoa

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ể

đượ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ĩ

pdf 40 trang yennguyen 2980
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ lập trình C và C+ - Bài 4: Hàm và cấu trúc chương trình - Đỗ Đăng Khoa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Ngôn ngữ lập trình C và C+ - Bài 4: Hàm và cấu trúc chương trình - Đỗ Đăng Khoa

Bài giảng Ngôn ngữ lập trình C và C+ - Bài 4: Hàm và cấu trúc chương trình - Đỗ Đăng Khoa
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í
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ập
hợ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
chương trình rõ ràng với hình thức lập trình theo
module 
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
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
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
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ẫu
hà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
- 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;
else
result = 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ột
hà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ệm
vụ đã đị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
chươ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ới
tê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
tham số yêu cầu
← Trở về câu lệnh tiếp
theo
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, cho
dù 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
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 
using namespace std;
// Khai báo hàm
int 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ất
ret = max(a, b);
cout <<"Max value = “ << ret;
return 0;
}
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
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
 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
 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 
using namespace std;
// Khai báo hàm
void 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 đổi
swap (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ể đổi
giá 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
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 
using namespace std;
// Khai báo hàm
void 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 đổi
swap (&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ị cho
nhau
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
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
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 
using namespace std;
// Khai báo hàm
int 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 = 10
Hai biến c và d đã được đổi
giá 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 đổi
swap (c, d);
cout <<“c = ” << c;
cout <<“ d = ” << d;
return 0;
}
Khi truyền tham số c và d vào
hàm, hai biến tham chiếu a, b
tương ứng với tham số sẽ được
tạo ra và tham chiếu đến hai biến
c, d. Việc hàm thực hiện thay đổi
giá 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
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 
using namespace std;
// Khai báo hàm
int 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ổng
ret = sum(a, b);
cout <<“sum = ” << ret << endl;
// gọi hàm lần nữa để lấy tổng
numbers
int sum(int num1, int num2)
{
return num1 + num2;
}
Kết quả:
sum = 300
sum = 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
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
mẫu bên trong dấu :
 template function-declaration
- Ví dụ:
template Type max(Type a, Type b)
{ return (a > b) ? a: b ; }
c = max(10, 20);
d = max(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
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
while(z<400)
{ 
int a = 90; 
z += a++; 
z++;
} 
y = 2 * z; 
} 
Phạm vi biến a
Phạm vi biến z
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
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
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
}
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 đặt
trự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
nhỏ 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ặc
extern
Các hàm tĩnh (static) chỉ được nhận biết bên trong
tậ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ình
static 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ác
tập tin của chương trình
extern 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ập
trình viên tự viết.
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
1: #include 
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ếu
khô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ụm
từ 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
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 danh
sách đối. Ví dụ không viết max (A,B).
#define bp(x) (x*x) viết sai vì bp(5) đúng nhưng
bp(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
#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
kiện ) và #endif chỉ được dịch nếu điều kiện đúng
Chỉ 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ần
trong 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ều
lần
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI

File đính kèm:

  • pdfbai_giang_ngon_ngu_lap_trinh_c_va_c_bai_4_ham_va_cau_truc_ch.pdf