The Foundation

Data Types & Sizes

Ở đây chúng ta sẽ bắt đầu với các kiểu dữ liệu cơ bản:

  • Character, dùng cho ký tự, với độ lớn là 1 byte. Các ký tự này được định nghĩa trong character set, ở đây phổ biến nhất là hệ ASCII.
  • Int dùng cho các giá trị số nguyên.
  • Float và Double dùng cho các số thập phân, Double có độ lớn gấp đôi.

Qualifiers - Tiền tố.

  • Short và long để mở rộng hoặc thu hẹp kích cỡ của integer.
  • Signed và unsigned để xác định có dấu hay số nguyên dương.

Constants - Hằng số:

  • Khai báo dạng thập phân, octal, thập lục phân, và cả phần hậu tố để thay đổi kiểu dữ liệu hoạt động.
  • Số thập phân thì có thể sử dụng dạng bình thường hoặc số mũ e.
  • Kiểu dữ liệu mặc định khi sử dụng các giá trị thập phân là double.

Constants

  • Escape Sequences: Bộ các ký tự đặc biệt phục vụ cho một số mục đích nhất định (\n xuống dòng, \t cho tab, \0 cho null).
  • String là chuỗi các ký tự, có ký tự kết thúc là \0 hay null ở cuối.
  • Enum là một set các giá trị số nguyên được gán tên. Ở đây ví dụ dễ hiểu nhất là bản thân C không có kiểu dữ liệu boolean như các ngôn ngữ khác, chúng ta có thể tận dụng enum.

Type Conventions

Chúng ta có 2 dạng ép kiểu: Chủ động và tự động.

  • Đối với ép kiểu tự động, bản thân C sẽ tự chuyển đổi kiểu dữ liệu khi cần thiết. Ví dụ..
  • Chủ động (casting), có cú pháp là … Ví dụ khi sử dụng hàm sqrt…

Operators

  • Binary: Toán tử có 2 toán hạng, cộng, trừ, nhân, chia. Phép chia số nguyên sẽ loại bỏ phần thập phân, phép chia lấy dư không thể được áp dụng vào float hoặc double.
  • Increment và Decrement sẽ thêm hoặc bớt 1 giá trị đối với cái toán hạng mà nó được sử dụng. Chú ý cách sử dụng dưới dạng tiền tố hoặc hậu tố.

Control Flow & Logic

If-Else

Cơ chế kiểm tra điều kiện:

  • Nếu điều kiện trong if là true (khác 0), phần code bên trong sẽ được thực thi.
  • Nếu điều kiện là false, phần điều kiện tiếp theo sẽ được kiểm tra và cứ như vậy cho đến block else (khi tất cả điều kiện đều false).

Switch

Bản chất của switch tương tự như if-else, tuy nhiên nó sẽ check xem nếu biến cần xét matches với các giá trị đã được xác định từ trước. Nếu không thì sẽ thực thi phần code trong default.

Loops

Chúng ta có 2 loại vòng lặp, về bản chất thì chúng ta có thể dùng chuyển đổi qua lại giữa chúng được.

  • while: Test điều kiện lặp trước khi thực thi phần body. Ngoài ra còn có vòng do-while.
  • for: Cấu trúc vòng for phức tạp hơn một tí. Trong đó có 3 phần chính: Khởi tạo biến lặp, điều kiện lặp, step/increment.

Break & Continue

Functions & Program Structure

Function Basics

Hàm là một đoạn code được định nghĩa và có thể tái sử dụng.

Function Prototypes

Việc khai báo hàm giúp cho compiler biết được tên, kiểu dữ liệu trả về và các tham số trước khi nó được sử dụng.

Call by value

  • Khi một giá trị được truyền vào hàm dưới dạng tham số, hàm sẽ nhận được bản copy của giá trị này. Nên khi hàm thực thi xong thì tất cả sẽ bị xóa đi. Chúng ta sẽ nói đến việc làm sao thay đổi trực tiếp giá trị khi truyền vào hàm sau.
  • Đối với mảng, bản chất khi truyền mảng là đang truyền địa chỉ của phần tử đầu tiên, nên mảng hoàn toàn có thể được thay đổi khi truyền vào hàm.

Scope Rules

Phạm vi về cơ bản là khả năng truy cập và tồn tại của biến. Local là biến tồn tại bên trong hàm, được khởi tạo cùng hàm và xóa đi khi hàm kết thúc. Không thể được truy cập từ bên ngoài. Đối với biến toàn cục được định nghĩa bên ngoài hàm (global scope), giữ giá trị giữa các lần gọi hàm (vì không bị xóa đi khi hàm kết thúc), thường dùng cho việc chia sẻ giá trị.

External Variables

Đối với external variables, chúng ta nên phân biệt giữa định nghĩa và khai báo:

  • Định nghĩa là khi biến được tạo nên và được lưu trong bộ nhớ.
  • Khai báo chỉ là cho ta biết tên cũng như kiểu dữ liệu của biến, không có bộ nhớ nào được khởi tạo.

Recursion

Bản chất đệ quy là hàm mà sẽ gọi chính nó, cho đến khi gặp điều kiện dừng thì sẽ dừng hoặc bắt đầu quá trình trả về.

Macro

Bản chất của macro là cơ chế để chúng ta define các giá trị hoặc thậm chí là cả một hàm dưới dạng một cái tên nào đó, những cái tên này sẽ được thay thế bởi phần text tương ứng khi chương trình ở giai đoạn preprocessing (trước khi compile).

Conditional Compilation

Nhờ có cơ chế của macro, chúng ta đến với việc biên dịch có điều kiện nhờ vào các câu lệnh …

Memory & Data Management

Array

Mảng là một tập hợp các giá trị liền kề nhau với cùng 1 kiểu dữ liệu.

Unions