Biểu
thức dạng hỗn hợp & Chuyển đổi kiểu
Một biểu
thức dạng hỗn hợp là một biểu thức mà trong đó các toán hạng của một toán tử
thuộc về nhiều kiểu dữ liệu khác nhau. Những toán hạng này thông thường được
chuyển về cùng kiểu với toán hạng có kiểu dữ liệu lớn nhất. Điều này được gọi
là tăng cấp kiểu. Sự phát triển về kiểu dữ liệu theo thứ tự sau :
char < int <long <float
<double
Chuyển
đổi kiểu tự động được trình bày dưới đây nhằm xác định giá trị của biểu thức:
a. char
và short được chuyển thành int và float được chuyển thành double.
b. Nếu
có một toán hạng là double, toán hạng còn lại sẽ được chuyển thành double,
và kết quả là double.
c. Nếu
có một toán hạng là long, toán hạng còn lại sẽ được chuyển
thành long, và kết quả là long.
d. Nếu
có một toán hạng là unsigned, toán hạng
còn lại sẽ được chuyển thành unsigned và kết quả cũng là unsigned.
e. Nếu
tất cả toán hạng kiểu int, kết quả là int.
Ngoài
ra nếu một toán hạng là long và toán hạng khác là unsigned và giá
trị của kiểu unsigned không thể biểu diễn bằng kiểu long. Do vậy,
cả hai toán hạng được chuyển thành unsigned long.
Sau khi
áp dụng những quy tắc trên, mỗi cặp toán hạng có cùng kiểu và kết quả của mỗi
phép tính sẽ cùng kiểu với hai toán hạng.
Trong
ví dụ trên, trước tiên, ch có kiểu ký tự được chuyển thành integer và
float f được chuyển thành double. Sau đó, kết quả của ch/i được
chuyển thành double bởi vì f*d là double. Kết quả cuối
cùng là double bởi vì các toán hạng lúc này đều là double.
Ép kiểu (Casts)
Thông
thường, ta nên đổi tất cả hằng số nguyên sang kiểu float nếu biểu thức bao gồm
những phép tính số học dựa trên số thực, nếu không thì vài biểu thức có thể mất
đi giá trị thật của nó.Ta xem ví dụ:
int x, y, z;
x = 10;
y = 100;
z = x/y;
Trong
trường hợp này, z sẽ được gán 0 khi phép chia diễn ra và phần thập
phân (0.10) sẽ bị cắt bỏ.
Do đó một
biểu thức có thể được ép thành một kiểu nhất định. Cú pháp chung của cast
là:
(kiểu dữ liệu) biểu thức
Ví dụ,
để đảm bảo rằng biểu thức a/b, với a và b là số nguyên,
cho kết quả là kiểu float, dòng mã sau được viết:
(float) a/b;
Ép kiểu
có thể áp dụng cho các giá trị hằng, biểu thức hay biến, ví dụ:
(int) 17.487;
(double) (5 * 4 / 8);
(float) (a + 7);
Trong
ví dụ thứ hai, toán tử ép kiểu không đạt mục đích của nó bởi vì nó chỉ thực thi
sau khi toàn biểu thức trong dấu ngoặc đã được tính. Biểu thức 5 * 4 / 8
cho ra giá trị là 2 (vì nó có kiểu là số nguyên nên đã cắt đi phần thập
phân), vì vậy, giá trị kết quả với kiểu double cũng là 2.0.
Ví dụ:
int i = 1, j = 3;
x = i / j;
/* x = 0.0 */
x = (float) i/(float) j; /* x = 0.33 */
Đăng nhận xét