Tư tưởng quan trọng nhất là viết chương trình sao cho khi sửa đổi, hay phải thêm tính năng thì chỉ phải sửa 1 (ít nhất) chỗ.
Overflow
Mỗi biến có kiểu dữ liệu, qui định phạm vi giá trị của biến đấy. Khi bị vượt ngưỡng ta sẽ có hiện tượng overflow. Ví du đoạn chương trình sau dễ gây ấn tượng là một vòng lặp vô hạn nhưng thực tế lại dừng khi biến count vượt ngưỡng bé nhất của kiểu char là -128 (thành giá trị 127)
char count = 0;
while (count <= 10){
printf("%d ",count);
count = count - 1;
}
Logical Shift <> Arithmetic Shift
Thứ tự thực hiện các hàm
Lệnh sau ta không chắc chắn hàm nào sẽ được thực hiện trước
a = func1() + func2() * func3();
nên nếu các hàm này có liên hệ với nhau, các hàm cần phải thực hiện theo thứ tự func1 -> func2() -> func3() thì phải viết như sau
tmp1 = func1();
tmp2 = func2();
tmp3 = func3();
a = tmp1 + tmp2 + tmp3;
Khai báo static
int func(int x) {
static int n = 5;
khác hẳn với
int func(int x) {
static int n;
n = 5;
Trường hợp trên: gọi hàm func() lần đầu tiên, giá trị của n được khởi tạo bằng 5, và có thể thay đổi trong những lần gọi tiếp theo
Trường hợp dưới: lần nào gọi hàm func() thì giá trị của n cũng được khởi tạo bằng 5
Return
Trong hàm chỉ nên có duy nhất một lệnh return nằm cuối cùng. Việc này giúp giảm sai sót khi cần bổ sung 1 xử lý vào hàm.
Những lưu ý khác
Không viết dòng lệnh phức tạp, nên tách ra thành những lệnh đơn giản, nhìn vào là hiểu ngay
Thay vì:
i = *line++;
Nên viết:
i = *line;
line++;
Dùng {} sau mỗi lệnh điều khiển if...else, vòng lặp for, while, ... dù chỉ có 1 dòng lệnh nhằm tránh sai sót khi sau này bổ sung thêm dòng lệnh khác
if (a == 1) printf("1");
if (a == 1) {
printf("1");
}