MỤC LỤC
- Các hàng được sắp theo độ ưu tiên giảm dần tức là các toán tử ở hàng trên sẽ có độ ưu tiên hơn các toán tử ở hàng dưới. - Toán tử sizeof dùng để trả về kích cở tính bằng byte của một kiểu dữ liệu (int, float,…) hay một đối tượng dữ liệu (biến, mảng…). - Chú ý: Các lời gọi hàm, các câu lệnh gán lồng nhau và các toán tử tăng, giảm đều có thể tạo ra “hiệu ứng phụ” (hiệu ứng lề) tức là một số biến bị thay đổi do việc tính toán của biểu thức tạo ra.
Các hiệu ứng phụ có thể gây ra các kết quả khác nhau tùy theo từng trình biên dịch C và tùy theo các máy khác nhau.
Khi mà một đặc tả không tìm thấy đối tương ứng hoặc khi kiểu giá trị của đối tương ứng không tương thích với ký tự chuyển dạng thì máy sẽ bị lẫn lộn và có thể đưa ra những kết quả vô nghĩa. Nó đọc thông tin từ thiết bị vào chuẩn (bàn phím), chuyển dịch chúng (thành số nguyên, số thực,…) và lưu trữ vào bộ nhớ theo các địa chỉ mà chúng ta chỉ định. Nếu điều khoản này bị bỏ qua hay giá trị của nó lớn hơn hoặc bằng độ dài dữ liệu vào thì toàn bộ dữ liệu đó sẽ được đọc vào và gán cho địa chỉ tương ứng.
Nếu giá trị của nó nhỏ hơn độ dài dữ liệu vào thì chỉ phần đầu dữ liệu được đọc vào và gán cho địa chỉ tương ứng, phần còn lại sẽ được xem xét bởi các đặc tả và đối tương ứng tiếp theo.
Nếu giá trị của <biến> không rơi vào giá trị nào cả thì <câu lệnh n+1> sau default được thực hiện nếu như có mệnh đề default. Nếu giá trị biến chạy còn thỏa <điều kiện> thì vòng lặp còn tồn tại, tức là <câu lệnh> sẽ được thực hiện. Mỗi lần lặp thì biến chạy sẽ được tăng lên hoặc giảm xuống phụ thuộc vào <biểu thức tăng giảm> và vòng lặp sẽ lặp đi lặp lại cho đến khi giá trị của biến chạy không còn thoả <điều kiện>.
Các đối số trong câu lệnh for có thể được bỏ đi nhưng phải giữ dấu chấm phẩy (;). Chu trình này được thoát ra thường nhờ vào các lệnh break hoặc return có trong vòng lặp. Cú pháp do – while cũng giống như while nhưng phần kiểm tra điều kiện được thực hiện sau khi thực hiện <câu lệnh>.
- Lệnh break cho phép thoát khỏi vòng lặp for, while, do while và switch mà không cần kiểm tra điều kiện. - Khi có nhiều chu trình lồng nhau, câu lệnh break sẽ đưa máy ra khỏi chu trình bên trong nhất chứa nó. Biết số nguyên dương n sẽ là nguyên tố nếu nó không chia hết cho các số nguyên trong khoảng từ 2 đến căn hai của n.
Thuật toán trên sẽ được sử dụng trong chương trình dưới đây để kiểm tra tính nguyên tố của n. - Trong lệnh while và do-while, lệnh continue chuyển điều khiển về phần kiểm tra điều kiện.
Con trỏ cũng là biến nhưng nó lưu địa chỉ của một vùng nhớ nào đó. Khi chúng ta khai báo một biến con trỏ thì biến này tạm thời trỏ đến một vùng nhớ bất kỳ. Nếu chúng ta muốn nó trỏ tới một số byte nào đó trong vùng nhớ thì chúng ta phải cấp phát.
Phép toán lấy địa chỉ: Không dùng được đối với mảng hai chiều (nhưng có thể dùng được đối với mảng hai chiều kiểu nguyên). Vì vậy chúng ta phải dùng con trỏ tạm hoặc biến tạm để làm trung gian cho việc nhập liệu vào mảng. Đọc một giá trị và chứa vào biến trung gian, sau đó ta gán biến này cho phần tử mảng.
Mảng các con trỏ là một mảng mà mỗi phần tử của nó chứa một địa chỉ nào đó. Vì thực chất mảng cũng là con trỏ cho nên ta có thể xem nó như là một con trỏ trỏ tới đối tượng mà đối tượng này cũng là một con trỏ.
Nói cách khác, khi máy gặp một lời gọi hàm ở một chỗ nào đó của chương trình, thì máy sẽ tạm rời chỗ đó và chuyển đến hàm tương ứng. + Khi gặp câu lệnh return hoặc } cuối cùng của thân hàm thì máy sẽ xoá các đối, các biến cục bộ và thoát khỏi hàm để trở về chương trình gọi nó. - Nếu đối của hàm được truyền theo giá trị thì không làm ảnh hưởng gì đến những giá trị của tham số thực được truyền vào từ chương trình chính.
Khi tham số thực truyền vào cho các đối tương ứng thì các đối này sẽ được cấp phát bộ nhớ riêng và chúng sẽ bị xoá trước khi hàm kết thúc. - Khi đối của hàm được truyền theo địa chỉ thì những thay đổi của đối bên trong hàm sẽ làm thay đổi giá trị của tham số thực. Giá trị kiểu int (float, double,…) Biến kiểu int (float, double,…) Địa chỉ kiểu int (float, double,…) Con trỏ kiểu int (float, double,…) Tên mảng một chiều Con trỏ cùng kiểu mảng hoặc khai báo.
Mọi thay đổi giá trị cho biến ngoài bên trong các hàm đều ảnh hưởng đến giá trị của nó trong chương trình. Các hàm khác không thể sử dụng được biến này, tức là không nhìn thấy nó từ những hàm khác trừ hàm chứa nó. - Biến tĩnh trong: Có tác dụng đối với hàm chứa nó, nhưng khác với biến cục bộ là chúng vẫn còn tồn tại sau mỗi lần hàm được kích hoạt chứ không xuất hiện và biến mất.
- Biến tĩnh ngoài: Có phạm vi tác động từ khi được khai báo đến hết tập tin chương trình chứa nó, không có tác dụng đối với các tập tin khác. - Khi hàm gọi đệ quy đến chính nó thì mỗi lần gọi, máy sẽ tạo ra một tập các biến cục bộ mới hoàn toàn độc lập với các tập biến (cục bộ) đã được tạo ra trong các lần gọi trước.
- Chúng ta hoàn toàn có thể khai báo một mảng mà mỗi phần tử của mảng là một kiểu cấu trúc đã được mô tả trước đó. - Ví dụ 1: Định nghĩa kiểu cấu trúc ngay và nhan_cong, sau đó khai báo hai biến cấu trúc nguoi_a, nguoi_b và một mảng ds gồm 10 phần tử. Không cho phép sử dụng phép toán lấy địa chỉ đối với các thành phần kiểu số thực của mảng cấu trúc (kiểu nguyên thì có thể được).
- Ví dụ 2: Chương trình dưới đây cho phép nhập 5 nhân viên và in ra màn hình danh sách 5 nhân viên này, đồng thời tính tổng bậc lương của họ. - Chúng ta hoàn toàn có thể khai báo một con trỏ cấu trúc dùng để lưu trữ địa chỉ của biến cấu trúc và mảng cấu trúc. Ta có thể dùng các phép cộng, trừ địa chỉ để làm cho p1 trỏ tới thành phần bất kỳ nào khác.
Trong C, mối quan hệ giữa biến struct và hàm được hổ trợ đầy đủ các tính năng như hàm đối với các kiểu dữ liệu cơ bản khác. Chúng ta có thể dùng hàm malloc( ) hoặc calloc( ) để cấp phát bộ nhớ động cho biến con trỏ struct trong lúc đang chạy chương trình và cũng có thể dùng hàm free( ) để thu hồi lại vùng nhớ. Hàm trả về con trỏ trỏ tới người tìm được hoặc trả về NULL nếu không tìm thấy.
- Để hiểu được phần này, yêu cầu người đọc phải học rồi môn “Cấu trúc dữ liệu và giải thuật”. Ở đây chúng ta sử dụng công cụ biến con trỏ để tạo ra một danh sách liên kết các struct với chiều dài tùy ý.
Như vậy, muốn đọc được tất cả các ký tự của file, ta phải đọc theo kiểu nhị phân.
O_TRUNC Nếu tập tin đã tồn tại rồi thì độ dài sẽ bị cắt về 0 Thuộc tính của tập tin vẫn không thay đổi. O_CREAT Nếu tập tin chưa có thì nó sẽ được tạo (Khi đó cần đưa thêm đối thứ 3). Khi thành công hàm trả về handle của tập tin, nó sẽ dùng trong các hàm (read,.
+ Đối với đối access có thể là một tổ hợp của những giá trị nêu trên. + Nếu trong đối access khụng mụ tả rừ O_TEXT hay O_BINARY thỡ kiểu truy nhập được xác định theo giá trị của biến _fmode. Đổi thuộc tính tập tin có tên chứa trong đối fname theo thuộc tính amode.
Nếu func=1, hàm cho thay đổi thuộc tính của tập tin, dùng đối attrib để xác định thuộc tính mới. + Hàm di chuyển con trỏ định vị của tập tin fd từ vị trí xác định bởi đối xp qua một số byte bằng giá trị tuyệt đối của sb. Nếu sb dương thì chiều di chuyển là về cuối tập tin, còn nếu sb âm thì chiều di chuyển là về phía đầu tập tin.
+ Khi thành công hàm trả về một giá trị kiểu long là vị trí mới của con trỏ định vị (số thứ tự của byte mà con trỏ định vị trỏ tới). SEEK_CUR hay 1: Xuất phát từ vị trí hiện tại của con trỏ định vị tập tin.