BÀI 1 MỞ ĐẦU 1 CHƯƠNG 2 1 CHƯƠNG 1 Chương 2 BIỂU THỨC (Expressions) Dữ liệu (data) là tất cả những gì được máy tính xử lý Xét về phương diện điện tử thì máy tính chỉ hiểu các thông tin biểu diễn dướ[.]
Trang 1CHƯƠNG 2
(Expressions)
Trang 2 Dữ liệu (data) là tất cả những gì được máy tính xử lý
Xét về phương diện điện tử thì máy tính chỉ hiểu các thông tin biểu diễn dưới dạng mã nhị phân.
Về phương diện ngôn ngữ bậc cao thì dữ liệu đã được
khái quát hóa thành các kiểu dữ liệu và ta không cần quan tâm đến biểu diễn chi tiết trong máy tính của các kiểu dữ liệu.
Một ngôn ngữ lập trình khác nhau sẽ có kiểu dữ liệu
và cú pháp khác nhau.
2 Kiểu dữ liệu(Data type)
Trang 3Trong một ngôn ngữ lập trình, một dữ liệu bao giờ cũng thuộc về một kiểu dữ liệu nhất định.
Các thuộc tính của một kiểu dữ liệu bao gồm:
Tên kiểu dữ liệu.
Miền giá trị.
Kích thước lưu trữ.
Tập các phép toán tác động lên kiểu dữ liệu.
2 Kiểu dữ liệu(Data type) -tt
Trang 4Các kiểu dữ liệu cơ sở:
−Ký tự
−Số nguyên
−Số thực
−Kiểu liệt kê
Kích thước và phạm vi của những kiểu dữ liệu này
có thể thay đổi tùy theo loại CPU và trình biên dịch
2 Kiểu dữ liệu(Data type) -tt
Trang 52.1 Kiểu số nguyên
Từ khóa Phạm vi Kích
thước
Ghi chú
char -128 127 1 byte Có thể dùng như số nguyên
1 byte có dấu hoặc kiểu kí tự.
int -32768 32767 2 bytes Số nguyên
short int -32768 32767 2 bytes Số nguyên ngắn Có thể viết
tắt là short.
2147483647
4 bytes Số nguyên dài
unsigned char 0 255 1 byte Số nguyên 1 byte không dấu
hoặc kí tự
unsigned int 0 65535 2 bytes Có thể gọi tắt là unsigned.
unsigned long 0 4294967295 4 bytes
Trang 6Cách biểu diễn số nguyên dưới dạng số Hexa
Ngoài cách viết dưới dạng thập phân, C++ còn quy ước cho phép viết số nguyên dưới dạng số bát phân (hệ đếm 8) bằng cách thêm 0 đầu, hoặc dưới dạng thập lục phân (hệ đếm 16) bằng cách thêm 0x
Trang 7Hằng số nguyên có định trước kiểu
Đôi lúc chúng ta muốn ghi các hằng số với kiểu được định trước một cách tường minh để đảm bảo độ chính
xác bằng cách ghi thêm một kí tự vào cuối dãy số: L
cho kiểu long , U cho kiểu unsigned int và UL cho kiểu
unsigned long.
Ví dụ:
•52000U hằng số nguyên theo kiểu unsigned int.
•123456789L hằng số nguyên theo kiểu long.
•012345L hằng số nguyên viết dưới dạng số hệ 8, kiểu long.
Trang 8Ghi chú
Khi thực hiện các phép tính trên số nguyên, cần hết sức thận trọng xem các phép toán đó có cho kết quả vượt quá phạm vi biểu diễn của nó không Chẳng
hạn, với a và b là dữ liệu kiểu int, khi đó hai câu
lệnh sau:
a = 80;
b = (a*500)/200;
cho kết quả sai giá trị của b, vì a*500 = 40000 vượt
quá phạm vi của int
Tuy nhiên ta có thể viết:
b = (a*500L)/200;
Trang 92.2 Kiểu số thực
• Một giá trị kiểu số thực là một phần tử của tập các
số thực mà ta có thể biểu diễn được trên máy
• Có hai cách ghi hằng số thực:
Cách 1: Dạng viết thập phân bình thường, trong đó
dấu phẩy được thay bằng dấu chấm:
2.12; 4.0; -125.09; 235.55
Cách 1: Dạng viết có phần mũ hay còn gọi dạng
viết khoa học Gồm hai phần: phần định trị và
phần mũ viết sau chữ E để biểu diễn số mũ của cơ
số 10.
Trang 10• -0.001234 = -1.234*10 -3 được viết là -1.234E-03
Lưu ý: Phần định trị và phần mũ đều có thể có dấu đi
kèm, chúng được viết liền nhau, không có dấu cách
ở giữa.
Trang 11Trong C++ cho phép sử dụng các kiểu số
Lưu ý:
Cột phạm vi giá trị chỉ miền biến thiên trị tuyệt đối của số Chẳng hạn với số x kiểu float thì x có trị tuyệt đối nằm trong khoảng từ 3.4*10 -38 đến 3.4*10 38 Nếu > 3.4*10 38 thì
không biểu diễn x trong máy được , còn nếu < 3.4*10 -38 thì
x được coi là bằng không.
Trang 12Cách viết đúng các hằng số thực
trị nếu có phần mũ
• 0.02e-3 chấp nhận dùng chữ e
Trang 13Bảng tóm tắt các Kiểu dữ liệu
(Data type)
Trang 143 Định danh (Identifier Name)
Trong C/C++, tên biến, hằng, hàm,… được gọi là định danh
Những định danh này có thể là 1 hoặc nhiều ký
tự Ký tự đầu tiên phải là một chữ cái hoặc dấu _ (underscore), những ký tự theo sau phải là chữ cái, chữ số, hoặc dấu _
C/C++ phân biệt ký tự HOA và thường.
Định danh không được trùng với từ khóa
(keywords)
Trang 16Câu l nh ệ
Nhằm ra lệnh cho máy thực hiện;
Mỗi câu lệnh sẽ có cú pháp và ý nghĩa riêng;
Lệnh được kết thúc bằng “ ; “ (không phải hết
Trang 17Bao gồm một biểu thức đơn giản và theo sau là
dấu chấm phẩy Các biểu thức có thể là mối quan
hệ giữa các phép toán, gọi hàm hoặc chỉ có dấu chấm phẩy Chẳng hạn, ta có các lệnh biểu thức sau:
Trang 18• Lệnh kép bao gồm một số lệnh riêng lẻ được gói
trong cặp dấu { … } Những lệnh riêng lẻ này có thể là lệnh biểu thức, lệnh kép hay lệnh điều khiển Khác với lệnh biểu thức, lệnh kép không được kết thúc bởi dấu chấm phẩy Chẳng hạn:
Trang 19Lệnh điều khiển bao gồm các câu lệnh như:
1 Lệnh rẽ nhánh: if
2 Lệnh Lựa chọn: switch
3 Lệnh lặp: for, while, do… while
(Phần này sẽ giải thích rõ trong chương 3)
Câu l nh ệ điều khi n ể
Trang 20Câu lệnh Gán
Phép gán: dấu “=“ dùng để gán giá trị của
một biểu thức cho một biến đã được khai báo.
Trang 225 Biến (Variables)
Biến là định danh của một vùng trong bộ nhớ dùng để giữ một giá trị mà có thể bị thay đổi bởi chương trình
Tất cả biến phải được khai báo trước khi sử dụng
Trang 23Cách khai báo
type variableNames ;
−type: là một trong các kiểu dữ liệu hợp lệ
−variableNames: tên của một hay nhiều
biến phân cách nhau bởi dấu phẩy
Trang 24Ngoài ra, ta có thể vừa khai báo vừa khởi tạo giá trị ban đầu cho biến:
type varName1=value, ,varName_n = value;
Ví dụ:
float mark1, mark2, mark3, average = 0;
Khởi tạo Biến
Trang 25Việc khai báo biến nhằm ba công việc chính:
dành vùng bộ nhớ để sử dụng
đặt tên vùng đó bởi một tên gọi
qui định kiểu dữ liệu cho biến.
Ngay trên dòng khai báo ta có thể gán cho biến một giá trị Việc làm này gọi là khởi đầu cho biến
Ý nghĩa của Biến
Trang 26Phạm vi của biến
Biến cục bộ (local variables)
• Là những biến được định nghĩa ở trong một
hàm hoặc một khối lệnh.
• Được cấp phát bộ nhớ tự động (Auto)
• Tồn tại (life time) từ khi định nghĩa cho đến
khi kết thúc hàm hoặc khối lệnh
Trang 28int sum(int from, int to)
Trang 29Phạm vi của biến
Biến toàn cục (global variables)
• Là những biến được định nghĩa ở ngoài tất cả các hàm.
• Được cấp phát bộ nhớ tự động (Auto)
• Tồn tại (life time) từ khi định nghĩa cho đến khi kết thúc chương
trình
• Biến toàn cục có thể được truy xuất mọi nơi trong chương trình
• Không gian bộ nhớ cho các biến toàn cục được dành riêng trước khi sự thực hiện của chương trình bắt đầu, nhưng ngược lại không gian bộ nhớ cho các biến cục bộ được cấp phát ở thời điểm thực hiện chương trình.
Trang 348 Hằng chuỗi ký tự (string constants)
Trang 35Hằng ký tự đặc biệt
(escape sequences)
Trang 3811 Chuyển đổi kiểu trong câu lệnh gán
• Vế phải và vế trái của lệnh gán phải cùng kiểu
Trang 3911 Chuyển đổi kiểu trong câu lệnh gán
-tt
• Khi chuyển đổi từ kiểu dữ liệu có miền giá trị nhỏ sang kiểu dữ liệu có miền giá trị lớn
hơn:charintlongfloatdouble, thì việc chuyển đổi kiểu này là không mất mát thông tin
• Khi chuyển đổi từ kiểu dữ liệu có miền giá trị lớn sang kiểu dữ liệu có miền giá trị nhỏ
hơn:doublefloatlongintchar, thì việc chuyển đổi kiểu này là mất mát thông tin
Trang 4112 Toán tử số học
(arithmetic operators) –tt
Khi tử số và mẫu số của phép chia là số nguyên thì đó là phép chia nguyên nên phần dư của phép chia nguyên bị cắt bỏ
Ví dụ:
5/2 cho kết quả là 2
Toán tử lấy phần dư % (modulus operator) chỉ
áp dụng với số nguyên.
Trang 4414 Toán tử ++ và (increment and
decrement operators)
Toán tử tăng (++) và toán tử giảm ( ) có tác dụng làm tăng hoặc giảm 1 giá trị lưu trong biến
Ví dụ:
a++; //tương đương với a+=1; và a=a+1
a ; //tương đương với a-=1; và a=a-1
Trang 45Toán tử ++/ đặt trước toán hạng, hành động
tăng/giảm trên toán hạng được thực hiện trước, sau đó giá trị mới của toán hạng sẽ tham gia định trị của biểu thức
Trang 46Toán tử ++/ đặt sau toán hạng, giá trị trong toán
hạng được tăng/giảm sau khi đã tính toán
Ví dụ
b=3;a=b++;
Kết quả: a chứa giá trị 3, b chứa giá trị 4
Hậu tố (postfix)
Trang 48• Khi các toán tử số học xuất hiện trong một biểu thức, thì độ ưu tiên thực hiện như sau:
Trang 4915 Toán tử quan hệ & luận lý (relational & logical operators)
• Toán tử quan hệ được định trị là true hoặc false
Trang 51• Độ ưu tiên của toán tử quan hệ và luận lý:
Trang 52Ví dụ biểu thức:
(10>9 && 8!=7) || (6<=5 || 5>4)
Được định trị như sau:
Ví dụ
Trang 5316 Toán tử ? (? operator)
Toán tử ? là một toán tử ba ngôi do đó phải có ba toán hạng
Dạng tổng quát của toán tử ? là:
Với Exp1, Exp2, và Exp3 là các biểu thức
Trang 5517 Toán tử sizeof
• sizeof là toán tử một ngôi mà trả về số byte
của kiểu dữ liệu chiếm trong bộ nhớ Tùy môi trường (hệ điều hành, loại CPU, ) mà mỗi kiểu dữ liệu có số byte khác nhau
• Cú pháp:
sizeof ( operand )
thức
Trang 5618 Toán tử dấu phẩy
(comma operator)
• Toán tử comma buộc các biểu thức cùng với nhau
• Biểu thức bên trái của toán tử comma luôn
luôn được định trị như void, biểu thức bên
phải được định trị và trở thành giá trị của biểu thức
• Dạng tổng quát của toán tử comma:
( exp_1, exp_2, , exp_n )
Trang 57• Các biểu thức được định trị từ trái sang phải, biểu thức cuối cùng (exp_n) được định trị và trở thành giá trị của toàn bộ biểu thức
Trang 5819 Độ ưu tiên của các toán tử
Trang 5920 Biểu thức (expressions)
• Một biểu thức trong C/C++ là sự kết hợp của các thành phần: toán tử, hằng, biến, và hàm có trả về giá trị
• Thứ tự định trị của biểu thức tùy thuộc vào độ
ưu tiên của các toán tử
• Để biểu thức rõ ràng và thực hiện việc định trị đúng, nên dùng cặp dấu ngoặc tròn () bao quanh các biểu thức con của biểu thức
Trang 60result = x * y - z % 10 + w/2;
Định trị biểu thức sau:
Trang 6121 Chuyển kiểu trong biểu thức
• Khi các hằng và biến của những kiểu khác nhau tồn tại trong một biểu thức, giá trị của chúng phải được chuyển thành cùng kiểu trước khi các phép toán giửa chúng được thực hiện
• Trình biên dịch sẽ thực hiện việc chuyển kiểu (convert) tự động đến kiểu của toán hạng có kiểu lớn nhất Việc chuyển kiểu này gọi là thăng cấp kiểu (type promotion)
Trang 64Ví dụ
Trang 65result = ( float ) 7/2 ;
result = 7 /( float ) 2 ;
result = ( float ) 7 /( float ) 2 ;
result = float ( 7 )/ float ( 2 );
Các cách viết sau đây cho cùng kết quả: