Biến int. C kiểu dữ liệu

Loại dữ liệu

Các kiểu dữ liệu có một ý nghĩa đặc biệt trong C # vì nó là một ngôn ngữ được đánh máy mạnh. Điều này có nghĩa là tất cả các hoạt động phải đối sánh kiểu nghiêm ngặt bởi trình biên dịch và các hoạt động không hợp lệ sẽ không được biên dịch. Do đó, kiểm tra kiểu mạnh giúp loại bỏ lỗi và nâng cao độ tin cậy của chương trình. Để kiểm tra kiểu, tất cả các biến, biểu thức và giá trị phải thuộc một kiểu cụ thể. Không có cái gọi là biến "không đánh máy" trong ngôn ngữ lập trình này cả. Hơn nữa, loại giá trị xác định các hoạt động được phép thực hiện trên nó. Một hoạt động được phép cho một kiểu dữ liệu có thể không hợp lệ cho một kiểu dữ liệu khác.

Có hai danh mục chung về kiểu dữ liệu tích hợp sẵn trong C #: các loại giá trịcác loại tham chiếu... Chúng khác nhau về nội dung của biến. Về mặt khái niệm, sự khác biệt giữa hai loại là một kiểu giá trị lưu trữ dữ liệu trực tiếp, trong khi một kiểu tham chiếu lưu trữ một tham chiếu đến một giá trị.

Các kiểu này được lưu trữ ở các vị trí khác nhau trong bộ nhớ: các kiểu giá trị được lưu trữ trong một vùng được gọi là ngăn xếp và các kiểu tham chiếu trong một vùng được gọi là vùng được quản lý.

Chúng ta hãy xem các loại giá trị.

Các loại số nguyên

C # định nghĩa chín kiểu số nguyên: char, byte, sbyte, short, ushort, int, uint, long và ulong... Nhưng kiểu char chủ yếu được sử dụng để đại diện cho các ký tự và do đó được xem xét riêng biệt. Tám kiểu số nguyên khác dành cho các phép tính số. Phạm vi biểu diễn số và độ sâu bit của chúng được trình bày dưới đây:

Các loại số nguyên C #
Một loại Loại CTS Độ sâu bit Phạm vi
byte System.Byte 8 0:255
sbyte System.SByte 8 -128:127
ngắn ngủi Hệ thống.Int16 16 -32768: 32767
ushort System.UInt16 16 0: 65535
int Hệ thống.Int32 32 -2147483648: 2147483647
uint System.UInt32 32 0: 4294967295
Dài Hệ thống.Int64 64 -9223372036854775808: 9223372036854775807
dài System.UInt64 64 0: 18446744073709551615

Như bạn có thể thấy từ bảng trên, C # xác định cả hai biến thể của các kiểu số nguyên khác nhau, có dấu và không dấu. Các kiểu số nguyên có dấu khác với các kiểu số nguyên không dấu ở cách chúng diễn giải bit quan trọng nhất của một số nguyên. Ví dụ: nếu một giá trị số nguyên có dấu được chỉ định trong một chương trình, trình biên dịch C # sẽ tạo mã sử dụng bit quan trọng nhất của số nguyên làm cờ dấu. Một số được coi là dương nếu cờ dấu là 0 và âm nếu là 1.

Các số âm hầu như luôn luôn được biểu diễn bằng phương pháp bù của hai số, theo đó tất cả các chữ số nhị phân của một số âm trước tiên được đảo ngược, và sau đó 1 được thêm vào số đó.

Có lẽ kiểu số nguyên phổ biến nhất trong lập trình là kiểu int... Các biến kiểu int thường được sử dụng để điều khiển vòng lặp, lập chỉ mục mảng và các phép tính toán học chung. Khi một giá trị số nguyên có phạm vi đại diện số lớn hơn được yêu cầu so với giá trị của kiểu int, thì có một số kiểu số nguyên khác có sẵn cho mục đích này.

Vì vậy, nếu giá trị cần được lưu trữ mà không có dấu, thì đối với nó, bạn có thể chọn loại uint, đối với các giá trị có dấu lớn - loại dài và đối với các giá trị không được đánh dấu lớn, loại dài... Ví dụ, dưới đây là một chương trình tính toán khoảng cách từ Trái đất đến Mặt trời theo đơn vị cm. Để lưu trữ một giá trị lớn như vậy, nó sử dụng một biến kiểu dài:

Hệ thống sử dụng; sử dụng System.Collections.Generic; sử dụng System.Linq; sử dụng System.Text; không gian tên ConsoleApplication1 (class Program (static void Main (string args) (long result; const long km = 149800000; // khoảng cách tính bằng km.result = km * 1000 * 100; Console.WriteLine (result); Console.ReadLine (); )))

Tất cả các biến số nguyên có thể được gán ký hiệu thập phân hoặc thập lục phân. Trong trường hợp sau, tiền tố 0x là bắt buộc:

Dài x = 0x12ab;

Nếu có bất kỳ sự không chắc chắn nào về việc liệu một giá trị số nguyên thuộc kiểu int, uint, long, hay ulong, thì vỡ nợ một int được chấp nhận. Để chỉ định rõ ràng kiểu số nguyên nào khác phải có giá trị, bạn có thể thêm các ký tự sau vào số:

Uint ui = 1234U; dài l = 1234L; ulong ul = 1234UL;

U và L cũng có thể được viết bằng chữ thường, mặc dù chữ L viết thường có thể dễ bị nhầm lẫn với 1 (một).

Các loại dấu chấm động

Các kiểu dấu phẩy động cho phép bạn biểu diễn các số bằng một phần phân số. Có hai kiểu dữ liệu dấu phẩy động trong C #: trôi nổigấp đôi... Chúng đại diện cho các giá trị số có độ chính xác đơn và độ chính xác kép, tương ứng. Vì vậy, dung lượng của kiểu float là 32 bit, tương ứng với phạm vi biểu diễn các số từ 5E-45 đến 3,4E + 38. Và độ sâu bit của kiểu kép là 64 bit, xấp xỉ tương ứng với phạm vi biểu diễn các số từ 5E-324 đến 1,7E + 308.

Kiểu dữ liệu float dành cho các giá trị dấu chấm động nhỏ hơn yêu cầu độ chính xác thấp hơn. Kiểu dữ liệu kép lớn hơn float và cung cấp độ chính xác cao hơn (15 bit).

Nếu một giá trị không phải số nguyên được mã hóa cứng trong mã nguồn (ví dụ: 12.3), thì trình biên dịch thường giả định rằng một giá trị kép được ngụ ý. Nếu giá trị cần được chỉ định dưới dạng float, bạn cần thêm F (hoặc f) vào nó:

Phao f = 12,3F;

Kiểu dữ liệu thập phân

Một loại thập phân cũng được cung cấp để biểu thị số dấu phẩy động có độ chính xác cao. số thập phân, được thiết kế để sử dụng trong các tính toán tài chính. Loại này rộng 128 bit để biểu diễn các giá trị số từ 1E-28 đến 7,9E + 28. Bạn có thể biết rằng lỗi làm tròn số thập phân thường gặp trong số học dấu phẩy động thông thường. Những lỗi này được loại bỏ bằng cách sử dụng kiểu thập phân, có thể đại diện cho số đến 28 (và đôi khi là 29) chữ số thập phân. Bởi vì kiểu dữ liệu này có thể đại diện cho các giá trị thập phân mà không có lỗi làm tròn, nó đặc biệt hữu ích cho các tính toán tài chính:

Hệ thống sử dụng; sử dụng System.Collections.Generic; sử dụng System.Linq; sử dụng System.Text; namespace ConsoleApplication1 (class Program (static void Main (string args) (// *** Tính toán chi phí đầu tư vốn với *** // *** tỷ suất sinh lợi cố định *** tiền thập phân, phần trăm; int i; const byte năm = 15; tiền = 1000,0 triệu; phần trăm = 0,045 triệu; cho (i = 1; i

Kết quả của chương trình này sẽ là:

Ký hiệu

Trong C #, các ký tự không được biểu diễn bằng mã 8 bit, như trong nhiều ngôn ngữ lập trình khác, chẳng hạn như C ++, mà bằng mã 16 bit được gọi là unicode... Bộ ký tự của Unicode rất rộng nên nó bao gồm các ký tự từ hầu hết các ngôn ngữ tự nhiên trên thế giới. Trong khi nhiều ngôn ngữ tự nhiên, bao gồm tiếng Anh, tiếng Pháp và tiếng Đức, được đặc trưng bởi các bảng chữ cái tương đối nhỏ, một số ngôn ngữ khác, chẳng hạn như tiếng Trung, sử dụng các bộ ký tự khá rộng mà không thể được biểu thị bằng mã 8 bit. Để khắc phục hạn chế này, C # định nghĩa kiểu charđại diện cho các giá trị 16 bit không dấu từ 0 đến 65535. Tuy nhiên, bộ ký tự ASCII 8 bit tiêu chuẩn là một tập hợp con của Unicode từ 0 đến 127. Do đó, các ký tự ASCII vẫn có giá trị trong C # ...

Bảng lừa đảo này cung cấp thông tin về các kiểu dữ liệu cơ bản của ngôn ngữ lập trình C ++ và cách chúng được triển khai. Ngoài ra, ở cuối mục nhập, một bảng được biên dịch với các phạm vi giá trị của các loại này.

Khái niệm kiểu dữ liệu

Mục đích chính của bất kỳ chương trình nào là xử lý dữ liệu. Các loại dữ liệu khác nhau được lưu trữ và xử lý theo những cách khác nhau. Trong bất kỳ ngôn ngữ thuật toán nào, mọi hằng, biến, kết quả của việc đánh giá một biểu thức hoặc hàm phải có một kiểu cụ thể.

Kiểu dữ liệu xác định:

  • biểu diễn bên trong của dữ liệu trong bộ nhớ máy tính;
  • một tập hợp các giá trị có thể nhận các giá trị kiểu này;
  • các hoạt động và chức năng có thể được áp dụng cho các giá trị của loại này.

Dựa trên các đặc điểm này, người lập trình chọn kiểu của từng đại lượng dùng trong chương trình để biểu diễn các đối tượng thực. Khai báo kiểu bắt buộc cho phép trình biên dịch thực hiện kiểm tra xác thực trên các cấu trúc chương trình khác nhau. Loại giá trị xác định các lệnh máy sẽ được sử dụng để xử lý dữ liệu.

Tất cả các loại ngôn ngữ C ++ có thể được chia thành chính hỗn hợp ... C ++ định nghĩa sáu chính kiểu dữ liệu để biểu diễn số nguyên, giá trị thực, ký hiệu và lôgic. Dựa trên các loại này, người lập trình có thể nhập mô tả thành phần các loại. Chúng bao gồm mảng, kiểu liệt kê, hàm, cấu trúc, tham chiếu, con trỏ, hợp nhất và lớp.

Các kiểu dữ liệu cơ bản trong C ++

Các kiểu dữ liệu cơ bản (chuẩn) thường được gọi là số học vì chúng có thể được sử dụng trong các phép toán số học. Để mô tả các loại chính, những điều sau được xác định:

  1. int (số nguyên);
  2. char (ký tự);
  3. wchar_t (rộng ký tự);
  4. bool (boolean);
  5. float (thực);
  6. gấp đôi (độ chính xác gấp đôi).

Bốn kiểu đầu tiên được gọi là số nguyên ( trọn ), hai cái cuối cùng - các loại dấu phẩy động ... Mã mà trình biên dịch tạo ra để xử lý các giá trị số nguyên khác với mã cho các giá trị dấu chấm động.

Có bốn loại chỉ định xác định đại diện bên trong và phạm vi giá trị của các loại tiêu chuẩn:

  • ngắn ngắn);
  • dài dài);
  • đã ký (đã ký);
  • chưa ký

Kiểu số nguyên (int)

Kích thước của kiểu int không được xác định theo tiêu chuẩn, mà phụ thuộc vào máy tính và trình biên dịch. Đối với bộ xử lý 16 bit, 2 byte được phân bổ cho các giá trị thuộc loại này, đối với bộ xử lý 32 bit là 4 byte.

Mã định nghĩa ngắn ở phía trước tên kiểu cho trình biên dịch biết rằng 2 byte nên được phân bổ cho số, bất kể dung lượng của bộ xử lý là bao nhiêu. Giá trị xác định dài có nghĩa là giá trị số nguyên sẽ chiếm 4 byte. Do đó, trên máy tính 16 bit, int và short int là tương đương, và trên máy tính 32 bit, int và int dài.

Đại diện nội bộ giá trị số nguyên - một số nguyên nhị phân. Khi sử dụng bộ xác định có dấu, bit quan trọng nhất của một số được hiểu là có dấu (0 là số dương, 1 là số âm). Bộ chỉ định không dấu chỉ cho phép các số dương được biểu diễn vì bit quan trọng nhất được coi là một phần của mã số. Do đó, phạm vi giá trị int phụ thuộc vào các chỉ định. Phạm vi giá trị của giá trị kiểu số nguyên với các mã định danh khác nhau cho máy tính tương thích với PC IBM được hiển thị trong bảng "Phạm vi giá trị của kiểu dữ liệu đơn giản" ở cuối mục nhập.

Theo mặc định, tất cả các kiểu số nguyên được coi là có dấu, nghĩa là, từ chỉ định có dấu có thể bị bỏ qua.

Các hằng số được tìm thấy trong chương trình được gán một hoặc một kiểu khác phù hợp với kiểu của chúng. Nếu kiểu này vì lý do nào đó không phù hợp với người lập trình, anh ta có thể chỉ ra rõ ràng kiểu bắt buộc bằng cách sử dụng các hậu tố L, l (long) và U, u (không dấu). Ví dụ, hằng số 32L sẽ có kiểu dài và chiếm 4 byte. Bạn có thể sử dụng các hậu tố L và U cùng lúc, ví dụ: 0x22UL hoặc 05Lu.

Ghi chú

Các kiểu int short, int dài, int có dấu và int không dấu có thể được viết tắt tương ứng thành short, long, có dấu và không dấu.

Loại ký tự (ký tự)

Số byte được phân bổ cho giá trị của một kiểu ký tự, đủ để chứa bất kỳ ký tự nào từ bộ ký tự cho một máy tính nhất định, đó là nguyên nhân tạo ra tên của kiểu. Thông thường, đây là 1 byte. Kiểu char, giống như các kiểu số nguyên khác, có thể có dấu hoặc không dấu. Các giá trị có dấu có thể lưu trữ các giá trị trong phạm vi -128 đến 127. Khi sử dụng từ định nghĩa không dấu, các giá trị có thể nằm trong khoảng từ 0 đến 255. Điều này đủ để lưu trữ bất kỳ ký tự nào trong bộ ASCII 256 ký tự. Bạn cũng có thể sử dụng các giá trị ký tự để lưu trữ các số nguyên không vượt quá phạm vi được chỉ định.

Loại ký tự mở rộng (wchar_t)

Kiểu wchar_t được thiết kế để hoạt động với một tập hợp các ký tự mà 1 byte là không đủ, ví dụ: Unicode. Kích thước của loại này phụ thuộc vào việc triển khai; nó thường thuộc loại ngắn. Hằng số chuỗi kiểu wchar_t được viết với tiền tố L, ví dụ: L "Gates".

Kiểu boolean (bool)

Giá trị boolean chỉ có thể là true và false, là các từ dành riêng. Dạng bên trong của giá trị sai là 0 (không). Bất kỳ giá trị nào khác được hiểu là đúng. Khi được chuyển đổi thành kiểu số nguyên, true là 1.

Các loại dấu chấm động (float, double và long double)

Tiêu chuẩn C ++ định nghĩa ba kiểu dữ liệu để lưu trữ các giá trị thực: float, double và long double.

Kiểu dữ liệu dấu chấm động được lưu trữ trong bộ nhớ máy tính khác với kiểu dữ liệu số nguyên. Biểu diễn bên trong của một số thực bao gồm hai phần - phần định trị và thứ tự. Trong các máy tính tương thích với PC của IBM, các giá trị float chiếm 4 byte, trong đó một bit nhị phân được gán cho dấu của phần định trị, 8 bit cho thứ tự và 23 cho phần định trị. Phần định trị là một số lớn hơn 1,0 nhưng nhỏ hơn 2,0. Vì chữ số có nghĩa nhất của phần định trị luôn là 1 nên nó không được lưu trữ.

Đối với các giá trị kép 8 byte, 11 và 52 bit được phân bổ tương ứng cho thứ tự và phần định trị. Độ dài của phần định trị xác định độ chính xác của số và độ dài của thứ tự xác định phạm vi của nó. Như bạn có thể thấy từ bảng ở cuối bản ghi, với cùng số byte được phân bổ cho giá trị float và long int, phạm vi giá trị cho phép của chúng khác nhau rất nhiều. do hình thức trình bày nội bộ.

Thông số dài trước tên của kiểu kép chỉ ra rằng 10 byte được cấp phát cho giá trị của nó.

Hằng số dấu chấm động có kiểu kép theo mặc định. Bạn có thể chỉ định rõ ràng loại hằng số bằng cách sử dụng các hậu tố F, f (float) và L, l (long). Ví dụ, hằng số 2E + 6L sẽ có kiểu long double và hằng số 1.82f sẽ thuộc kiểu float.

Để viết các chương trình di động đến các nền tảng khác nhau, bạn không thể đưa ra giả định về kích thước của kiểu int. Để có được nó, bạn cần sử dụng thao tác sizeof, kết quả của nó là kích thước của kiểu tính bằng byte. Ví dụ: đối với hệ điều hành MS-DOS, sizeof (int) sẽ cho kết quả là 2 và đối với Windows 98 hoặc OS / 2, kết quả sẽ là 4.

Tiêu chuẩn ANSI không chỉ định phạm vi giá trị cho các loại cơ bản, chỉ xác định tỷ lệ giữa các kích thước của chúng, ví dụ:

sizeof (float) ≤ slzeof (double) ≤ sizeof (dài đôi)
sizeof (char) ≤ slzeof (ngắn) ≤ sizeof (int) ≤ sizeof (dài)

Ghi chú

Các giá trị tối thiểu và tối đa được phép cho các kiểu số nguyên phụ thuộc vào việc triển khai và được liệt kê trong tệp tiêu đề (), đặc điểm của các loại thực - trong tệp () cũng như trong mẫu lớp numeric_limits

Loại hư không

Ngoài những loại được liệt kê ở trên, kiểu void thuộc về các kiểu chính của ngôn ngữ, nhưng tập giá trị của kiểu này là trống. Nó được sử dụng để xác định các hàm không trả về giá trị, để chỉ định danh sách đối số hàm trống, làm kiểu cơ sở cho con trỏ và trong các hoạt động ép kiểu.

Phạm vi giá trị của kiểu dữ liệu đơn giản trong C ++ dành cho máy tính tương thích với PC IBM

Q: Thuật ngữ máy tính tương thích với PC IBM có nghĩa là gì?
Đáp: Máy tính tương thích với IBM PC là một máy tính có kiến ​​trúc tương tự như IBM PC, XT và AT. Máy tính tương thích với PC của IBM dựa trên bộ vi xử lý tương thích với Intel 8086 (và, như bạn đã biết, tất cả các bộ xử lý Intel phát hành sau này đều hoàn toàn tương thích ngược với 8086). Trên thực tế, đây thực tế là tất cả các máy tính hiện đại.

Nhiều kiểu số nguyên và kiểu thực khác nhau, khác nhau về phạm vi và độ chính xác của biểu diễn dữ liệu, được giới thiệu để cho phép lập trình viên sử dụng các khả năng của một phần cứng cụ thể một cách hiệu quả nhất, vì việc lựa chọn kiểu phụ thuộc vào tốc độ tính toán và số lượng bộ nhớ. Tuy nhiên, một chương trình được tối ưu hóa cho một loại máy tính có thể không di động được sang các nền tảng khác, do đó, nói chung, nên tránh sự phụ thuộc vào các đặc tính cụ thể của loại dữ liệu.

Một loại Phạm vi giá trị Kích thước (byte)
bool đúng và sai 1
ký char -128 … 127 1
ký tự không dấu 0 … 255 1
ký số ngắn -32 768 … 32 767 2
int ngắn không dấu 0 … 65 535 2
ký dài hạn -2 147 483 648 … 2 147 483 647 4
int dài không ký 0 … 4 294 967 295 4
trôi nổi 3,4e-38 ... 3,4e + 38 4
gấp đôi 1,7e-308 ... 1,7C + 308 8
dài đôi 3,4e-4932 ... 3,4e + 4932 10

Đối với kiểu thực, bảng hiển thị giá trị tuyệt đối của giá trị nhỏ nhất và giá trị lớn nhất.

Trong phần này, chúng ta sẽ xem xét các kiểu dữ liệu cơ bản trong C ++, các kiểu dữ liệu này còn được gọi là kiểu dữ liệu dựng sẵn. Ngôn ngữ lập trình C ++ là một ngôn ngữ lập trình có thể mở rộng. Có thể mở rộng có nghĩa là ngoài các kiểu dữ liệu tích hợp, bạn có thể tạo các kiểu dữ liệu của riêng mình. Do đó, có một số lượng lớn các kiểu dữ liệu trong C ++. Chúng tôi sẽ chỉ nghiên cứu những cái chính.

Bảng 1 - Các kiểu dữ liệu C ++
Một loại byte Phạm vi giá trị được chấp nhận

kiểu dữ liệu số nguyên (boolean)

bool 1 0 / 255

kiểu dữ liệu số nguyên (ký tự)

char 1 0 / 255

kiểu dữ liệu số nguyên

int ngắn 2 -32 768 / 32 767
int ngắn không dấu 2 0 / 65 535
int 4
int không dấu 4 0 / 4 294 967 295
int dài 4 -2 147 483 648 / 2 147 483 647
int dài không ký 4 0 / 4 294 967 295

kiểu dữ liệu dấu chấm động

trôi nổi 4 -2 147 483 648.0 / 2 147 483 647.0
phao dài 8
gấp đôi 8 -9 223 372 036 854 775 808 .0 / 9 223 372 036 854 775 807.0

Bảng 1 cho thấy các kiểu dữ liệu cơ bản trong C ++. Toàn bộ bảng được chia thành ba cột. Cột đầu tiên chỉ ra một từ dành riêng sẽ xác định, mỗi từ riêng, kiểu dữ liệu. Cột thứ hai cho biết số byte được cấp phát cho một biến có kiểu dữ liệu tương ứng. Cột thứ ba hiển thị phạm vi giá trị hợp lệ. Lưu ý rằng trong bảng, tất cả các kiểu dữ liệu được sắp xếp từ nhỏ nhất đến lớn nhất.

Kiểu dữ liệu Bool

Đầu tiên trong bảng là kiểu dữ liệu bool kiểu dữ liệu số nguyên, vì phạm vi giá trị hợp lệ là các số nguyên từ 0 đến 255. Nhưng như bạn đã nhận thấy, nó được viết trong dấu ngoặc đơn - một kiểu dữ liệu boolean và điều này cũng đúng. Bởi vì boolđược sử dụng riêng để lưu trữ các kết quả của biểu thức boolean. Biểu thức Boolean có thể có một trong hai kết quả, đúng hoặc sai. true - nếu biểu thức boolean là true, false - nếu biểu thức boolean là false.

Nhưng vì phạm vi giá trị hợp lệ của kiểu dữ liệu bool là từ 0 đến 255, nên bằng cách nào đó, cần phải tương quan phạm vi này với các hằng số boolean đúng và sai được xác định trong ngôn ngữ lập trình. Do đó, hằng số true tương đương với tất cả các số từ 1 đến 255, trong khi hằng số false chỉ tương đương với một số nguyên - 0. Hãy xem xét một chương trình sử dụng kiểu dữ liệu bool.

// data_type.cpp: xác định điểm vào cho ứng dụng console. #include "stdafx.h" #include sử dụng không gian tên std; int main (int argc, char * argv) (bool boolean = 25; // biến kiểu bool có tên là boolean if (boolean) // điều kiện câu lệnh if cout<< "true = " << boolean << endl; // выполнится в случае истинности условия else cout << "false = " << boolean << endl; // выполнится в случае, если условие ложно system("pause"); return 0; }

V dòng 9một biến kiểu được khai báo bool được khởi tạo thành 25. Về lý thuyết saudòng 9, trong biến boolean nó nên chứa số 25, nhưng thực tế biến này chứa số 1. Như tôi đã nói, số 0 là giá trị sai, số 1 là giá trị đúng. Điểm mấu chốt là trong một biến như bool có thể chứa hai giá trị - 0 (sai) hoặc 1 (đúng). Trong khi dưới kiểu dữ liệu bool một byte toàn bộ được cấp phát, có nghĩa là một biến kiểu bool có thể chứa các số từ 0 đến 255. Để xác định giá trị sai và đúng, chỉ cần hai giá trị là 0 và 1. Câu hỏi đặt ra: "253 giá trị kia dùng để làm gì?"

Dựa trên tình huống này, chúng tôi đồng ý sử dụng các số từ 2 đến 255 tương đương với số 1, nghĩa là đúng. Đây là lý do tại sao biến boolean chứa số 25 chứ không phải 1. Trong dòng 10 -13 tuyên bố chuyển quyền kiểm soát cho nhà điều hành trong dòng 11, nếu điều kiện là đúng, và toán tử trong dòng 13 nếu điều kiện là sai. Kết quả của chương trình được thể hiện trong Hình 1.

Đúng = 1 Nhấn phím bất kỳ để tiếp tục. ... ...

Hình 1 - Kiểu dữ liệu Bool

Kiểu dữ liệu biểu đồ

Kiểu dữ liệu char là kiểu dữ liệu số nguyên được sử dụng để biểu diễn các ký tự. Nghĩa là, mỗi ký tự tương ứng với một số nhất định từ phạm vi. Kiểu dữ liệu char còn được gọi là kiểu dữ liệu ký tự, vì có thể biểu diễn đồ họa của các ký tự trong C ++ nhờ char. Để biểu diễn các ký tự trong C ++, kiểu dữ liệu char được cấp phát một byte, trong một byte - 8 bit, sau đó chúng tôi nâng hai lên lũy thừa của 8 và nhận giá trị 256 - số ký tự có thể được mã hóa. Do đó, sử dụng kiểu dữ liệu char, bạn có thể hiển thị bất kỳ ký tự nào trong số 256 ký tự. Tất cả các ký tự được mã hóa được thể hiện bằng.

ASCII (từ Mã tiêu chuẩn Anh Mỹ để trao đổi thông tin) là mã tiêu chuẩn của Mỹ để trao đổi thông tin.

Hãy xem xét một chương trình sử dụng kiểu dữ liệu char.

// Symbol.cpp: xác định điểm vào cho ứng dụng console. #include "stdafx.h" #include sử dụng không gian tên std; int main (int argc, char * argv) (char symbol = "a"; // khai báo một biến kiểu char và khởi tạo nó bằng ký hiệu "a" cout<< "symbol = " << symbol << endl; // печать символа, содержащегося в переменной symbol char string = "сайт"; // объявление символьного массива (строки) cout << "string = " << string << endl; // печать строки system("pause"); return 0; }

Vì vậy, trong dòng 9một biến có tên được khai báo Biểu tượng , nó được gán giá trị của biểu tượng"Một" ( Mã ASCII). V dòng 10 nhà điều hành cout in ký tự có trong biến Biểu tượng. V dòng 11đã khai báo một mảng chuỗi có tên chuỗi , và kích thước của mảng được đặt ngầm định. Chuỗi được lưu trữ trong mảng chuỗi"Địa điểm" ... Lưu ý rằng khi chúng tôi lưu trữ biểu tượng vào một biến như char , sau đó sau dấu bằng, chúng tôi đặt dấu ngoặc kép, trong đó chúng tôi viết ký hiệu. Khi khởi tạo mảng chuỗi với một chuỗi nhất định, dấu ngoặc kép được đặt sau dấu bằng, trong đó một chuỗi nhất định được viết. Giống như một ký tự bình thường, các chuỗi được xuất ra bằng toán tử cout, dòng 12... Kết quả của chương trình được thể hiện trong Hình 2.

Symbol = a string = site Nhấn phím bất kỳ để tiếp tục. ... ...

Hình 2 - Kiểu dữ liệu char

Kiểu dữ liệu số nguyên

Kiểu dữ liệu số nguyên được sử dụng để biểu diễn số. Bảng 1 chứa sáu trong số chúng: int ngắn, int ngắn không dấu, int, int không dấu, int dài, int dài không dấu . Tất cả chúng đều có kích thước bộ nhớ bị chiếm dụng riêng và phạm vi giá trị được chấp nhận. Tùy thuộc vào trình biên dịch, kích thước của bộ nhớ bị chiếm dụng và phạm vi giá trị được chấp nhận có thể khác nhau. Trong Bảng 1, tất cả các phạm vi giá trị được chấp nhận và kích thước của bộ nhớ bị chiếm dụng được lấy cho trình biên dịch MVS2010. Hơn nữa, tất cả các kiểu dữ liệu trong Bảng 1 được sắp xếp theo thứ tự tăng dần về kích thước của bộ nhớ bị chiếm dụng và phạm vi giá trị được chấp nhận. Phạm vi của các giá trị được chấp nhận, theo cách này hay cách khác, phụ thuộc vào kích thước của bộ nhớ bị chiếm dụng. Theo đó, kích thước của bộ nhớ bị chiếm dụng càng lớn thì phạm vi giá trị được chấp nhận càng lớn. Ngoài ra, phạm vi giá trị được chấp nhận thay đổi nếu kiểu dữ liệu được khai báo với tiền tố unsigned - không dấu. Tiền tố không dấu có nghĩa là kiểu dữ liệu không thể lưu trữ giá trị có dấu, khi đó phạm vi giá trị dương được nhân đôi, ví dụ: kiểu dữ liệu short int và unsigned short int.

Tiền tố kiểu dữ liệu số nguyên:

ngắn ngủi tiền tố rút ngắn kiểu dữ liệu mà nó được áp dụng bằng cách giảm kích thước của bộ nhớ bị chiếm dụng;

Dài tiền tố kéo dài kiểu dữ liệu mà nó được áp dụng bằng cách tăng kích thước của bộ nhớ bị chiếm dụng;

unsigned - tiền tố tăng gấp đôi phạm vi giá trị dương, trong khi phạm vi giá trị âm không thể được lưu trữ trong kiểu dữ liệu này.

Vì vậy, về bản chất, chúng ta có một kiểu số nguyên để biểu diễn số nguyên - đây là kiểu dữ liệu int. Nhờ các tiền tố ngắn, dài, không dấu, một số kiểu dữ liệu int nhất định sẽ xuất hiện, khác nhau về kích thước của bộ nhớ bị chiếm dụng và (hoặc) phạm vi giá trị được chấp nhận.

Các kiểu dữ liệu dấu chấm động

Có hai kiểu dữ liệu dấu chấm động trong C ++: float và double. Các kiểu dữ liệu dấu phẩy động được thiết kế để lưu trữ số dấu phẩy động. Kiểu dữ liệu float và double có thể lưu trữ cả số dấu phẩy động dương và âm. Kiểu dữ liệu float có kích thước bộ nhớ nhỏ hơn hai lần so với kiểu dữ liệu kép, có nghĩa là phạm vi giá trị được chấp nhận cũng nhỏ hơn. Nếu kiểu dữ liệu float được khai báo với tiền tố dài, thì phạm vi giá trị được chấp nhận sẽ trở thành phạm vi giá trị được chấp nhận của kiểu dữ liệu kép. Về cơ bản, các kiểu dữ liệu dấu phẩy động là cần thiết để giải quyết các vấn đề với độ chính xác tính toán cao, ví dụ: giao dịch tiền.

Vì vậy, chúng tôi đã trình bày những điểm chính liên quan đến các kiểu dữ liệu cơ bản trong C ++. Nó vẫn chỉ để hiển thị tất cả các phạm vi giá trị được chấp nhận này và kích thước của bộ nhớ bị chiếm dụng đến từ đâu. Và đối với điều này, chúng tôi sẽ phát triển một chương trình sẽ tính toán các đặc điểm chính của tất cả các kiểu dữ liệu được thảo luận ở trên.

// data_types.cpp: xác định điểm vào cho ứng dụng console. #include "stdafx.h" #include // Thư viện thao tác I / O #include // tệp tiêu đề cho các hàm toán học #include sử dụng không gian tên std; int main (int argc, char * argv) (cout<< " data type " << "byte" << " " << " max value "<< endl // tiêu đề cột <<"bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; system("pause"); return 0; }

Chương trình này được thiết lập để bạn có thể xem các đặc điểm của kiểu dữ liệu trong hệ thống của mình. Không có giá trị để hiểu mã, vì chương trình sử dụng các toán tử điều khiển mà bạn rất có thể chưa biết. Đối với một người quen hời hợt với mã chương trình, tôi sẽ giải thích một số điểm dưới đây. Nhà điều hành sizeof () tính toán số byte được phân bổ cho một kiểu dữ liệu hoặc một biến. Chức năng pow (x, y) nâng cao ý nghĩa x theo lũy thừa của y , chức năng này có sẵn từ tệp tiêu đề ... Các trình thao tác fixed và setpre precision () có sẵn từ tệp tiêu đề ... Đầu tiên là cố định , gửi các giá trị ở dạng cố định đến luồng đầu ra. Người thao túng setpre precision (n) hiển thị n vị trí thập phân. Giá trị lớn nhất của một kiểu dữ liệu nhất định được tính bằng công thức sau:

Max_val_type = 2 ^ (b * 8 - 1) - 1; // đối với các kiểu dữ liệu có số âm và số dương // trong đó, b là số byte được cấp phát trong bộ nhớ cho một biến có kiểu dữ liệu này // nhân với 8, vì có 8 bit trong một byte // trừ đi 1 trong dấu ngoặc đơn , vì các số trong phạm vi phải được giảm một nửa cho các giá trị âm và dương // trừ đi 1 ở cuối, vì phạm vi số bắt đầu từ 0 // các kiểu dữ liệu có tiền tố không dấu max_val_type = 2 ^ (b * 8) - 1 ; // chỉ dành cho kiểu dữ liệu có số dương

Ví dụ về chương trình có thể được xem trong Hình 3. Cột đầu tiên hiển thị các kiểu dữ liệu cơ bản trong C ++, cột thứ hai là kích thước bộ nhớ được cấp cho mỗi kiểu dữ liệu, và cột thứ ba là giá trị lớn nhất mà dữ liệu tương ứng. loại có thể chứa. Giá trị nhỏ nhất được tìm thấy theo cùng một cách với giá trị lớn nhất. Đối với các loại dữ liệu có tiền tố không được đánh dấu, giá trị nhỏ nhất là 0.

Kiểu dữ liệu byte giá trị lớn nhất bool = 1 255.00 char = 1 255.00 short int = 2 32767.00 unsigned short int = 2 65535.00 int = 4 2147483647.00 unsigned int = 4 4294967295.00 long int = 4 2147483647.00 unsigned long int = 4 4294967295.00 float = 4 2147483647.00 double = 8 9223372036854775808.00 Nhấn phím bất kỳ để tiếp tục. ... ...

Hình 3 - Các kiểu dữ liệu C ++

Ví dụ: nếu một biến kiểu short int được gán giá trị 33000, thì lưới bit sẽ tràn vì giá trị lớn nhất trong một biến kiểu short int là 32767. Nghĩa là, một số giá trị khác sẽ được lưu trữ trong một biến thuộc loại short int, rất có thể nó sẽ là số âm. Vì chúng ta đã đề cập đến kiểu dữ liệu int, nên cần lưu ý rằng bạn có thể bỏ qua từ khóa int và viết ngắn gọn chẳng hạn. Trình biên dịch sẽ giải thích ký hiệu này là int ngắn. Điều này cũng đúng với các tiền tố dài và không có dấu. Ví dụ:

// viết tắt cho kiểu dữ liệu int short a1; // giống short int long a1; // giống long int unsigned a1; // giống như unsigned int unsigned short a1; // giống với int ngắn không dấu

Lập trình viên nói:

Xin chào! Tôi đã đọc bài viết của bạn. Tôi rất buồn và buồn cười cùng một lúc. Cụm từ này của bạn đặc biệt giết người: "Vì một biến kiểu char thường được sử dụng như một mảng, nên số lượng giá trị có thể được xác định." 😆 😆 😆
Tôi không cười bạn. Xây dựng một trang web thực sự là một kỳ công. Mình chỉ mong các bạn hỗ trợ tư vấn và chỉ ra một vài sai sót.

1. Giá trị của một biến kiểu char được gán như sau:

Nơi đây:

Char a = * "A";

Con trỏ tới mảng không được giải mã và kết quả là giá trị của phần tử đầu tiên của mảng được trả về, tức là 'MỘT'

2. Zeroing được thực hiện như sau:

Char a = NULL;
char b = ();

// Và đây là cách dòng trong phần nội dung chương trình bị xóa

"" - ký tự này được gọi là ký tự kết thúc null. Nó được đặt ở cuối dòng. Chính bạn, mà không biết điều đó, đã điền vào mảng s1 từ bài viết của mình bằng ký hiệu này. Nhưng chỉ có thể gán ký hiệu này cho phần tử 0 của mảng.

3. Hãy thoải mái sử dụng thuật ngữ.
Dấu = là một phép toán gán.
Dấu * là một thao tác chú thích.
Ý tôi là đoạn này của bài viết: "Mọi thứ hóa ra đơn giản như vậy, trước dấu = bạn phải đặt dấu * và bạn phải khai báo số phần tử (số 0 tương ứng với số đầu tiên)"

Đừng hiểu lầm tôi, bài báo như nó đứng không thể tồn tại. Đừng lười biếng, hãy viết lại nó.
Bạn có một trách nhiệm lớn! Tôi nghiêm túc đấy. Các trang trên trang web của bạn đã được đưa vào trang đầu tiên của kết quả tìm kiếm Yandex. Rất nhiều người đã bắt đầu lặp lại những sai lầm sau bạn.

Chúc may mắn! Bạn có thể xử lý nó!

:
Tôi biết điều này từ lâu, chỉ đọc lại 200 bài báo hoài để sửa cái gì cũng khó. Và một số kiểu thô lỗ viết theo cách mà ngay cả khi biết những gì tốt hơn để sửa chữa, không có mong muốn sửa chữa nó cả.

Tôi cũng sẽ rất vui khi sửa các lỗi khác. sửa những điểm không chính xác nếu chúng bật lên. Tôi đánh giá cao sự giúp đỡ của bạn. Cảm ơn bạn, mình biết điều này từ lâu rồi, chỉ đọc lại 200 bài thôi cũng thấy khó sửa cái gì đó. Và một số kiểu thô lỗ viết theo cách mà ngay cả khi biết những gì tốt hơn để sửa chữa, không có mong muốn sửa chữa nó cả.
Với char của bạn b = (); Đây không phải là số không ở tất cả. sẽ kiểm tra ít nhất b.
nếu chúng ta nói về ký tự null ""; Tôi biết rất rõ khi tôi điền vào dòng với chúng và mục đích là để thể hiện sự sạch sẽ thực sự, và không thể nhìn thấy bằng mắt, vì dòng bao gồm rác, đôi khi gây cản trở. Bạn sẽ cẩn thận hơn với các điều khoản, "ký tự kết thúc bằng null" hoặc chỉ "ký tự null", không phải dấu chấm dứt))) Và ký tự terminator nghe thật tuyệt.

Tôi đang hiện đại hóa bài viết, nhưng tôi sẽ không chuyển sang văn phong của người khác. Nếu tôi nghĩ rằng nó rõ ràng hơn cho một người mới bắt đầu theo cách này, và không phải theo cách anh ta muốn, thì tôi sẽ để nó theo cách đó. Bạn cũng đừng hiểu lầm tôi. Từ "dấu hiệu" dễ hiểu và dễ nhớ đối với người mới bắt đầu hơn là định nghĩa và tên của mỗi dấu hiệu. Hoàn toàn không có sự nhầm lẫn trong việc này, dấu hiệu là - dấu hiệu. Ít nhấn mạnh vào một thứ sẽ nhấn mạnh nhiều hơn vào thứ khác.

Tôi cũng sẽ rất vui khi sửa các lỗi khác. sửa những điểm không chính xác nếu chúng bật lên. Tôi đánh giá cao sự giúp đỡ của bạn. Cảm ơn bạn.

Xin chào lần nữa!
Tôi muốn làm rõ. Thuật ngữ "zero-terminator" (kẻ hủy diệt) đã được sử dụng bởi giáo viên của tôi ở trường đại học. Rõ ràng đây là trường cũ!
Đối với dòng nulling.
char b = (); Đây thực sự là zeroing. Toàn bộ mảng được điền bằng các số không. Không tin - hãy xem thử!
Nếu chúng ta xem xét một chuỗi theo nghĩa tự nhiên, hàng ngày của nó, thì "trống" sẽ là chuỗi không có một ký tự nào. Do đó, trong 99,9% trường hợp, chỉ cần thêm một ký tự rỗng là đủ. Thông thường, quá trình xử lý một chuỗi đi đến ký tự null đầu tiên và những ký tự nào theo sau nó không còn quan trọng nữa. Tôi hiểu rằng bạn muốn xóa chuỗi. Tôi vừa quyết định cung cấp một phiên bản cổ điển đã được thử nghiệm theo thời gian.

:
Khi "Thông thường quá trình xử lý chuỗi chuyển đến ký tự rỗng đầu tiên và những ký tự nào theo sau nó không còn quan trọng nữa" - có, chuỗi được đặt lại về 0
Nếu chúng ta coi "số 0 thực của tất cả các ô trong chuỗi (mà tôi đã viết về)" - không, không phải là số 0 và ngay cả ký tự đầu tiên cũng không phải là số 0. Tôi đã kiểm tra tùy chọn này. MinGW (CodeBlock) - toàn bộ mảng cho ký tự "a"
Tôi không nghĩ rằng đây là một lý do để tranh cãi.

Một sự khác biệt quan trọng giữa ngôn ngữ C và các ngôn ngữ khác (PL1, FORTRAN, v.v.) là không có nguyên tắc mặc định, dẫn đến nhu cầu khai báo tất cả các biến được sử dụng trong chương trình một cách rõ ràng cùng với chỉ báo về kiểu tương ứng của chúng. .

Khai báo biến có định dạng sau:

[memory-class-specifier] type-specifier specifier [= khởi xướng] [, specifier [= khởi tạo]] ...

Bộ mô tả là số nhận dạng của một biến đơn giản hoặc một cấu trúc phức tạp hơn với dấu ngoặc vuông, dấu ngoặc đơn hoặc dấu hoa thị (một tập hợp các dấu hoa thị).

Bộ chỉ định kiểu là một hoặc nhiều từ khóa xác định kiểu của biến đang được khai báo. Ngôn ngữ C có một tập hợp các kiểu dữ liệu tiêu chuẩn có thể được sử dụng để xây dựng các kiểu dữ liệu mới (duy nhất).

Trình khởi tạo - chỉ định giá trị ban đầu hoặc danh sách các giá trị ban đầu (mà) được gán cho một biến khi được khai báo.

Bộ chỉ định lớp bộ nhớ được xác định bởi một trong bốn từ khóa của ngôn ngữ C: auto, extern, register, static và cho biết bộ nhớ sẽ được cấp phát như thế nào cho biến đã khai báo, mặt khác, phạm vi của biến này, tức là từ phần nào của chương trình bạn có thể tham chiếu đến nó.

1.2.1 Các loại kiểu dữ liệu

Từ khóa để xác định các kiểu dữ liệu cơ bản

Kiểu số nguyên: Kiểu nổi: char float int kép ngắn dài kép dài đã ký không dấu

Một biến thuộc bất kỳ kiểu nào cũng có thể được khai báo là không thể thay đổi. Điều này được thực hiện bằng cách thêm từ khóa const vào kiểu định nghĩa. Các đối tượng Const đại diện cho dữ liệu chỉ đọc, tức là biến này không thể được gán một giá trị mới. Lưu ý rằng nếu không có type-specifier sau từ const, thì kiểu-specifier int được giả định. Nếu từ khóa const đứng trước khai báo các kiểu kết hợp (mảng, cấu trúc, hỗn hợp, kiểu liệt kê), thì điều này dẫn đến thực tế là mỗi phần tử cũng phải là không thể thay đổi, tức là nó chỉ có thể được gán giá trị một lần.

Const đôi A = 2,128E-2; const B = 286; (ngụ ý const int B = 286)

Các ví dụ về khai báo dữ liệu tổng hợp sẽ được thảo luận dưới đây.

1.2.2. Kiểu dữ liệu số nguyên

Để xác định dữ liệu kiểu số nguyên, các từ khóa khác nhau được sử dụng để xác định phạm vi giá trị và kích thước của vùng bộ nhớ được cấp phát cho các biến (Bảng 6).

Bảng 6

Lưu ý rằng các từ khóa có dấu và không dấu là tùy chọn. Chúng cho biết cách bit 0 của biến đã khai báo được diễn giải, nghĩa là, nếu từ khóa unsigned được chỉ định, thì bit 0 được hiểu là một phần của số, ngược lại bit 0 được hiểu là có dấu. Nếu không có từ khóa unsigned, biến số nguyên được coi là có dấu. Trong trường hợp mã định kiểu bao gồm kiểu khóa có dấu hoặc không dấu và sau đó định danh biến theo sau, thì nó sẽ được coi là một biến của kiểu int. Ví dụ:

Int n không dấu; int không dấu b; int c; (đã ký int c được ngụ ý); không dấu d; (ngụ ý không dấu int d); ký f; (ngụ ý đã ký int f).

Lưu ý rằng công cụ sửa đổi char được sử dụng để biểu diễn một ký tự (từ một mảng biểu diễn ký tự) hoặc để khai báo các ký tự của chuỗi. Giá trị của một đối tượng kiểu char là một đoạn mã (kích thước 1 byte) tương ứng với ký tự cần biểu diễn. Để đại diện cho các ký tự của bảng chữ cái tiếng Nga, công cụ sửa đổi kiểu nhận dạng dữ liệu có dạng không dấu, vì mã của các chữ cái tiếng Nga vượt quá giá trị 127.

Nhận xét sau đây cần được thực hiện: ngôn ngữ C không xác định một biểu diễn bộ nhớ và một phạm vi giá trị cho các số nhận dạng có bổ ngữ int và unsigned int. Kích thước bộ nhớ cho một biến có sửa đổi int có dấu được xác định bởi độ dài của từ máy, có các kích thước khác nhau trên các máy khác nhau. Vì vậy, trên máy 16 bit, kích thước từ tương ứng bằng 2 byte, trên máy 32 bit, tương ứng là 4 byte, tức là kiểu int tương đương với kiểu int ngắn hoặc int dài, tùy thuộc vào kiến ​​trúc của PC được sử dụng. Do đó, cùng một chương trình có thể hoạt động chính xác trên một máy tính và không hoạt động chính xác trên máy tính khác. Để xác định độ dài bộ nhớ bị chiếm bởi một biến, bạn có thể sử dụng phép toán sizeof của ngôn ngữ C, phép toán này trả về giá trị độ dài của kiểu bổ trợ được chỉ định.

Ví dụ:

A = sizeof (int); b = sizeof (long int); c = sizeof (dài không dấu); d = sizeof (ngắn);

Cũng lưu ý rằng các hằng số bát phân và thập lục phân cũng có thể có công cụ sửa đổi không dấu. Điều này đạt được bằng cách chỉ định tiền tố u hoặc U sau hằng số; một hằng số không có tiền tố này được coi là có dấu.

Ví dụ:

0xA8C (int đã ký); 01786l (ký dài); 0xF7u (int unsigned);

1.2.3. Dữ liệu nổi

Đối với các biến đại diện cho một số dấu phẩy động, các công cụ sửa đổi kiểu sau được sử dụng: float, double, long double (trong một số triển khai của ngôn ngữ C dài đôi vắng mặt).

Giá trị float chiếm 4 byte. Trong số này, 1 byte được dành cho dấu, 8 bit cho số mũ thừa và 23 bit cho phần định trị. Lưu ý rằng bit quan trọng nhất của phần định trị luôn là 1, vì vậy nó không được lấp đầy; do đó, phạm vi giá trị của biến dấu phẩy động là khoảng 3,14E-38 đến 3,14E + 38.

Một đôi chiếm 8 bit trong bộ nhớ. Định dạng của nó tương tự như định dạng của float. Các bit bộ nhớ được cấp phát như sau: 1 bit cho dấu hiệu, 11 bit cho số mũ và 52 bit cho phần định trị. Có tính đến bit bậc cao bị bỏ qua của phần định trị, phạm vi giá trị là từ 1,7E-308 đến 1,7E + 308.

Phao f, a, b; nhân đôi x, y;

1.2.4. Con trỏ

Con trỏ là địa chỉ của bộ nhớ được cấp phát để đặt mã định danh (tên của một biến, mảng, cấu trúc hoặc chuỗi ký tự có thể được sử dụng làm mã định danh). Trong trường hợp một biến được khai báo là một con trỏ, thì nó chứa một địa chỉ bộ nhớ mà tại đó giá trị vô hướng của bất kỳ kiểu nào cũng có thể được tìm thấy. Khi khai báo một biến kiểu con trỏ, cần phải xác định kiểu của đối tượng dữ liệu, địa chỉ của đối tượng đó sẽ chứa biến và tên của con trỏ, đứng trước dấu hoa thị (hoặc một nhóm dấu sao). Định dạng khai báo con trỏ:

type-specifier [sửa đổi] * specifier.

Type-specifier chỉ định kiểu của đối tượng và có thể thuộc bất kỳ kiểu cơ bản, kiểu cấu trúc, hỗn hợp nào (điều này sẽ được thảo luận bên dưới). Bằng cách chỉ định từ khóa void thay vì chỉ định kiểu, theo một cách đặc biệt, có thể trì hoãn đặc tả của kiểu mà con trỏ đề cập đến. Một biến được khai báo như một con trỏ đến kiểu void có thể được sử dụng để tham chiếu đến một đối tượng thuộc bất kỳ kiểu nào. Tuy nhiên, để có thể thực hiện các phép toán số học và logic trên con trỏ hoặc trên các đối tượng mà chúng trỏ tới, cần phải xác định rõ ràng loại đối tượng khi thực hiện mỗi phép toán. Các định nghĩa kiểu như vậy có thể được thực hiện bằng thao tác ép kiểu.

Các từ khóa const, near, far, giant có thể được sử dụng làm bổ ngữ khi khai báo một con trỏ. Từ khóa const chỉ ra rằng con trỏ không thể thay đổi trong chương trình. Kích thước của một biến được khai báo dưới dạng con trỏ phụ thuộc vào kiến ​​trúc của máy tính và vào mô hình bộ nhớ được sử dụng mà chương trình sẽ được biên dịch. Các con trỏ đến các kiểu dữ liệu khác nhau không nhất thiết phải có cùng độ dài.

Các từ khóa gần, xa, lớn có thể được sử dụng để sửa đổi kích thước của con trỏ.

Int không dấu * a; / * biến a là một con trỏ đến kiểu int unsigned (số nguyên không dấu) * / double * x; / * biến x cho biết kiểu dữ liệu dấu chấm động có độ chính xác kép * / char * fuffer; / * một con trỏ có tên fuffer được khai báo trỏ đến một biến kiểu char * / double nomer; void * addres; addres = & nomer; (double *) addres ++; / * Biến addres được khai báo như một con trỏ tới một đối tượng thuộc bất kỳ kiểu nào. Do đó, nó có thể được gán địa chỉ của bất kỳ đối tượng nào (& là hoạt động tính toán một địa chỉ). Tuy nhiên, như đã lưu ý ở trên, không có phép toán số học nào có thể được thực hiện trên một con trỏ cho đến khi loại dữ liệu mà nó trỏ tới được xác định rõ ràng. Điều này có thể được thực hiện bằng cách sử dụng một hoạt động ép kiểu (double *) để chuyển đổi addres thành một con trỏ để nhân đôi và sau đó tăng địa chỉ. * / const * dr; / * Biến dr được khai báo như một con trỏ đến một biểu thức hằng, tức là giá trị của một con trỏ có thể thay đổi trong quá trình thực thi chương trình, nhưng giá trị mà nó trỏ tới thì không thể. * / unsigned char * const w = & obj. / * Biến w được khai báo là một con trỏ hằng đến dữ liệu kiểu char unsigned. Điều này có nghĩa là trong toàn bộ chương trình, w sẽ trỏ đến cùng một vùng bộ nhớ. Nội dung của khu vực này có thể được thay đổi. * /

1.2.5. Các biến được liệt kê

Một biến có thể nhận một giá trị từ một số danh sách các giá trị được gọi là một biến liệt kê hoặc một kiểu liệt kê.

Một khai báo liệt kê bắt đầu bằng từ khóa enum và có hai định dạng trình bày.

Định dạng 1. enum [enum-tag-name] (enumeration-list) descriptor [, descriptor ...];

Định dạng 2. enum enum-tag-name descriptor [, descriptor ..];

Một khai báo liệt kê chỉ định kiểu của một biến liệt kê và xác định một danh sách các hằng số được đặt tên gọi là enumeration-list. Giá trị của mỗi tên danh sách là một số nguyên.

Một biến của kiểu liệt kê có thể nhận các giá trị của một trong các hằng số được đặt tên trong danh sách. Hằng số danh sách được đặt tên có kiểu int. Do đó, bộ nhớ tương ứng với biến liệt kê là bộ nhớ cần thiết để chứa một giá trị int.

Các biến kiểu enum có thể được sử dụng trong các biểu thức chỉ số và như các toán hạng trong các phép toán số học và quan hệ.

Ở định dạng đầu tiên 1, tên và giá trị của kiểu liệt kê được chỉ định trong danh sách kiểu liệt kê. Tên thẻ liệt kê tùy chọn là một định danh đặt tên cho thẻ liệt kê được xác định bởi danh sách điều tra. Bộ mô tả đặt tên cho một biến liệt kê. Có thể chỉ định nhiều hơn một biến của kiểu liệt kê trong một khai báo.

Liệt kê danh sách chứa một hoặc nhiều cấu trúc của biểu mẫu:

định danh [= biểu thức hằng]

Mỗi định danh đặt tên cho một phần tử của kiểu liệt kê. Tất cả id trong danh sách enum phải là duy nhất. Trong trường hợp không có biểu thức hằng, số nhận dạng đầu tiên tương ứng với giá trị 0, số nhận dạng tiếp theo tương ứng với giá trị 1, v.v. Tên của một hằng số tương đương với giá trị của nó.

Giá trị nhận dạng được liên kết với một biểu thức hằng nhận giá trị được chỉ định bởi biểu thức hằng số đó. Một biểu thức hằng phải có kiểu int và có thể là số dương hoặc số âm. Số nhận dạng tiếp theo trong danh sách được gán một giá trị biểu thức không đổi cộng với 1 nếu số nhận dạng đó không có biểu thức hằng số. Việc sử dụng thành viên điều tra phải tuân theo các quy tắc sau:

1. Một biến có thể chứa các giá trị trùng lặp.

2. Định danh trong danh sách phải khác biệt với tất cả các định danh khác trong cùng phạm vi, kể cả tên biến thông thường và số nhận dạng từ các danh sách khác.

3. Tên của các kiểu liệt kê phải khác biệt với tên của các kiểu, cấu trúc và hỗn hợp khác trong cùng một phạm vi.

4. Giá trị có thể theo sau phần tử cuối cùng của danh sách liệt kê.

Tuần tuyển sinh (SUB = 0, / * 0 * / VOS = 0, / * 0 * / POND, / * 1 * / VTOR, / * 2 * / SRED, / * 3 * / HETV, / * 4 * / PJAT / * 5 * /) rab_ned;

Trong ví dụ này, tuần thẻ được liệt kê được khai báo, với tập giá trị tương ứng và biến rab_ned được khai báo thuộc loại tuần.

Định dạng thứ hai sử dụng tên của thẻ liệt kê để tham chiếu đến một kiểu liệt kê được xác định ở nơi khác. Tên thẻ liệt kê phải tham chiếu đến một thẻ liệt kê đã được xác định trong phạm vi hiện tại. Vì thẻ enum được khai báo ở một nơi khác, nên kiểu liệt kê không có trong khai báo.

Khi khai báo một con trỏ tới một kiểu dữ liệu liệt kê và khai báo các typedef cho các kiểu liệt kê, bạn có thể sử dụng tên của thẻ liệt kê trước khi thẻ liệt kê đó được xác định. Tuy nhiên, định nghĩa của một kiểu liệt kê phải đặt trước bất kỳ hành động nào của con trỏ được sử dụng đối với kiểu khai báo typedef. Một khai báo không có danh sách các bộ mô tả tiếp theo mô tả một thẻ hoặc, nếu tôi có thể nói như vậy, một mẫu liệt kê.

1.2.6. Mảng

Mảng là một nhóm các phần tử cùng kiểu (double, float, int, v.v.). Từ việc khai báo một mảng, trình biên dịch phải thu được thông tin về kiểu của các phần tử mảng và số lượng của chúng. Khai báo mảng có hai định dạng:

bộ mô tả type-specifier [hằng số - biểu thức];

xử lý kiểu-đặc tả;

Bộ mô tả là một định danh mảng.

Type-specifier chỉ định kiểu của các phần tử của mảng đã khai báo. Phần tử mảng không được là hàm và phần tử void.

Biểu thức hằng trong ngoặc chỉ định số phần tử trong mảng. Có thể bỏ qua biểu thức Const khi khai báo mảng trong các trường hợp sau:

Khi được khai báo, mảng được khởi tạo,

Mảng được khai báo như một tham số chính thức của hàm,

Trong ngôn ngữ C, chỉ có mảng một chiều được xác định, nhưng vì một phần tử mảng có thể là một mảng, bạn cũng có thể xác định mảng nhiều chiều. Chúng được chính thức hóa bởi một danh sách các biểu thức hằng theo sau mã định danh mảng, với mỗi biểu thức hằng được đặt trong dấu ngoặc vuông riêng của nó.

Mỗi biểu thức hằng trong dấu ngoặc vuông xác định số phần tử trong một chiều nhất định của mảng, do đó, khai báo mảng hai chiều chứa hai biểu thức hằng, một biểu thức ba chiều, v.v. Lưu ý rằng trong ngôn ngữ C, phần tử đầu tiên của mảng có chỉ số bằng 0.

Int a; / * được biểu diễn dưới dạng ma trận a a a a a a * / double b; / * vector của 10 phần tử kiểu double * / int w = ((2, 3, 4), (3, 4, 8), (1, 0, 9));

Ví dụ cuối cùng khai báo một mảng w. Danh sách đặt trong dấu ngoặc nhọn tương ứng với chuỗi mảng; nếu không có dấu ngoặc, quá trình khởi tạo sẽ không được thực hiện chính xác.

Trong ngôn ngữ C, bạn có thể sử dụng các lát mảng, như trong các ngôn ngữ cấp cao khác (PL1, v.v.), tuy nhiên, một số hạn chế được áp đặt đối với việc sử dụng các lát. Các phần được hình thành bằng cách bỏ qua một hoặc nhiều cặp dấu ngoặc vuông. Các cặp dấu ngoặc vuông chỉ có thể được bỏ từ phải sang trái và tuần tự nghiêm ngặt. Các phần của mảng được sử dụng trong việc tổ chức quá trình tính toán trong các chức năng của ngôn ngữ C, do người dùng phát triển.

Nếu khi gọi một hàm, viết s, thì chuỗi số 0 của mảng s sẽ được chuyển.

Khi truy cập vào mảng b, bạn có thể viết, ví dụ: b và một vectơ gồm bốn phần tử sẽ được chuyển và truy cập b sẽ cho một mảng hai chiều là 3 x 4. Bạn không thể viết b, ngụ ý rằng một vectơ sẽ là được thông qua, bởi vì điều này không tuân thủ giới hạn áp dụng cho các phần sử dụng của mảng.

Ví dụ về khai báo mảng ký tự.

char str = "khai báo một mảng ký tự";

Lưu ý rằng có một phần tử nữa trong một ký tự, vì phần tử cuối cùng là chuỗi thoát "\ 0".

1.2.7. cấu trúc

Cấu trúc là một đối tượng phức hợp có chứa các phần tử thuộc bất kỳ kiểu nào, ngoại trừ các hàm. Không giống như mảng, là một đối tượng đồng nhất, cấu trúc có thể không đồng nhất. Kiểu cấu trúc được xác định bởi một bản ghi có dạng:

struct (danh sách định nghĩa)

Cấu trúc phải chứa ít nhất một thành phần. Định nghĩa về cấu trúc như sau:

bộ mô tả kiểu dữ liệu;

trong đó kiểu dữ liệu chỉ ra kiểu cấu trúc cho các đối tượng được xác định trong bộ mô tả. Ở dạng đơn giản nhất của chúng, bộ mô tả là số nhận dạng hoặc mảng.

Struct (kép x, y;) s1, s2, sm; struct (int year; char moth, day;) date1, date2;

Các biến s1, s2 được định nghĩa là cấu trúc, mỗi biến bao gồm hai thành phần x và y. Biến sm được định nghĩa là một mảng gồm chín cấu trúc. Mỗi một trong hai biến date1, date2 bao gồm ba thành phần year, moth, day. > p> Có một cách khác để liên kết tên với kiểu cấu trúc, nó dựa trên việc sử dụng thẻ cấu trúc. Thẻ cấu trúc tương tự như thẻ liệt kê. Thẻ cấu trúc được định nghĩa như sau:

thẻ struct (danh sách các mô tả;);

trong đó thẻ là số nhận dạng.

Trong ví dụ dưới đây, thẻ sinh viên được mô tả như một thẻ cấu trúc:

Struct student (char name; int id, age; char prp;);

Thẻ cấu trúc được sử dụng để sau đó khai báo cấu trúc của một loại nhất định trong biểu mẫu:

mã định danh thẻ struct;

struct Studeut st1, st2;

Việc sử dụng các thẻ cấu trúc là cần thiết để mô tả cấu trúc đệ quy. Việc sử dụng các thẻ cấu trúc đệ quy được thảo luận dưới đây.

Nút cấu trúc (int data; struct node * next;) st1_node;

Thẻ cấu trúc nút thực sự là đệ quy vì nó được sử dụng trong mô tả của chính nó, tức là trong quá trình chính thức hóa con trỏ tiếp theo. Các cấu trúc không thể đệ quy trực tiếp, tức là một cấu trúc nút không thể chứa một thành phần là cấu trúc nút, nhưng bất kỳ cấu trúc nào cũng có thể có một thành phần là con trỏ đến kiểu của nó, như được thực hiện trong ví dụ trên.

Các thành phần cấu trúc được truy cập bằng cách chỉ định tên cấu trúc và phần sau, được phân tách bằng dấu chấm, tên của thành phần đã chọn, ví dụ:

St1.name = "Ivanov"; st2.id = st1.id; st1_node.data = st1.age;

1.2.8. Hiệp hội (hỗn hợp)

Một union tương tự như một cấu trúc, tuy nhiên, tại bất kỳ thời điểm nào, chỉ một trong các phần tử union có thể được sử dụng (hay nói cách khác là có thể đáp ứng). Loại liên minh có thể được chỉ định như sau:

Union (mô tả phần tử 1; ... mô tả phần tử n;);

Đặc điểm chính của union là cùng một vùng bộ nhớ được cấp phát cho mỗi phần tử đã khai báo, tức là chúng chồng lên nhau. Mặc dù có thể truy cập vào vùng bộ nhớ này bằng cách sử dụng bất kỳ phần tử nào, phần tử cho mục đích này phải được chọn để kết quả không vô nghĩa.

Các thành viên công đoàn được truy cập theo cùng một cách với các cấu trúc. Thẻ union có thể được chính thức hóa theo cách tương tự như thẻ cấu trúc.

Công đoàn được sử dụng cho các mục đích sau:

Khởi tạo đối tượng bộ nhớ đã sử dụng, nếu tại bất kỳ thời điểm nào chỉ có một đối tượng trong số nhiều đối tượng đang hoạt động;

Diễn giải biểu diễn cơ bản của một đối tượng thuộc một kiểu như thể đối tượng đã được gán cho một kiểu khác.

Bộ nhớ tương ứng với một biến của kiểu liên minh được xác định bởi số lượng cần thiết để chứa thành viên dài nhất của liên minh. Khi một phần tử ngắn hơn được sử dụng, một biến kiểu liên hợp có thể chứa bộ nhớ không sử dụng. Tất cả các phần tử của liên hiệp được lưu trữ trong cùng một vùng bộ nhớ, bắt đầu tại cùng một địa chỉ.

Union (char fio; char adres; int vozrast; int telefon;) thông báo; union (int ax; char al;) ua;

Khi sử dụng đối tượng thông tin của loại union, bạn chỉ có thể xử lý phần tử đã nhận giá trị, tức là sau khi gán giá trị cho phần tử Inform.fio, việc tham chiếu đến các phần tử khác không có ý nghĩa gì. Kết hợp ua cho phép truy cập riêng biệt vào các byte ua.al dưới và ua.al trên của số hai byte ua.ax.

1.2.9. Các trường bit

Thành viên cấu trúc có thể là một trường bit cung cấp quyền truy cập vào các bit bộ nhớ riêng lẻ. Các trường bit không thể được khai báo bên ngoài cấu trúc. Bạn cũng không thể tổ chức các mảng trường bit và bạn không thể áp dụng thao tác xác định địa chỉ cho các trường. Nói chung, kiểu cấu trúc có trường bit được chỉ định như sau:

Cấu trúc (số nhận dạng không dấu 1: độ dài trường 1; số nhận dạng không dấu 2: độ dài trường 2;)

length - các trường được chỉ định dưới dạng một biểu thức số nguyên hoặc hằng số. Hằng số này xác định số lượng bit được gán cho trường tương ứng. Trường có độ dài bằng 0 cho biết sự liên kết với ranh giới từ tiếp theo.

Struct (không dấu a1: 1; không dấu a2: 2; không dấu a3: 5; không dấu a4: 2;) prim;

Cấu trúc trường bit cũng có thể chứa các thành phần ký tự. Các thành phần như vậy được tự động đặt trên các ranh giới từ thích hợp và một số bit của các từ có thể vẫn chưa được sử dụng.

1.2.10. Các biến có cấu trúc có thể thay đổi

Thông thường, một số đối tượng chương trình thuộc cùng một lớp, chỉ khác nhau ở một số chi tiết. Ví dụ, hãy xem xét sự trình bày của các hình dạng hình học. Thông tin chung về hình dạng có thể bao gồm các yếu tố như diện tích, chu vi. Tuy nhiên, thông tin liên quan về kích thước hình học có thể khác nhau tùy thuộc vào hình dạng của chúng.

Hãy xem xét một ví dụ trong đó thông tin về các hình dạng hình học được trình bày dựa trên việc sử dụng kết hợp cấu trúc và liên kết.

Hình cấu trúc (diện tích gấp đôi, perimetr; / * các thành phần chung * / kiểu int; / * thuộc tính thành phần * / union / * liệt kê các thành phần * / (bán kính kép; / * hình tròn * / kép a; / * hình chữ nhật * / kép b ; / * hình tam giác * /) geom_fig;) fig1, fig2;

Nói chung, mỗi đối tượng hình sẽ bao gồm ba thành phần: diện tích, đặc điểm, loại. Thành phần kiểu được gọi là nhãn thành phần hoạt động vì nó được sử dụng để chỉ ra thành phần nào của liên hiệp geom_fig hiện đang hoạt động. Cấu trúc như vậy được gọi là cấu trúc biến đổi vì các thành phần của nó thay đổi tùy thuộc vào giá trị nhãn của thành phần hoạt động (giá trị của kiểu).

Lưu ý rằng thay vì thành phần kiểu của kiểu int, bạn nên sử dụng kiểu liệt kê. Ví dụ, chẳng hạn

Enum figure_chess (CIRCLE, BOX, TRIANGLE);

Các hằng CIRCLE, BOX, TRIANGLE sẽ lần lượt nhận các giá trị 0, 1, 2. Biến kiểu có thể được khai báo là có kiểu liệt kê:

kiểu enum figure_chess;

Trong trường hợp này, trình biên dịch C sẽ cảnh báo lập trình viên về các nhiệm vụ có thể có sai sót, chẳng hạn như,

figure.type = 40;

Nói chung, một biến cấu trúc sẽ bao gồm ba phần: tập hợp các thành phần chung, nhãn thành phần hoạt động và một phần có các thành phần biến. Dạng tổng quát của một cấu trúc biến như sau:

Cấu trúc (các thành phần chung; nhãn thành phần hoạt động; union (mô tả thành phần 1; mô tả thành phần 2; ::: mô tả thành phần n;) union-IDfier;) cấu trúc-định danh;

Ví dụ về việc xác định một biến cấu trúc có tên là helth_record

Cấu trúc (/ * thông tin chung * / tên char; / * tên * / int age; / * tuổi * / char giới tính; / * giới tính * / / * nhãn của thành phần hoạt động * / / * (tình trạng hôn nhân) * / enum Merital_status ins; / * phần biến * / union (/ * single * / / * không có thành phần * / struct (/ * kết hôn * / char marripge_date; char girlfriend_name; int no_children;) Marriage_info; / * đã ly hôn * / char date_divorced;) marital_info ;) Hồ sơ sức khỏe; enum marital_status (SINGLE, / * độc thân * / MARRIGO, / * đã kết hôn * / DIVOREED / * đã ly hôn * /);

Bạn có thể tham khảo các thành phần của cấu trúc bằng cách sử dụng các liên kết:

Helth_record.neme, helth_record.ins, helth_record.marriage_info.marriage_date.

1.2.11. Xác định đối tượng và kiểu

Như đã đề cập ở trên, tất cả các biến được sử dụng trong chương trình C đều phải được khai báo. Kiểu của biến được khai báo phụ thuộc vào từ khóa nào được sử dụng làm mã định kiểu và liệu từ chỉ định là một mã định danh đơn giản hay là sự kết hợp của một số nhận dạng với một công cụ sửa đổi con trỏ (dấu hoa thị), một mảng (dấu ngoặc vuông) hay một hàm (dấu ngoặc ).

Khi khai báo một biến đơn giản, cấu trúc, hỗn hợp hoặc liên hợp hoặc một kiểu liệt kê, bộ mô tả là một định danh đơn giản. Để khai báo một con trỏ, mảng hoặc hàm, mã định danh được sửa đổi cho phù hợp: với dấu hoa thị ở bên trái, hình vuông hoặc dấu ngoặc đơn ở bên phải.

Lưu ý một đặc điểm quan trọng của ngôn ngữ C, khi khai báo nhiều hơn một bổ ngữ có thể được sử dụng đồng thời, điều này có thể tạo ra nhiều bộ mô tả kiểu phức tạp khác nhau.

Tuy nhiên, cần phải nhớ rằng không cho phép một số kết hợp của các bổ ngữ:

Các phần tử của mảng không được là hàm,

Các hàm không thể trả về mảng hoặc hàm.

Khi khởi tạo bộ mô tả phức tạp, dấu ngoặc vuông và dấu ngoặc đơn (ở bên phải mã định danh) được ưu tiên hơn dấu hoa thị (bên trái mã định danh). Dấu ngoặc đơn hoặc dấu ngoặc đơn có cùng mức độ ưu tiên và mở rộng từ trái sang phải. Bộ chỉ định kiểu được xem xét trong bước cuối cùng, khi bộ chỉ định đã được diễn giải đầy đủ. Bạn có thể sử dụng dấu ngoặc đơn để thay đổi thứ tự diễn giải nếu cần.

Để giải thích các mô tả phức tạp, một quy tắc đơn giản được đề xuất, nghe giống như "từ trong ra ngoài" và bao gồm bốn bước.

1. Bắt đầu với một mã định danh và nhìn sang bên phải để xem có dấu ngoặc đơn hoặc dấu ngoặc đơn hay không.

2. Nếu đúng như vậy, hãy diễn giải phần này của bộ mô tả và sau đó nhìn sang bên trái để tìm dấu hoa thị.

3. Nếu ở bất kỳ giai đoạn nào bên phải có dấu ngoặc đóng, thì trước tiên cần phải áp dụng tất cả các quy tắc này bên trong dấu ngoặc, sau đó tiếp tục giải thích.

4. Diễn giải thông số kiểu.

Int * (* comp) (); 6 5 3 1 2 4

Trong ví dụ này, biến comp (1) được khai báo là một mảng gồm mười (2) con trỏ (3) đến hàm (4) trả về con trỏ (5) thành giá trị nguyên (6).

Char * (* (* var) ()); 7 6 4 2 1 3 5

Biến var (1) được khai báo như một con trỏ (2) đến một hàm (3) trả về một con trỏ (4) cho một mảng (5) gồm 10 phần tử, là các con trỏ (6) đến các giá trị char.

Ngoài việc khai báo các biến kiểu, có thể khai báo các kiểu. Điều này có thể được thực hiện theo hai cách. Cách đầu tiên là cung cấp tên thẻ khi khai báo cấu trúc, liên hiệp hoặc kiểu liệt kê, sau đó sử dụng tên đó trong khai báo biến và hàm làm tham chiếu đến thẻ đó. Hai là sử dụng từ khóa typedef để khai báo kiểu.

Khi khai báo với từ khóa typedef, định danh thay cho đối tượng được mô tả là tên của kiểu dữ liệu đang được xem xét, và sau đó kiểu này có thể được sử dụng để khai báo các biến.

Lưu ý rằng bất kỳ kiểu nào cũng có thể được khai báo bằng từ khóa typedef, bao gồm các kiểu con trỏ, hàm hoặc mảng. Tên với từ khóa typedef cho các kiểu con trỏ, cấu trúc, liên hợp có thể được khai báo trước khi các kiểu này được định nghĩa, nhưng trong phạm vi của người khai báo.

Typedef double (* MATH) (); / * MATH - tên kiểu mới đại diện cho một con trỏ đến một hàm trả về giá trị kép * / MATH cos; / * cos là một con trỏ đến một hàm trả về các giá trị kiểu double * / / * Có thể thực hiện một khai báo tương đương * / double (* cos) (); typedef char FIO / * FIO - mảng bốn mươi ký tự * / FIO người; / * Biến người là một mảng bốn mươi ký tự * / / * Điều này tương đương với việc khai báo * / char person;

Khi khai báo các biến và kiểu, tên kiểu đã được sử dụng ở đây (MATH FIO). Ngoài ra, tên kiểu có thể được sử dụng trong ba trường hợp khác: trong danh sách các tham số chính thức, trong khai báo các hàm, trong các hoạt động của kiểu ép kiểu và trong hoạt động sizeof (hoạt động của kiểu ép kiểu).

Tên kiểu cho các kiểu cơ bản, kiểu liệt kê, cấu trúc và hỗn hợp là những định nghĩa kiểu cho những kiểu đó. Tên kiểu cho con trỏ mảng và kiểu hàm được chỉ định bằng cách sử dụng các bộ mô tả trừu tượng như sau:

type-specifier abstract-descriptor;

Tóm tắt bộ mô tả là một bộ mô tả không có mã định danh bao gồm một hoặc nhiều bộ sửa đổi con trỏ, mảng hoặc hàm. Công cụ sửa đổi con trỏ (*) luôn được đưa ra trước số nhận dạng trong bộ mô tả, và công cụ sửa đổi mảng và hàm () luôn được chỉ định sau nó. Do đó, để diễn giải một bộ mô tả trừu tượng một cách chính xác, bạn phải bắt đầu với một mã định danh ngụ ý.

Các bộ mô tả trừu tượng có thể phức tạp. Các dấu ngoặc đơn trong các bộ mô tả trừu tượng phức tạp chỉ định thứ tự thông dịch, giống như chúng đã làm khi diễn giải các bộ mô tả phức tạp trong các khai báo.

1.2.12. Khởi tạo dữ liệu

Khi khai báo một biến, bạn có thể gán giá trị ban đầu cho nó bằng cách gắn một bộ khởi tạo vào bộ mô tả. Trình khởi tạo bắt đầu bằng dấu "=" và có các dạng sau.

Định dạng 1: = khởi tạo;

Định dạng 2: = (danh sách - bộ khởi tạo);

Định dạng 1 được sử dụng khi khởi tạo các biến của kiểu cơ bản và con trỏ, và định dạng 2 được sử dụng khi khởi tạo các đối tượng hỗn hợp.

Biến tol được khởi tạo bằng "N".

const dài megabute = (1024 * 1024);

Biến megabute không thể thay đổi được khởi tạo với một biểu thức không đổi mà sau đó nó không thể thay đổi được.

static int b = (1,2,3,4);

Một mảng hai chiều gồm b số nguyên được khởi tạo; các phần tử của mảng được gán giá trị từ danh sách. Quá trình khởi tạo tương tự này có thể được thực hiện như sau:

static int b = ((1,2), (3,4));

Khi khởi tạo một mảng, bạn có thể bỏ qua một hoặc nhiều thứ nguyên

int tĩnh b)