Exercise 21 Lập Trình C – Learn C The Hard Way


Exercise 21: Adcanced Data Types and Flow Control

Trong bài này chúng ta sẽ được học vềcác loại dữ liệu trong C và các cấu trúc điều khiển luồng (flow control structures) mà bạn có thể sử dụng. Bài này chúng ta sẽ không hề viết một đoạn code nào.

Sau khi học xong bài này, các bạn đã có khá đầy đủ kiến thức về lập trình C, bắt đầu đi tung hoành được rồi.

Available Data Types

  • int  Kiểu dữ liệu số nguyên, mặc định là 32 bit (số bit phụ thuộc vào kiến trúc CPU và compiler)
  • double  Kiểu dữ liệu số thực (dấu chấm động) với cấp chính xác kép.
  • float  Kiểu dữ liệu số thực (dấu chấm động) với cấp chính xác đơn.
  • char  Kiểu kí tự (chứa mã ASCII của một ký tự 8 bit).
  • void  Đây là kiểu “no type” nghĩa là không có kiểu gì cả, một hàm kiểu void sẽ không trả về bất cứ cái gì, hay một con trỏ không có kiểu.
void *thing = NULL;
  • enum  Kiểu liệt kê (enumerated type), đây là một kiểu gợi nhớ do người dùng tự định nghĩa, và nó sẽ chuyển các phần tử thành số integer.

Type Modifiers

  • unsigned  Khi phối hợp với một kiểu dữ liệu sẽ cho ra một kiểu không dấu. Đây là kiểu integer không dấu.
unsigned int l_variable_int = 10;
  • signed  Đây là kiểu có dấu (ngược với unsigned).
  • long  Đây là kiểu số nguyên nhưng kích thước lớn hơn integer, mặc định 8 byte.
  • short  Đây là kiểu số nguyên ngắn kích thước nhỏ hơn integer, mặc định 2 byte.

Type Qualifiers

  • const  Chỉ ra rằng đây mà một biến không thể thay đổi giá trị, biến hằng.
  • volatile  Đây là kiểu dữ liệu thường dùng trong lập trình nhúng, nói cho chúng ta biết rằng, biến có kiểu volatile này có thể thay đổi giá trị đột ngột trong quá trình thực thi chương trình (do một tiến trình nào đó, như ngắt, …)
  • register  Bắt compiler giữ những biến này trong một thanh ghi (register), và compiler có thể lờ bạn. Ngày nay thì compiler “thông minh” hơn rất nhiều và dễ dàng tìm ra nơi để lưu biến, vì vậy bạn phải chắc chắn rằng việc dùng biến register để làm tăng tốc độ chương trình.

Type Conversion

Khi bạn thực hiện phép cộng của một biến integer và một biến double thì kết quả sẻ là một biến gì? Câu trả lời là double. Và C tự làm điều này.

Chúng ta có danh sách sau để nói lên sự ưu tiên khi chúng ta thực hiện một biểu thức mà các số hạng gồm nhiều kiểu dữ liệu. Chúng ta sắp xếp theo thứ tự ưu tiên.

  1. long double
  2. double
  3. float
  4. int (nhưng chỉ char và short int)
  5. long

Ví dụ chúng ta có biểu thức sau:

long + char – int * double

Thì tất cả sẽ được chuyển sang double vì double có ưu tiên cao hơn.

(double)long – (double)char – (double)int * double

Khi chúng ta muốn tự ép kiểu thì  chúng ta có thể dùng như sau:

int variable_int = 100;
printf("%d", sizeof((double)variable_int)); 
// kết quả là: 8 (kích thước của biến double)

Type Sizes

Chúng ta có một thư viện (file header) stdint.h nơi mà C đã define rất nhiều kiểu dữ liệu (gợi nhớ) để cho lập trình viên cảm thấy dễ dàng hơn trong việc lập trình và quản lý các biến.

  • int8_t   8-bit integer có dấu (signed integer)
  • uint8_t  8-bit integer không dấu (unsigned integer)
  • int16_t  16-bit integer có dấu
  • uint16_t  16-bit integer không dấu
  • int32_t  32-bit integer có dấu
  • uint32_t  32-bit integer không dấu
  • int64_t  64-bit integer có dấu
  • uint64_t  64-bit integer không dấu

Những kiểu trên này để có chung định dạng là (u)int(BITS), có u đứng trước thì là unsigned và BITS là kích thước biến tính theo bit. Và chúng ta có một vài macro rất hay nữa:

  • INT(N)_MAX  Số dương lớn nhất của biến integer N bit có dấu, ví dụ INT16_MAX
  • INT(N)_MIN  Số âm nhỏ nhất của biến integer N bit có dấu, ví dụ INT16_MIN
  • UINT(N)_MAX  Số dương lớn nhất của biến integer N bit có dấu, ví dụ UINT16_MAX. Bởi vì đây là số unsigned nên giá trị nhỏ nhất là 0.

Còn rất nhiều macro trong file stdint.h, các bạn có thể tìm thêm trên internet.

Available Operators

Dưới đây là danh sách các loại toán tử:

  • binary  Toán tử 2 toán hạng, ví dụ: X + Y
  • unary  Toán tử 1 toán hạng, ví dụ: -X, &Y
  • prefix  Tiền tố, ví dụ: ++X
  • postfix  Hậu tố, ví dụ: X–
  • ternary  Toán tử 3 toán hạng: X ? Y : Z

Math Operators

Chúng ta có một số phép toán về toán học như sau:

  • ()  Gọi hàm
  • * (binary)  Phép nhân
  • / Phép chia
  • + (binary) Phép cộng
  • + (unary) Số dương
  • ++ (postfix) Đọc say đó tăng giá trị
  • ++ (prefix) Tăng giá trị sau đó đọc
  • (postfix) Đọc say đó giảm giá trị
  • (prefix) Giảm giá trị sau đó đọc
  • (binary) Phép trừ
  • – (unary) Số âm

Data Operators

Chúng ta thường sử dụng các phép toán sau để truy cập dữ liệu:

  • -> Struct pointer access
  • . Struct value access
  • [] Array index
  • sizeof Kích thước của một kiểu dữ liệu hay một biến
  • & (unary) Phép lấy địa chỉ
  • * (unary) Phép lấy giá trị của con trỏ

Logic Operators

Những phép toán logic chúng ta hay dùng:

  • != Không bằng
  • < Nhỏ hơn
  • <= Nhỏ hơn hoặc bằng
  • == Bằng (không phải gán)
  • > Lớn hơn
  • >= Lớn hơn hoặc bằng

Bit Operators

Ngoài những phép toán logic như trên thì chúng ta còn một số phép toán để xử lý bit như sau:

  • << Dịch trái
  • >> Dịch phải
  • ^ Phép XOR
  • | Phép OR
  • ~ Đảo bit

Boolean Operators

  • ! Not
  • && And
  • || Or
  • ?: Phép 3 toán tử như trình bày ở trên

Assignment Operators

Dưới đây là một số phép gán chúng ta có thể sử dụng:

  • = Phép gán bằng
  • %= Modulus assign
  • &= Bitwise and assign
  • *= Multiply assign
  • += Plus assign
  • -= Minus assign
  • /= Divide assign
  • <<= Shift left, assign
  • >>= Shift right, assign
  • ^= Bitwise XOR, assign
  • |= Bitwise OR, assign

Available Control Structures

Chúng ta có những cấu trúc điều khiển như: do-while, break, continue, goto.

Chúng ta đã có một kiến thức rất rất tổng quát rồi. Hẹn gặp lại bài sau, chúng ta sẽ đi từ từ vào cấu trúc dữ liệu và giải thuật.

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s