Các kiểu integer real giới hạn là bao nhiêu năm 2024

Ngôn ngữ lập trình C có một hệ thống mở rộng cho việc khai báo các biến của các kiểu khác nhau. Những quy tắc dành cho các kiểu phức tạp có thể gây nhầm lẫn tùy theo các kiểu thiết kế của chúng. Bài này nói về các khai báo biến, bắt đầu từ các kiểu đơn giản, và dẫn tới các kiểu phức tạp hơn.

Kiểu cơ bản[sửa | sửa mã nguồn]

Có 4 kiểu cơ bản của các biến trong C; đó là:

long int brown; long brown;

6,

long int brown; long brown;

7,

long int brown; long brown;

8 và

long int brown; long brown;

9.

Tên kiểu Ý nghĩa

long int brown; long brown;

6 Đơn vị cơ bản nhất có thể địa chỉ hóa được; nó là một byte. Đây là một kiểu nguyên.

long int brown; long brown;

7 Loại số nguyên theo kích cỡ tự nhiên nhất của các máy tính. Thông thường nó có thể lấy trọn một khoảng có thể địa chỉ hoá được của một

int const black = 12; const int black = 12;

2 với độ lớn biến thiên từ 16, 32, hay 64 bit tùy theo kiến trúc của CPU và hệ điều hành. double Một giá trị dấu chấm động có độ chính xác kép. Float Một giá trị dấu chấm động có độ chính xác đơn.

Để khai báo một biến có kiểu cơ bản, tên của kiểu được ghi ra trước sau đó đến tên của biến mới (hay của nhiều biến mới cách phân cách nhau bởi dấu phẩy) -- (Xem thêm định nghĩa )

char red; int blue, yellow;

Các khác nhau có thể đặt vào trong các kiểu cơ bản này để điều chỉnh kích cỡ và sẽ được miêu tả trong phần sau.

Lưu ý: Ở đây chỉ nêu ra trường hợp khai báo đơn giản không đi kèm với việc gán giá trị khởi động cho biến

Dấu[sửa | sửa mã nguồn]

Một kiểu được gọi là có dấu nếu kiểu nguyên đó có thể chứa các số âm. Ngược lại các kiểu cơ bản nào không chấp nhận các số âm là kiểu không dấu.

Có hai kiểu nguyên là

long int brown; long brown;

6 và

long int brown; long brown;

7 có thể có dấu âm hoặc không. Theo mặc định thì mọi kiểu

long int brown; long brown;

7 là có dấu (nghĩa là chúng chấp nhận các số âm). Để dùng dưới dạng không có dấu (tức là kiểu nguyên chỉ chấp nhận các sô không âm) thì từ khoá

int const black = 12; const int black = 12;

6 phải được dùng. Ngoài ra, thay vì khai báo đầy đủ trong dạng

int const black = 12; const int black = 12;

7, người ta có thể lược bỏ bớt từ khóa

long int brown; long brown;

7 (và nó được xem như hiểu ngầm—điều này chỉ dùng được cho kiểu

long int brown; long brown;

7 mà thôi). Như vậy hai khai báo sau đây hoàn toàn tương đương:

unsigned int green; unsigned green;

Đặc tả của C không xác định rõ ràng là kiểu

long int brown; long brown;

6 sẽ là loại có dấu hay không dấu; khi đó, dấu của kiểu này tùy thuộc vào quy định của nhà phát hành trình dịch. Như vậy, một cách để giảm sai sót khi làm việc trên nhiều loại trình dịch C khác nhau là khai báo rõ ràng bằng các định tính

char *square; long *circle;

1 hay

int const black = 12; const int black = 12;

6 nếu dùng kiểu

long int brown; long brown;

6 để tính toán trên các con số. (Dù sao, nó thực sự sẽ không quá quan trọng nếu dùng kiểu

long int brown; long brown;

6 như là kiểu "ký tự".)

unsigned char grey; signed char white;

Tiêu chuẩn chung yêu cầu

long int brown; long brown;

6,

char *square; long *circle;

6,

char *square; long *circle;

7 là các kiểu khác nhau. Ngoài ra, các hàm chuẩn về dãy các ký tự sử dụng các con trỏ chỉ tới kiểu

long int brown; long brown;

6 (không có định tính), nhiều trình dịch C sẽ bắt lỗi (hay cảnh cáo) nếu các kiểu ký tự khác được dùng như là dãy ký tự được chuyển vào các hàm này.

Kích cỡ[sửa | sửa mã nguồn]

Trong phần này hai cụm từ "chiếm" và "có độ dài" đều có nghĩa là "phần bộ nhớ cần thiết để dành cho một biến"; biến này có kiểu được miêu tả tùy theo chi tiết của bài viết.

Kiểu

long int brown; long brown;

7 cũng có các định tính về kích cỡ để đặc biệt hóa tầm rộng của giá trị mà kiểu này cho phép (tương ứng với đó là việc thay đổi phần bộ nhớ dùng để chứa các số có kiểu này).

short int yellow; long int orange;

Tương tự như đã đề cập trong phần trước, người ta có thể bỏ không viết từ khóa

long int brown; long brown;

7 trong các kiểu mà đầy đủ phải viết là

long int *rectangle; unsigned short int *rhombus; const char *kite;

1 or

long int *rectangle; unsigned short int *rhombus; const char *kite;

2. Thí dụ của hai khai báo sau đây là tương đương.

long int brown; long brown;

Có một số nhầm lẫn trong giới hiểu biết về C như là các kiểu nguyên có độ lớn bao nhiêu. Trong tiêu chuẩn thì không chỉ một cách rõ ràng việc này:

  • Kiểu long int *rectangle; unsigned short int *rhombus; const char *kite; 1 không thể lớn hơn kiểu long int brown; long brown; 7.
  • Kiểu long int brown; long brown; 7 không thể lớn hơn long int *rectangle; unsigned short int *rhombus; const char *kite; 2.
  • Kiểu long int *rectangle; unsigned short int *rhombus; const char *kite; 1 phải dài ít nhất 16 bit.
  • Kiểu long int *rectangle; unsigned short int *rhombus; const char *kite; 2 phải dài ít nhất 32 bit.

Trong tiêu chuẩn đã không đòi hỏi gì về các kích cỡ nêu trên và những khác nhau cần thiết. (Nghĩa là hoàn toàn hợp lệ nếu cả ba kiểu đều dài 64 bit!) Để có được một miêu tả chính xác và đơn giản của các kiểu, mỗi loại máy tính người ta áp dụng vào trong mỗi kiểu (cũng như là kích cỡ của một kiểu con trỏ; xem phần đưới đây) một loại lược đồ đã được tạo ra; (xem:64-Bit Programming Models Lưu trữ 2005-07-23 tại Wayback Machine). Hai lược đồ được biết nhiều nhất là

  • long int *rectangle; unsigned short int *rhombus; const char *kite; 9, trong đó long int brown; long brown; 7, long int *rectangle; unsigned short int *rhombus; const char *kite; 2 và các kiểu con trỏ chiếm 32 bit.
  • char * const pentagon = &some_char; 2, trong đó, long int *rectangle; unsigned short int *rhombus; const char *kite; 2 và con trỏ mỗi loại chiếm 64 bit, còn long int brown; long brown; 7 có độ dài 32 bit.

Hầu hết các trình dịch dùng các lược đồ trên dùng 16 bit cho kiểu

long int *rectangle; unsigned short int *rhombus; const char *kite;

1.

Một biến

long int brown; long brown;

8 có thể là một

char * const pentagon = &some_char;

7, mà trình dịch có thể sử dụng thay cho một kiểu

long int brown; long brown;

8 thuần túy. Tương tự tình huống trước, chuẩn C không hề nêu rõ các kích cỡ tương đối giữa các giá trị dấu chấm động, mà chỉ đòi hỏi

long int brown; long brown;

9 không được lớn hơn

char * const pentagon = &some_char;

7 về kích cỡ.

Từ khóa định tính

char const const hexagon = &some_char; const char const hexagon = &some_char;

1 cho các kiểu[sửa | sửa mã nguồn]

Để giúp tăng cường độ an toàn trong các chương trình, các giá trị có thể được đánh dấu là các hằng bằng từ khóa định tính

char const const hexagon = &some_char; const char const hexagon = &some_char;

1. Với từ khóa này thì một biến khai báo trở thành một hằng. Mọi thao tác do vô ý hay cố ý để điều chỉnh giá trị của nó sẽ bị báo lỗi bởi hầu hết các trình dịch. Bởi vì sau khi đã dùng từ khóa định tính

char const const hexagon = &some_char; const char const hexagon = &some_char;

1 thì các giá trị của biến không thể thay đổi nữa nên người lập trình phải gán giá trị ban đầu ngay lúc khai báo.

Chuẩn C cho phép hoán đổi vị trí của các hiệu chính. Thí dụ cả hai khai báo hằng sau đây là tương đương

int const black = 12; const int black = 12;

Cách khai báo đầu thường phản ánh cách dùng

char const const hexagon = &some_char; const char const hexagon = &some_char;

1 trong cách dùng kiểu con trỏ trong khi cách thứ nhì lại tự nhiên hơn và phổ dụng hơn.

Con trỏ[sửa | sửa mã nguồn]

Một biến có thể được khai báo như là một con trỏ chỉ đến các giá trị có kiểu nào đó, với ý nghĩa của dùng từ khóa định tính *. Để khai báo chỉ việc viết thêm ngay trước tên biến một dấu sao:

char *square; long *circle;

Lưu ý: Nếu dùng nhiều hơn một dấu sao thì sẽ tạo nên dạng các con trỏ đứng trước chỉ vào con trỏ đứng sau và con trỏ cuối cùng mới chỉ đến địa chỉ của giá trị biến.

Trong cuốn "The C Programming Language" (Ngôn ngữ lập trình C) có cho một giải thích tường tận về việc "hơi kì cục" khi dùng dấu sao trước tên của biến, trong khi dường như việc dùng dấu sao này đứng trước tên của kiểu thì có vẻ "hợp lý" hơn. Đó chính là việc tham chiếu ngược con trỏ, nó có kiểu của đối tượng mà nó chỉ tới. Trong thí dụ trên,

char const const hexagon = &some_char; const char const hexagon = &some_char;

5 là một giá trị của kiểu

char const const hexagon = &some_char; const char const hexagon = &some_char;

6. Trong khi điều này khó thấy rõ trong thí dụ trên, thì nó lại cho thấy ưu điểm nếu dùng trong các kiểu phức hợp. Đây là lý do tại sao C "hơi kì cục" trong cách khai báo các kiểu phức hợp, lúc đó, tên của biến sẽ không còn rõ ràng trong khi khai báo kiểu như các thí dụ sẽ nêu trong phần tiếp sau đây.

Có một kiểu đặc biệt của giá trị mà không thể dùng được trực tiếp như là biến có kiểu, nhưng lại có thể chỉ đến nó nếu khai báo con trỏ.

Giá trị được chỉ tới ở đây không thể dùng trực tiếp được; mọi cố gắng để tham chiếu ngược con trỏ này sẽ dẫn tới một lỗi. Sự tiện lợi ở đây là vì nó là một con trỏ "tổng quát"; nó hữu dụng khi làm việc trên dữ liệu mà kiểu được chỉ tới là không giữ vai trò gì quan trọng. Đơn giản chỉ cần cái địa chỉ con trỏ. Nó thường được ứng dụng để chứa các con trỏ trong các kiểu để làm tiện ích như là danh sách liên kết, bảng băm (hash). Khi nào cần thì tiện ích sẽ đổi kiểu (typecast) thành con trỏ có kiểu cần dùng. Sau đây là thí dụ về các khai báo con trỏ hợp lệ:

long int *rectangle; unsigned short int *rhombus; const char *kite;

Lưu ý đặc biệt về việc dùng

char const const hexagon = &some_char; const char const hexagon = &some_char;

1 trong trường hợp cuối cùng: ở đây

char const const hexagon = &some_char; const char const hexagon = &some_char;

8 là một con trỏ không phải là hằng chỉ tới một

char const const hexagon = &some_char; const char const hexagon = &some_char;

9 (tức là nó chỉ tới là một hằng có kiểu ký tự). Giá trị của

char const const hexagon = &some_char; const char const hexagon = &some_char;

8 tự nó không phải là hằng, chỉ có giá trị của

long int brown; long brown;

6 mà nó chỉ tới là một hằng. hay nói ngắn gọn hơn thì con trỏ

char const const hexagon = &some_char; const char const hexagon = &some_char;

8 có thể thay đổi để trỏ tới địa chỉ khác, nhưng giá trị tại địa chỉ mà con trỏ đang trỏ tới không thay đổi được. Vị trí của từ khoá

char const const hexagon = &some_char; const char const hexagon = &some_char;

1 đặt sau kiểu sẽ cho một cách thức để khai báo hằng con trỏ. Và như là một hằng, nó phải được gán giá trị khởi động khi khai báo:

char * const pentagon = &some_char;

Ở đây,

unsigned int green; unsigned green;

04 là một hằng con trỏ, mà nó chỉ tới một

long int brown; long brown;

6. Giá trị mà nó chỉ tới lại không là một hằng; và sẽ không gây lỗi khi thay đổi ký tự được nó chỉ tới. Chỉ khi nào thay đổi chính con trỏ này thì sẽ gây lỗi (vì đã khai báo nó là hằng). Cũng có thể khai báo cả hai: con trỏ và giá trị mà nó chỉ tới đều là hằng. Có hai cách tương đương nếu muốn khai báo như vậy là:

char const const hexagon = &some_char; const char const hexagon = &some_char;

Con trỏ chỉ tới con trỏ[sửa | sửa mã nguồn]

Vì lý do một khai báo chẳng hạn như

unsigned int green; unsigned green;

06 tự nó là một kiểu, nên một biến con trỏ có thể được khai báo để nó chỉ vào các giá trị có kiểu như vây. Nói gọn hơn, chúng là con trỏ chỉ tới các con trỏ. Thí dụ:

Như đã đề cập phần trên các từ khóa định tính

char const const hexagon = &some_char; const char const hexagon = &some_char;

1 có thể áp dụng vào chẳng hạn:

unsigned int green; unsigned green;

0

Dòng trên khai báo

unsigned int green; unsigned green;

08 là một con trỏ chỉ tới một hằng con trỏ, và hằng con trỏ này trở lại chỉ tới một hằng số nguyên dạng

unsigned int green; unsigned green;

09. Các kiểu con trỏ có thể lồng nhau, nhưng chúng càng trở nên khó khăn để nghĩ tới việc sử dụng khi mà càng nhiều cấp độ của sự gián tiếp tham gia vào. Mọi mã dùng nhiều hơn hai cấp độ của con trỏ có thể sẽ cần tới một sự thiết kế, dạng

unsigned int green; unsigned green;

10 các con trỏ.


Mảng[sửa | sửa mã nguồn]

Đối với nhiều người lập trình, trong hầu hết các ngôn ngữ tương tự C, kiểu của một mảng nằm trong số phần tử mà nó chứa. Do vậy, khai báo sau đây có thể dùng trong các ngôn ngữ như Java hay C# để khai báo một mảng 10 giá trị số nguyên.

unsigned int green; unsigned green;

1

Mặc dù vậy, như đã nhắc tới trước đây, nguyên lý trong cú pháp khai báo của C làm cho việc khai báo tương tự như việc sử dụng của biến. Thí dụ: một truy cập tới mảng này chẳng hạn như là

unsigned int green; unsigned green;

11, lúc khai khai báo lại cũng có cú pháp dạng:

Mảng của các mảng[sửa | sửa mã nguồn]

Tương tự như con trỏ, kiểu mảng có thể được lồng nhau. Vì trong cách viết mảng sử dụng các ngoặc vuông (

unsigned int green; unsigned green;

12), là một cách viết hậu tố, nên kích cỡ của mảng bên trong thì được ghi ở bên ngoài (hay đằng sau):

Câu lệnh trên khai báo rằng

unsigned int green; unsigned green;

13 là một mảng có năm phần tử. Mỗi phần tử là một mảng của 12 giá trị

long int brown; long brown;

8.

Mảng của các con trỏ[sửa | sửa mã nguồn]

Vì kiểu của phần trong một mảng tự nó lại là một kiểu của C, mảng của các con trỏ đương nhiên cũng có cấu trúc:

Câu lệnh này khai báo biến

unsigned int green; unsigned green;

15 là mảng của 10 phần tử, trong đó, mỗi phần tử là một con trỏ chỉ tới

long int brown; long brown;

6.

Con trỏ chỉ tới các mảng[sửa | sửa mã nguồn]

Để khai báo một biến là một con trỏ chỉ tới một mảng, nhất thiết phải dùng tới dấu ngoặc đơn. Nó tương tự như cách dùng ngoặc để đổi thứ tự ưu tiên cho phép toán (phép toán trong ngoặc sẽ được tính trước) chẳng hạn:

Hoàn toàn tương tự cho con trỏ chỉ tới các mảng. Lưu ý rằng dấu ngoặc vuông (

unsigned int green; unsigned green;

  1. có độ ưu tiên cao hơn dấu sao (

unsigned int green; unsigned green;

18), do đó khai báo sẽ có dạng:

Câu lệnh này khai báo biến

unsigned int green; unsigned green;

19 là một con trỏ, và nó chỉ tới một mảng có 20 giá trị kiểu

long int brown; long brown;

8. Để khai báo một con trỏ chỉ tới dãy các con trỏ, chỉ cần kết hợp các cách viết:

Hàm[sửa | sửa mã nguồn]

Một sự khai báo hàm là một thí dụ điển hình của một kiểu dẫn xuất. Bởi vì hàm có thể nhận vào các tham số, kiểu của mỗi tham số phải được ghi rõ ra. Tên của mỗi tham số không nhất thiết phải được cho trước khi khai báo một hàm. Hai cách khai báo sau đây là tương đương:

unsigned int green; unsigned green;

2

Tham số[sửa | sửa mã nguồn]

Trong khi cả hai dạng trên đều đúng cú pháp, thì cách viết bỏ qua tên của các tham số thường được xét như là một dạng tồi khi viết các khai báo hàm trong các tập tin tiêu đề. Các tên này có thể cung ứng các thông tin có giá trị cho những người đọc các tập tin đó chẳng hạn như là ý nghĩa và phép toán của chúng.

Các hàm có thể nhận và trả về các kiểu con trỏ dùng cách viết thông thường cho một con trỏ:

unsigned int green; unsigned green;

3

Kiểu đặc biệt

unsigned int green; unsigned green;

21 hữu dụng cho việc khai báo các hàm mà chúng không có tham số nào cả:

Điều này khác với một bộ tham số trống rỗng, được dùng trong ANSI C, để khai báo một hàm, nhưng không cho bất cứ thông tin nào về các kiểu tham số của nó.

Câu lệnh trên khai báo một hàm tên là

unsigned int green; unsigned green;

22, nó trả về một giá trị

long int brown; long brown;

8, nhưng không đề cập gì về các tham số mà hàm đó dùng tới.

Hàm nhận hàm khác làm tham số[sửa | sửa mã nguồn]

Trong C, các hàm không thể trực tiếp lấy các hàm khác như là tham số của nó, hay không thể trả về một hàm số như là kết quả. Mặc dù vậy, chúng có thể lấy vào hay trả về các con trỏ. Để khai báo rằng một hàm lấy một con trỏ hàm như là một tham số, thì dùng cách viết chuẩn như đã ghi ở trên.

unsigned int green; unsigned green;

4

Khai báo bên trên có một hàm mà có hai tham số. Đối số đầu tiên,

unsigned int green; unsigned green;

24, là một ký tự kiểu

long int brown; long brown;

6 thông thường. Đối số còn lại,

unsigned int green; unsigned green;

26 là một con trỏ chỉ tới một hàm. Hàm được chỉ tới này không (nên) có các tham số, và sẽ trả về một số nguyên

long int brown; long brown;

7.

Hàm trả về một hàm khác[sửa | sửa mã nguồn]

Để khai báo một hàm mà nó trả về một hàm khác phải dùng tới dấu ngoặc đơn, để thay thứ tự ưu tiên của các phép toán (về hàm)

unsigned int green; unsigned green;

5

Như trên, có hai bộ danh sách tham số, sự khai báo này nên được đọc thật kĩ, vì nó không được rõ ràng. Ở đây, hàm

unsigned int green; unsigned green;

28 được định nghĩa. Nó có hai tham số nguyên

unsigned int green; unsigned green;

29 và

unsigned int green; unsigned green;

30, và trả về một con trỏ hàm. Con trỏ trả về này chỉ tới một hàm mà tự hàm đó có hai tham số nguyên là

unsigned int green; unsigned green;

31 và

unsigned int green; unsigned green;

32, và trả về một số nguyên

char const const hexagon = &some_char; const char const hexagon = &some_char;

6.

Cách này có thể được mở rộng tùy ý để làm cho các hàm trả về con trỏ chỉ tới hàm mà hàm đó lại trả về các con trỏ, mà các con trỏ này chỉ tới các hàm khác, và vân vân, nhưng việc này sẽ biến mã nguồn trở nên khó hiểu một cách nhanh chóng, và rất dễ phát sinh lỗi. Nếu thấy cần thiết làm chuyện đó, thì người lập trình nên cứu xét việc thiết kế lại hay dùng một cách định nghĩa kiểu

unsigned int green; unsigned green;

34.

Cấu trúc[sửa | sửa mã nguồn]

Cấu trúc (từ khóa tương ứng

unsigned int green; unsigned green;

  1. thực sự là một "kiểu mở rộng" của mảng. So với mảng thì cấu trúc mạnh hơn ở chỗ nó cho phép các phần tử của nó có các kiểu khác nhau và mỗi phần tử này được gọi là thành phần của một cấu trúc:

unsigned int green; unsigned green;

6

Câu lệnh

unsigned int green; unsigned green;

10 nêu trên là một khai báo chuẩn để tạo ra một kiểu cấu trúc trong C.

Định nghĩa biến kiểu

unsigned int green; unsigned green;

10[sửa | sửa mã nguồn]

Việc định nghĩa một biến có kiểu

unsigned int green; unsigned green;

10 cũng đơn giản như khi định nghĩa các biến bình thường:

unsigned int green; unsigned green;

7

Trong cách đầu thì biến Bluesman chưa có giá trị khởi động (nó vẫn có thể được truy cập và thay đổi giá trị sau này) trong khi biến Bio đã được gán các giá trị ban đầu. Hãy lưu ý dùng dấu phẩy "

unsigned int green; unsigned green;

39" để phân biệt các giá trị được gán lên những thành phần của cấu trúc—và dĩ nhiên chúng phải có đúng kiểu cũng như không thể gán thiếu các giá trị cho các thành phần này. Để truy cập đến các giá trị của biến có kiểu struct thì có thể dùng toán tử "." như câu lệnh sau:

unsigned int green; unsigned green;

8

Mảng của các

unsigned int green; unsigned green;

10[sửa | sửa mã nguồn]

Để kiến tạo một mảng của các

unsigned int green; unsigned green;

10 thì dùng cú pháp sau:

Con trỏ chỉ tới

unsigned int green; unsigned green;

10[sửa | sửa mã nguồn]

Cũng vậy, việc tiến hành khai báo một biến con trỏ có kiểu là

unsigned int green; unsigned green;

10 tương tự cách thông thường. Chỉ cần thêm vào đó dấu sao đằng trước tên biến:

Cấu trúc lồng nhau[sửa | sửa mã nguồn]

Kiểu cấu trúc cũng có thể định nghĩa lồng vào nhau. Thí dụ dưới đây cho thấy việc khai báo cấu trúc

unsigned int green; unsigned green;

44 có chứa cấu trúc

unsigned int green; unsigned green;

45 như là một thành phần. Việc truy cập dữ liệu thành phần của cấu trúc bên trong cũng được tiến hành theo cách dùng toán tử "." nối tiếp nhau.

unsigned int green; unsigned green;

9

Kiểu hợp nhất[sửa | sửa mã nguồn]

Kiểu hợp nhất có tên từ khóa là

unsigned int green; unsigned green;

46 kiểu đặc biệt này cho phép nó chứa dữ liệu mà có thể có kiểu khác nhau trong cùng một phần bộ nhớ (mà nó có thể được cấp phát khi khai báo biến):

unsigned char grey; signed char white;

0

Để khai báo biến, có thể dùng cách thông thường, tạo mảng các

unsigned int green; unsigned green;

46 hay cách tham chiếu:

unsigned char grey; signed char white;

1

Để gán hay truy cập giá trị cho một biến union, có thể dùng toán tử "." Theo hàng khai báo đầu tiên của thí dụ trên ta có thể viết một trong các phép gán:

hay là:

unsigned char grey; signed char white;

2

hay là:

unsigned char grey; signed char white;

3

Lưu ý:

  • Việc gán giá trị cho một biến kiểu unsigned int green; unsigned green; 46 đòi hỏi kiểu của dữ liệu đó phải có mặt trong khai báo ban đầu của nó. Theo thí dụ trên thì kiểu unsigned int green; unsigned green; 49 chỉ chấp nhận chứa một đơn vị dữ liệu của một trong ba kiểu unsigned int green; unsigned green; 50 và long int brown; long brown; 6.
  • Một khi giá trị có kiểu đúng nào đó được gán cho một biến kiểu unsigned int green; unsigned green; 46 thì nó sẽ xóa bỏ hẳn giá trị cũ (nếu có) mà biến này đã chứa trước đó.
  • Việc truy cập một giá trị từ một biến kiểu unsigned int green; unsigned green; 46 cần lưu ý đến kiểu hiện tại của dữ liệu đang được chứa của biến này nếu không, có thể gây ra lỗi dùng sai kiểu.
  • Điểm khác nhau quan trọng giữa unsigned int green; unsigned green; 46 và unsigned int green; unsigned green; 10 là unsigned int green; unsigned green; 46 chỉ có được một thành phần (nhưng thành phần này phải có kiểu tùy theo khai báo của người lập trình) trong khi unsigned int green; unsigned green; 10 bao gồm nhiều thành phần (và mỗi thành phần có thể có kiểu khác nhau).
  • Tương tự như unsigned int green; unsigned green; 10, unsigned int green; unsigned green; 46 cho phép khai báo nhiều union lồng nhau.

Dùng

unsigned int green; unsigned green;

60 để định nghĩa hằng và kiểu[sửa | sửa mã nguồn]

Một cách tổng quát thì từ khóa tiền xử lý

unsigned int green; unsigned green;

60 đùng để định nghĩa tên của một kiểu (đối tượng) nào đó. Thực ra, câu lệnh

unsigned int green; unsigned green;

60 chỉ là một loại câu lệnh . Có hai ứng dụng chính như sau:

Định nghĩa tên hằng[sửa | sửa mã nguồn]

Có thể dùng câu lệnh tiền xử lý

unsigned int green; unsigned green;

60 để định nghĩa một hằng:

unsigned char grey; signed char white;

4

Lưu ý: so với cách định nghĩa dùng từ khóa

unsigned int green; unsigned green;

65

unsigned int green; unsigned green;

66

`Có thể dùng

unsigned int green; unsigned green;

60 để định nghĩa tên của một kiểu dữ liệu: `

unsigned int green; unsigned green;

68

unsigned int green; unsigned green;

69

unsigned int green; unsigned green;

70

`Lưu ý: Việc sử dụng

unsigned int green; unsigned green;

60 có thể có các hiệu ứng phụ không ngờ nếu dùng nó kết hợp với nhiều định tính và có thể dẫn đến những lỗi khó tìm khi viết mã: `

unsigned int green; unsigned green;

72

`Trong lúc định nghĩa biến người lập có thể muốn định nghĩa hai con trỏ

long int brown; long brown;

6 như sau: `

unsigned int green; unsigned green;

74

`Tuy nhiên, điều ước muốn sẽ không xảy ra vì

unsigned int green; unsigned green;

60 là macro nên trình dịch sẽ diễn giải thành (nó chỉ thay thế tên

unsigned int green; unsigned green;

76 bằng

unsigned int green; unsigned green;

06): `

unsigned int green; unsigned green;

78

unsigned int green; unsigned green;

79 là con trỏ mà thôi.


## `` `Dùng 

unsigned int green;
unsigned green;

34 để định nghĩa kiểu[sửa | sửa mã nguồn]` ``

`` `Một cách khác để đặt tên riêng cho kiểu dữ liệu là dùng câu lệnh với từ khóa 

unsigned int green;
unsigned green;

34:` ``

unsigned int green;
unsigned green;

82

`` `Nếu so sánh cách viết trong thí dụ trên với việc dùng từ khoá 

unsigned int green;
unsigned green;

60 để định nghĩa thì chúng hoàn toàn tương đương (chỉ khác nhau về thứ tự các chữ 

long int brown;
long brown;

9 và 

unsigned int green;
unsigned green;

85). Tuy nhiên, cách viết này là một sự thay thế thế tên "đúng nghĩa" chứ không phải là một macro đơn thuần. Trở lại thí dụ:` ``

unsigned int green;
unsigned green;

86

`` `Câu lệnh trên cho phép đặt tên string như là một kiểu mới (mà nội dung của nó là kiểu con trỏ 

long int brown;
long brown;

6). Bây giờ hãy xét đến câu lệnh khai báo biến:` ``

unsigned int green;
unsigned green;

88

unsigned int green;
unsigned green;

89

unsigned int green;
unsigned green;

90
`

`Dùng cho

unsigned int green; unsigned green;

10[sửa | sửa mã nguồn] `

`Một thí dụ khác liên quan đến việc đặt tên cho

unsigned int green; unsigned green;

10 là việc kết hợp cả hai khai báo và đặt tên lại trong cùng một câu lệnh: `

unsigned int green; unsigned green;

93

unsigned int green; unsigned green;

94

unsigned int green; unsigned green;

95

unsigned int green; unsigned green;

96

`Một ứng dụng đáng lưu ý của

unsigned int green; unsigned green;

34 là việc làm cho mã C trở nên linh hoạt hơn trong nhiều môi trường khác nhau. Thí dụ: khi muốn xác định dùng đúng 4 byte cho một kiểu nguyên nhưng trên một số hệ máy thì nó ứng với kiểu

long int brown; long brown;

7, trong khi trên một số hệ máy khác nó lại ứng với kiểu

long int *rectangle; unsigned short int *rhombus; const char *kite;

  1. Để giải quyết việc dùng chính xác 4 byte cho kiểu nguyên mà người lập trình muốn, thì có thể dùng giải pháp là: thêm vào một trong đó có chứa định nghĩa: `

unsigned char grey; signed char white;

00

unsigned char grey; signed char white;

01

unsigned char grey; signed char white;

02

unsigned char grey; signed char white;

03 như vậy chỉ cần thay nội dung của tập tin bao gồm thì toàn bộ mã vẫn hoạt động đúng.

unsigned char grey; signed char white;

04[sửa | sửa mã nguồn]

unsigned char grey; signed char white;

05 là một kiểu dữ liệu đặc biệt được dùng để định nghĩa một quan hệ thứ tự cho một tập họp hữu hạn các tên. (Trong thực tế thì `enum có kiểu là

long int brown; long brown;

7 Theo trang 553 trong cuốn "New C Primer Plus"—xem thêm phần tham khảo):`

unsigned char grey; signed char white;

07

unsigned char grey; signed char white;

08 có kiểu

unsigned char grey; signed char white;

09 dùng câu lệnh:

unsigned char grey; signed char white;

10

unsigned char grey; signed char white;

11 theo mặc định sẽ tương ứng với

unsigned char grey; signed char white;

12. các cách viết câu lệnh sau đây là có hiệu lực:

unsigned char grey; signed char white;

13


unsigned char grey;
signed char white;

09 được xem là các hằng số từ 0 tăng dần cho đến phần tử cuối cùng trong đó. Tuy nhiên, C không loại trừ khả năng đặt lại giá trị của một phần tử trong 

unsigned char grey;
signed char white;

09 theo cách riêng:` `` 

unsigned char grey; signed char white;

16

unsigned char grey; signed char white;

17 có giá trị tương ứng là

unsigned char grey; signed char white;

18,

unsigned char grey; signed char white;

19 là

unsigned char grey; signed char white;

20,...,

unsigned int green; unsigned green;

19 là

unsigned char grey; signed char white;

22, còn

unsigned char grey; signed char white;

23 sẽ tương ứng là

unsigned char grey; signed char white;

24 và

unsigned char grey; signed char white;

25 là

unsigned char grey; signed char white;

26.

unsigned char grey; signed char white;

27

unsigned char grey; signed char white;

28[sửa | sửa mã nguồn]

unsigned char grey; signed char white;

29 là kiểu dữ liệu dùng để xử lý các tập tin. Theo ANSI thì có hai phương thức để truy cập là nhị phân

unsigned char grey; signed char white;

30 và văn bản

unsigned char grey; signed char white;

31. Người ta dùng một biến con trỏ để khai bảo:

unsigned char grey; signed char white;

32

unsigned char grey; signed char white;

33

unsigned char grey; signed char white;

34

unsigned char grey; signed char white;

35 sẽ được mở trong chế độ đọc

unsigned char grey; signed char white;

36. Các chế độ truy cập cơ bản bao gồm: undefined

  • ` unsigned char grey; signed char white; 36 - đọc ` ` `* unsigned char grey; signed char white; 38 - viết
  • unsigned char grey; signed char white; 39 - viết tiếp vào cuối tập tin và tạo tập tin mới nếu chưa có
  • unsigned char grey; signed char white; 40 - đọc và viết
  • unsigned char grey; signed char white; 41 - đọc và viết nhưng cắt bỏ nội dung cũ của tập tin nếu có, tạo tập tin mới nếu chưa có
  • unsigned char grey; signed char white; 42 - Mở file đã tồn tại với mục đích đọc và ghi. Nó tạo file mới nếu không tồn tại. Việc đọc file sẽ bắt đầu đọc từ đầu nhưng ghi file sẽ chỉ ghi vào cuối file.
  • unsigned char grey;

    signed char white; 43 unsigned char grey; signed char white; 44 unsigned char grey; signed char white; 45 unsigned char grey; signed char white; 46 unsigned char grey; signed char white; 47 unsigned char grey; signed char white; 48 unsigned char grey; signed char white; 49 unsigned char grey; signed char white; 50 unsigned char grey; signed char white; 51 giống như các trường hợp trên nhưng chỉ dùng cho tập tin nhị phân.

    ` `

unsigned char grey; signed char white;

52,

unsigned char grey; signed char white;

53,

unsigned char grey; signed char white;

54,

unsigned char grey; signed char white;

55,

unsigned char grey; signed char white;

56,

unsigned char grey; signed char white;

57,

unsigned char grey; signed char white;

58,

unsigned char grey; signed char white;

59,

unsigned char grey; signed char white;

60 và hàm

unsigned char grey; signed char white;

61.

unsigned char grey; signed char white;

62[sửa | sửa mã nguồn]

unsigned char grey; signed char white;

63 đặt trước tên kiểu biến khi khai báo sẽ cho biến đó một tính năng đặc biệt, đó là, giá trị của nó sẽ được lưu giữ không bị mất đi mặc dù khối mã chứa nó đã được xử lý xong. Trường hợp. Đặc biệt nếu một biến được khai báo có định tính

unsigned char grey; signed char white;

64 trong một hàm và được cài đặt giá trị nào đó thì sau khi hàm đó được gọi, giá trị của biến

unsigned char grey; signed char white;

64 đó vẫn còn giữ nguyên giữa mỗi lần gọi (cho tới khi nó được gán giá trị khác trong lần gọi tới của hàm). Thi dụ sau đây khai báo biến

unsigned char grey; signed char white;

66 có định tính

unsigned char grey; signed char white;

64 trong một hàm: