Hướng dẫn c# mongodb join two collections - c # mongodb tham gia hai bộ sưu tập

Không bị nhầm lẫn với C ++ hoặc C#.

Show
C
Hướng dẫn c# mongodb join two collections - c # mongodb tham gia hai bộ sưu tập

Che đồ họa ngôn ngữ lập trình C, đồng tác giả bởi nhà thiết kế ban đầu của C Dennis Ritchie [1]

Mô hìnhĐa đa dạng: bắt buộc (thủ tục), có cấu trúc
Designed byDennis Ritchie
Nhà phát triểnANSI X3J11 (ANSI C); ISO / IEC JTC 1 (Ủy ban kỹ thuật chung 1) / SC 22 (Tiểu ban 22) / WG 14 (Nhóm làm việc 14) (ISO C)
First appeared1972; 50 & nbsp; nhiều năm trước [2]; 50 years ago[2]
Phiên bản ổn định

C17 / tháng 6 & NBSP; 2018; 4 & nbsp; nhiều năm trước; 4 years ago

Bản phát hành xem trước

C2X (N3054) / Tháng 9 & NBSP; 3, 2022; 51 ngày trước [3]; 51 days ago[3]

Gõ kỷ luậtTĩnh, yếu, rõ ràng, danh nghĩa
Hệ điều hànhĐa nền tảng
Phần mở rộng tên tệp.c, .h
Trang mạngwww.iso.org/standard/74528.htmlwww.open-std.org/jtc1/sc22/wg14/
www.open-std.org/jtc1/sc22/wg14/
Triển khai chính
PCC, GCC, Clang, Intel C, C ++ Builder, Microsoft Visual C ++, Watcom CIntel C, C++Builder, Microsoft Visual C++, Watcom C
Phương ngữ
Cyclone, thống nhất song song C, Split-C, Cilk, C*
Chịu ảnh hưởng bởi
B (BCPL, CPL), Algol 68, [4], PL/I, Fortran
Ảnh hưởng
Rất nhiều: Ampl, AWK, CSH, C ++, C--, C#, Objective-C, D, Go, Java, JavaScript, JS ++, Julia, Limbo, LPC, Perl, PHP, Pike, Pike, Python, Rust, Seed7, Vala, Verilog (HDL), [5] NIM, Zig
  • Hướng dẫn c# mongodb join two collections - c # mongodb tham gia hai bộ sưu tập
    C Lập trình tại Wikibooks

C (phát âm giống như chữ C) là ngôn ngữ lập trình máy tính đa năng. Nó được tạo ra vào những năm 1970 bởi Dennis Ritchie, và vẫn được sử dụng rất rộng rãi và có ảnh hưởng. Theo thiết kế, các tính năng của C phản ánh rõ ràng các khả năng của CPU được nhắm mục tiêu. Nó đã tìm thấy việc sử dụng lâu dài trong các hệ điều hành, trình điều khiển thiết bị, ngăn xếp giao thức, mặc dù giảm [6] cho phần mềm ứng dụng. C thường được sử dụng trên các kiến ​​trúc máy tính từ các siêu máy tính lớn nhất đến các bộ vi điều khiển nhỏ nhất và hệ thống nhúng. (pronounced like the letter c) is a general-purpose computer programming language. It was created in the 1970s by Dennis Ritchie, and remains very widely used and influential. By design, C's features cleanly reflect the capabilities of the targeted CPUs. It has found lasting use in operating systems, device drivers, protocol stacks, though decreasingly[6] for application software. C is commonly used on computer architectures that range from the largest supercomputers to the smallest microcontrollers and embedded systems.

Một người kế vị cho ngôn ngữ lập trình B, C ban đầu được phát triển tại Bell Labs bởi Ritchie từ năm 1972 đến năm 1973 để xây dựng các tiện ích chạy trên Unix. Nó đã được áp dụng để thực hiện lại hạt nhân của hệ điều hành UNIX. [7] Trong những năm 1980, C dần dần trở nên phổ biến. Nó đã trở thành một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất, [8] [9] với các trình biên dịch C có sẵn cho hầu hết các điều khoản cần thiết] tất cả các kiến ​​trúc và hệ điều hành máy tính hiện đại. C đã được ANSI tiêu chuẩn hóa từ năm 1989 (ANSI C) và bởi Tổ chức Tiêu chuẩn hóa Quốc tế (ISO).citation needed] all modern computer architectures and operating systems. C has been standardized by ANSI since 1989 (ANSI C) and by the International Organization for Standardization (ISO).

C là một ngôn ngữ thủ tục bắt buộc hỗ trợ lập trình có cấu trúc, phạm vi biến từ vựng và đệ quy, với một hệ thống tĩnh. Nó được thiết kế để được biên dịch để cung cấp quyền truy cập cấp thấp vào các cấu trúc bộ nhớ và ngôn ngữ để ánh xạ hiệu quả cho các hướng dẫn máy, tất cả đều có hỗ trợ thời gian chạy tối thiểu. Mặc dù có khả năng cấp thấp, ngôn ngữ được thiết kế để khuyến khích lập trình đa nền tảng. Một chương trình C tuân thủ tiêu chuẩn được viết với tính di động trong tâm trí có thể được biên dịch cho nhiều nền tảng máy tính và hệ điều hành với một vài thay đổi đối với mã nguồn của nó. [10]

Từ năm 2000, C đã liên tục xếp hạng trong số hai ngôn ngữ hàng đầu trong Chỉ số TiOBE, thước đo mức độ phổ biến của các ngôn ngữ lập trình. [11]

Overview[edit][edit]

Hướng dẫn c# mongodb join two collections - c # mongodb tham gia hai bộ sưu tập

C là một ngôn ngữ bắt buộc, thủ tục trong truyền thống Algol. Nó có một hệ thống tĩnh. Trong C, tất cả các mã thực thi được chứa trong các chương trình con (còn được gọi là "chức năng", mặc dù không theo nghĩa lập trình chức năng). Các tham số chức năng được truyền theo giá trị, mặc dù các mảng được truyền dưới dạng con trỏ, tức là địa chỉ của mục đầu tiên trong mảng. Tham chiếu từng lần được mô phỏng trong C bằng cách chuyển các con trỏ một cách rõ ràng cho điều đang được tham chiếu.

Văn bản nguồn chương trình C là định dạng tự do, sử dụng dấu chấm phẩy làm dấu phân cách tuyên bố và niềng răng xoăn để nhóm các khối các câu lệnh.

Ngôn ngữ C cũng thể hiện các đặc điểm sau:

  • Ngôn ngữ có một số lượng từ khóa nhỏ, cố định, bao gồm một tập hợp đầy đủ các nguyên thủy luồng điều khiển: if/else, for, do/while, whileswitch. Tên do người dùng xác định không được phân biệt với các từ khóa bởi bất kỳ loại sigil nào.
  • Nó có một số lượng lớn các toán tử số học, bitwise và logic: ________ 10, ________ 11, ________ 12, ________ 13, ________ 14, v.v.
  • Nhiều hơn một bài tập có thể được thực hiện trong một câu.
  • Chức năng:
    • Giá trị trả về chức năng có thể bị bỏ qua, khi không cần thiết.
    • Chức năng và con trỏ dữ liệu cho phép đa hình thời gian chạy ad hoc.
    • Các chức năng có thể không được xác định trong phạm vi từ vựng của các chức năng khác.
    • Các biến có thể được xác định trong một hàm, với phạm vi.
    • Một chức năng có thể gọi chính nó, vì vậy đệ quy được hỗ trợ.
  • Gõ dữ liệu là tĩnh, nhưng được thực thi yếu; Tất cả dữ liệu có một loại, nhưng chuyển đổi ngầm là có thể.
  • Có thể các loại do người dùng xác định (typedef) và hợp chất.
    • Các loại dữ liệu tổng hợp không đồng nhất (
      main()
      {
          printf("hello, world\n");
      }
      
      5) cho phép các yếu tố dữ liệu liên quan được truy cập và gán như một đơn vị.
    • Liên minh là một cấu trúc với các thành viên chồng chéo; Chỉ có thành viên cuối cùng được lưu trữ là hợp lệ.
    • Lập chỉ mục mảng là một ký hiệu thứ cấp, được định nghĩa theo số học của con trỏ. Không giống như các cấu trúc, các mảng không phải là đối tượng hạng nhất: chúng không thể được gán hoặc so sánh bằng cách sử dụng các toán tử tích hợp đơn. Không có từ khóa "mảng" được sử dụng hoặc định nghĩa; Thay vào đó, dấu ngoặc vuông biểu thị các mảng theo cách cú pháp, ví dụ
      main()
      {
          printf("hello, world\n");
      }
      
      6.
    • Các loại được liệt kê là có thể với từ khóa
      main()
      {
          printf("hello, world\n");
      }
      
      7. Họ tự do xen kẽ với số nguyên.
    • Các chuỗi không phải là một loại dữ liệu riêng biệt, nhưng được thực hiện theo quy ước như các mảng ký tự kết thúc không.
  • Truy cập cấp thấp vào bộ nhớ máy tính là có thể bằng cách chuyển đổi địa chỉ máy thành con trỏ.
  • Các thủ tục (chương trình con không trả lại giá trị) là một trường hợp đặc biệt của hàm, với loại trả về không được xác định
    main()
    {
        printf("hello, world\n");
    }
    
    8.
  • Bộ nhớ có thể được phân bổ cho một chương trình với các cuộc gọi đến các thói quen thư viện.
  • Bộ tiền xử lý thực hiện định nghĩa macro, bao gồm tệp nguồn và biên dịch có điều kiện.
  • Có một dạng cơ bản của mô đun: Các tệp có thể được biên dịch riêng và liên kết với nhau, với việc kiểm soát các hàm và đối tượng dữ liệu nào được hiển thị cho các tệp khác thông qua các thuộc tính
    main()
    {
        printf("hello, world\n");
    }
    
    9 và
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    0.
  • Chức năng phức tạp như I/O, thao tác chuỗi và các hàm toán học luôn được giao cho các thói quen thư viện.
  • Mã được tạo sau khi biên dịch có nhu cầu tương đối đơn giản trên nền tảng cơ bản, điều này phù hợp để tạo hệ điều hành và sử dụng trong các hệ thống nhúng.

Mặc dù C không bao gồm một số tính năng nhất định được tìm thấy trong các ngôn ngữ khác (như hướng đối tượng và thu gom rác), chúng có thể được thực hiện hoặc mô phỏng, thường thông qua việc sử dụng các thư viện bên ngoài (ví dụ: hệ thống đối tượng GLIB hoặc bộ thu rác BOEHM).

Quan hệ với các ngôn ngữ khác [chỉnh sửa][edit]

Nhiều ngôn ngữ sau này đã mượn trực tiếp hoặc gián tiếp từ C, bao gồm C ++, C#, Unix's C Shell, D, Go, Java, JavaScript (bao gồm cả bộ chuyển đổi), Julia, Limbo, LPC, Objective-C, Perl, Php, Python Rust, Swift, Verilog và Systemverilog (Ngôn ngữ mô tả phần cứng). [5] Các ngôn ngữ này đã thu hút nhiều cấu trúc kiểm soát của chúng và các tính năng cơ bản khác từ C. Hệ thống, mô hình dữ liệu và ngữ nghĩa có thể hoàn toàn khác nhau.

History[edit][edit]

Phát triển ban đầu [chỉnh sửa][edit]

Dòng thời gian phát triển ngôn ngữ
NămC tiêu chuẩn [10]
1972 Sinh
1978 K & R C
1989/1990Ansi c và iso c
1999 C99
2011 C11
2017 C17
TBDC2X

Nguồn gốc của C gắn chặt với sự phát triển của hệ điều hành Unix, ban đầu được triển khai bằng ngôn ngữ lắp ráp trên PDP-7 của Dennis Ritchie và Ken Thompson, kết hợp một số ý tưởng từ các đồng nghiệp. Cuối cùng, họ quyết định chuyển hệ điều hành đến PDP-11. Phiên bản PDP-11 ban đầu của Unix cũng được phát triển bằng ngôn ngữ lắp ráp. [7]

B[edit][edit]

Thompson mong muốn một ngôn ngữ lập trình để tạo ra các tiện ích cho nền tảng mới. Lúc đầu, anh ta cố gắng tạo ra một trình biên dịch Fortran, nhưng sớm từ bỏ ý tưởng này. Thay vào đó, ông đã tạo ra một phiên bản cắt giảm của ngôn ngữ lập trình BCPL Systems được phát triển gần đây. Mô tả chính thức của BCPL không có sẵn vào thời điểm đó, [12] và Thompson đã sửa đổi cú pháp là ít wordy hơn và tương tự như một algol đơn giản được gọi là smalgol. [13] Kết quả là cái mà Thompson gọi là B. [7] Ông mô tả B là "ngữ nghĩa BCPL với rất nhiều cú pháp Smalgol". [13] Giống như BCPL, B có trình biên dịch bootstrapping để tạo điều kiện chuyển sang các máy mới. [13] Tuy nhiên, một số tiện ích cuối cùng đã được viết bằng B vì nó quá chậm và không thể tận dụng các tính năng PDP-11 như địa chỉ byte.

Bản phát hành B mới và C đầu tiên [Chỉnh sửa][edit]

Năm 1971, Ritchie bắt đầu cải thiện B, để sử dụng các tính năng của PDP-11 mạnh mẽ hơn. Một bổ sung đáng kể là một loại nhân vật. Ông gọi đây là B. [13] Thompson bắt đầu sử dụng NB để viết nhân Unix và các yêu cầu của anh ấy đã định hình hướng phát triển ngôn ngữ. [13] [14] Cho đến năm 1972, các loại phong phú hơn đã được thêm vào ngôn ngữ NB: NB có các mảng

#include 

int main(void)
{
    printf("hello, world\n");
}
1 và
#include 

int main(void)
{
    printf("hello, world\n");
}
2. Con trỏ, khả năng tạo con trỏ cho các loại, mảng của tất cả các loại và các loại được trả về từ các chức năng đều được thêm vào. Mảng trong các biểu thức trở thành con trỏ. Một trình biên dịch mới đã được viết và ngôn ngữ được đổi tên C. [7]

Trình biên dịch C và một số tiện ích được thực hiện với nó được bao gồm trong phiên bản 2 Unix, còn được gọi là UNIX nghiên cứu. [15]

Cấu trúc và nhân Kernel viết lại [Chỉnh sửa][edit]

Tại phiên bản 4 UNIX, được phát hành vào tháng 11 năm 1973, hạt nhân Unix đã được thực hiện lại rộng rãi trong C. [7] Vào thời điểm này, ngôn ngữ C đã có được một số tính năng mạnh mẽ như các loại

main()
{
    printf("hello, world\n");
}
5.

Bộ tiền xử lý đã được giới thiệu vào khoảng năm 1973 với sự thúc giục của Alan Snyder và cũng để nhận ra tính hữu dụng của các cơ chế mạ tệp có sẵn trong BCPL và PL/I. Phiên bản gốc của nó chỉ được cung cấp bao gồm các tệp và thay thế chuỗi đơn giản:

#include 

int main(void)
{
    printf("hello, world\n");
}
4 và
#include 

int main(void)
{
    printf("hello, world\n");
}
5 của các macro không tham số. Ngay sau đó, nó đã được mở rộng, chủ yếu là Mike Lesk và sau đó bởi John Reiser, để kết hợp các macro với các lập luận và tổng hợp có điều kiện. [7]

Unix là một trong những hạt nhân hệ điều hành đầu tiên được triển khai bằng ngôn ngữ khác ngoài hội. Các trường hợp trước đó bao gồm hệ thống multics (được viết trong PL/I) và Chương trình kiểm soát tổng thể (MCP) cho Burroughs B5000 (được viết bằng Algol) vào năm 1961. Vào khoảng năm 1977, Ritchie và Stephen C. Johnson đã thay đổi hơn nữa đối với Ngôn ngữ để tạo điều kiện cho tính di động của hệ điều hành UNIX. Trình biên dịch C di động của Johnson đóng vai trò là cơ sở cho một số triển khai C trên các nền tảng mới. [14]

K & R C [Chỉnh sửa][edit]

Hướng dẫn c# mongodb join two collections - c # mongodb tham gia hai bộ sưu tập

Năm 1978, Brian Kernighan và Dennis Ritchie đã xuất bản phiên bản đầu tiên của ngôn ngữ lập trình C. [16] Cuốn sách này, được các lập trình viên C gọi là K & R, đã phục vụ trong nhiều năm như một đặc điểm kỹ thuật không chính thức của ngôn ngữ. Phiên bản C mà nó mô tả thường được gọi là "K & R C". Vì điều này đã được phát hành vào năm 1978, nó còn được gọi là C78. [17] Phiên bản thứ hai của cuốn sách [18] bao gồm tiêu chuẩn ANSI C sau này, được mô tả dưới đây.K&R C". As this was released in 1978, it is also referred to as C78.[17] The second edition of the book[18] covers the later ANSI C standard, described below.

K & R đã giới thiệu một số tính năng ngôn ngữ:

  • Thư viện I/O tiêu chuẩn
  • #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    6 Kiểu dữ liệu
  • #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    7 Kiểu dữ liệu
  • Các toán tử gán hợp chất có dạng
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    8 (như
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    9) đã được thay đổi thành dạng
    int func(int N, int M)
    {
      float (*p)[N][M] = malloc(sizeof *p);
      if (!p)
        return -1;
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          (*p)[i][j] = i + j;
      print_array(N, M, p);
      free(p);
      return 1;
    }
    
    0 (nghĩa là
    int func(int N, int M)
    {
      float (*p)[N][M] = malloc(sizeof *p);
      if (!p)
        return -1;
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          (*p)[i][j] = i + j;
      print_array(N, M, p);
      free(p);
      return 1;
    }
    
    1) để loại bỏ sự mơ hồ ngữ nghĩa được tạo ra bởi các cấu trúc như
    int func(int N, int M)
    {
      float (*p)[N][M] = malloc(sizeof *p);
      if (!p)
        return -1;
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          (*p)[i][j] = i + j;
      print_array(N, M, p);
      free(p);
      return 1;
    }
    
    2, đã được hiểu là
    int func(int N, int M)
    {
      float (*p)[N][M] = malloc(sizeof *p);
      if (!p)
        return -1;
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          (*p)[i][j] = i + j;
      print_array(N, M, p);
      free(p);
      return 1;
    }
    
    3 (giảm
    int func(int N, int M)
    {
      float (*p)[N][M] = malloc(sizeof *p);
      if (!p)
        return -1;
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          (*p)[i][j] = i + j;
      print_array(N, M, p);
      free(p);
      return 1;
    }
    
    4 ý định có thể
    int func(int N, int M)
    {
      float (*p)[N][M] = malloc(sizeof *p);
      if (!p)
        return -1;
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          (*p)[i][j] = i + j;
      print_array(N, M, p);
      free(p);
      return 1;
    }
    
    5 (hãy để
    int func(int N, int M)
    {
      float (*p)[N][M] = malloc(sizeof *p);
      if (!p)
        return -1;
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          (*p)[i][j] = i + j;
      print_array(N, M, p);
      free(p);
      return 1;
    }
    
    4 là −10).

Ngay cả sau khi xuất bản Tiêu chuẩn ANSI năm 1989, trong nhiều năm K & R C vẫn được coi là "mẫu số chung thấp nhất" mà các lập trình viên C tự hạn chế khi có tính di động tối đa, vì nhiều trình biên dịch cũ vẫn được sử dụng và vì được viết cẩn thận K & R được viết cẩn thận Mã C có thể là tiêu chuẩn pháp lý C là tốt.

Trong các phiên bản đầu của C, chỉ các hàm trả về các loại khác với

#include 

int main(void)
{
    printf("hello, world\n");
}
1 phải được khai báo nếu được sử dụng trước định nghĩa hàm; Các chức năng được sử dụng mà không cần khai báo trước được cho là sẽ trả về loại
#include 

int main(void)
{
    printf("hello, world\n");
}
1.

Ví dụ:

long some_function(); /* This is a function declaration, so the compiler can know the name and return type of this function. */
/* int */ other_function(); /* Another function declaration.  There is an implicit 'int' type here since we're talking about early version of C.  It's commented out here to show where it could go in later variants. */

/* int */ calling_function() /* this is a function definition, including the body of the code following in the { curly brackets } the return type is 'int', but this is implicit so no need to state 'int' when using this early version of C */
{
    long test1;
    register /* int */ test2; /* again, note the 'int' is not required here, and shown as */
                              /* a comment just to illustrate where it would be required in later variants of C. */
                              /* The 'register' keyword indicates to the compiler that this variable should */
                              /* ideally be stored in a register as opposed to within the stack frame. */
    test1 = some_function();
    if (test1 > 1)
          test2 = 0;
    else
          test2 = other_function();
    return test2;
}

Các nhà xác định loại

#include 

int main(void)
{
    printf("hello, world\n");
}
1 được nhận xét có thể được bỏ qua trong K & R C, nhưng được yêu cầu trong các tiêu chuẩn sau.

Vì các khai báo chức năng K & R không bao gồm bất kỳ thông tin nào về các đối số chức năng, kiểm tra loại tham số chức năng không được thực hiện, mặc dù một số trình biên dịch sẽ đưa ra thông báo cảnh báo nếu một hàm cục bộ được gọi với số lượng đối số sai hoặc nếu nhiều cuộc gọi đến hàm bên ngoài đã sử dụng các số hoặc loại đối số khác nhau. Các công cụ riêng biệt như tiện ích xơ vải của Unix đã được phát triển rằng (trong số những thứ khác) có thể kiểm tra tính nhất quán của việc sử dụng chức năng trên nhiều tệp nguồn.

Trong những năm sau khi xuất bản K & R C, một số tính năng đã được thêm vào ngôn ngữ, được hỗ trợ bởi các trình biên dịch từ AT & T (đặc biệt là PCC [19]) và một số nhà cung cấp khác. Những điều đó được bao gồm:

  • main()
    {
        printf("hello, world\n");
    }
    
    8 Chức năng (nghĩa là, các chức năng không có giá trị trả về)
  • Các chức năng trả về các loại
    main()
    {
        printf("hello, world\n");
    }
    
    5 hoặc
    int func(int N, int M)
    {
      // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
      float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          p[i][j] = i + j;
      // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
      return 1;
    }
    
    2 (trước đây chỉ có thể trả về một con trỏ, số nguyên hoặc float duy nhất)
  • Bài tập cho các loại dữ liệu
    main()
    {
        printf("hello, world\n");
    }
    
    5
  • Các loại được liệt kê (trước đây, định nghĩa bộ tiền xử lý cho các giá trị cố định số nguyên đã được sử dụng, ví dụ:
    int func(int N, int M)
    {
      // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
      float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          p[i][j] = i + j;
      // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
      return 1;
    }
    
    4)

Số lượng lớn các phần mở rộng và thiếu thỏa thuận trên một thư viện tiêu chuẩn, cùng với mức độ phổ biến ngôn ngữ và thực tế là thậm chí các trình biên dịch UNIX không thực hiện chính xác đặc điểm kỹ thuật K & R, dẫn đến sự cần thiết của tiêu chuẩn hóa. [Cần trích dẫn]]citation needed]

ANSI C và ISO C [Chỉnh sửa][edit]

Vào cuối những năm 1970 và 1980, các phiên bản C đã được triển khai cho nhiều máy tính lớn, máy tính minicomputer và máy vi tính, bao gồm cả PC IBM, vì mức độ phổ biến của nó bắt đầu tăng đáng kể.

Năm 1983, Viện Tiêu chuẩn Quốc gia Hoa Kỳ (ANSI) đã thành lập một ủy ban, X3J11, để thiết lập một đặc điểm kỹ thuật tiêu chuẩn của C. X3J11 dựa trên tiêu chuẩn C về triển khai UNIX; Tuy nhiên, phần không thể xác định của thư viện Unix C đã được trao cho Nhóm làm việc của IEEE 1003 để trở thành cơ sở cho tiêu chuẩn POSIX năm 1988. Năm 1989, tiêu chuẩn C được phê chuẩn là ANSI X3.159-1989 "Ngôn ngữ lập trình C". Phiên bản ngôn ngữ này thường được gọi là ANSI C, tiêu chuẩn C hoặc đôi khi C89.

Năm 1990, tiêu chuẩn ANSI C (với các thay đổi định dạng) đã được Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) áp dụng là ISO/IEC 9899: 1990, đôi khi được gọi là C90. Do đó, các thuật ngữ "C89" và "C90" đề cập đến cùng một ngôn ngữ lập trình.

ANSI, giống như các cơ quan tiêu chuẩn quốc gia khác, không còn phát triển tiêu chuẩn C một cách độc lập, nhưng bảo vệ tiêu chuẩn C quốc tế, được duy trì bởi nhóm làm việc ISO/IEC JTC1/SC22/WG14. Việc áp dụng quốc gia của một bản cập nhật cho tiêu chuẩn quốc tế thường xảy ra trong vòng một năm kể từ khi xuất bản ISO.

Một trong những mục tiêu của quá trình tiêu chuẩn hóa C là tạo ra một siêu K & R C, kết hợp nhiều tính năng không chính thức sau đó được giới thiệu. Ủy ban Tiêu chuẩn cũng bao gồm một số tính năng bổ sung như nguyên mẫu chức năng (mượn từ C ++), con trỏ

main()
{
    printf("hello, world\n");
}
8, hỗ trợ cho các bộ nhân vật quốc tế và địa phương, và cải tiến tiền xử lý. Mặc dù cú pháp khai báo tham số được tăng cường để bao gồm kiểu được sử dụng trong C ++, giao diện K & R vẫn tiếp tục được cho phép, để tương thích với mã nguồn hiện có.

C89 được hỗ trợ bởi các trình biên dịch C hiện tại và hầu hết các mã C hiện đại đều dựa trên nó. Bất kỳ chương trình nào chỉ được viết trong tiêu chuẩn C và không có bất kỳ giả định phụ thuộc vào phần cứng nào sẽ chạy chính xác trên bất kỳ nền tảng nào với triển khai C phù hợp, trong giới hạn tài nguyên của nó. Không có các biện pháp phòng ngừa như vậy, các chương trình chỉ có thể biên dịch trên một nền tảng nhất định hoặc với một trình biên dịch cụ thể, ví dụ, do việc sử dụng các thư viện không chuẩn, chẳng hạn như thư viện GUI hoặc phụ thuộc vào các thuộc tính cụ thể của trình biên dịch hoặc nền tảng như kích thước chính xác của các loại dữ liệu và độ cuối của byte.

Trong trường hợp mã phải được biên dịch bằng các trình biên dịch dựa trên thông tin tiêu chuẩn hoặc K & R C, macro

int func(int N, int M)
{
  // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
  float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      p[i][j] = i + j;
  // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
  return 1;
}
6 có thể được sử dụng để chia mã thành các phần tiêu chuẩn và K & R để ngăn chặn việc sử dụng trình biên dịch dựa trên K & R C của các tính năng chỉ có sẵn trong Tiêu chuẩn C.

Sau quá trình tiêu chuẩn hóa ANSI/ISO, đặc tả ngôn ngữ C vẫn tương đối tĩnh trong vài năm. Năm 1995, Sửa đổi quy phạm 1 thành tiêu chuẩn C 1990 C (ISO/IEC 9899/AMD1: 1995, được biết đến một cách không chính thức là C95) đã được công bố, để sửa một số chi tiết và thêm hỗ trợ rộng rãi hơn cho các bộ nhân vật quốc tế. [20]

C99[edit][edit]

Bài viết chính: C99

Tiêu chuẩn C đã được sửa đổi thêm vào cuối những năm 1990, dẫn đến việc xuất bản ISO/IEC 9899: 1999 năm 1999, thường được gọi là "C99". Nó đã được sửa đổi ba lần bởi Corrigenda kỹ thuật. [21]

C99 đã giới thiệu một số tính năng mới, bao gồm các hàm nội tuyến, một số loại dữ liệu mới (bao gồm

int func(int N, int M)
{
  // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
  float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      p[i][j] = i + j;
  // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
  return 1;
}
7 và loại
int func(int N, int M)
{
  // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
  float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      p[i][j] = i + j;
  // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
  return 1;
}
8 để biểu thị các số phức tạp), các mảng có độ dài thay đổi và các thành viên mảng linh hoạt, hỗ trợ cho IEEE 754 của arity biến) và hỗ trợ cho các nhận xét một dòng bắt đầu bằng
int func(int N, int M)
{
  // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
  float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      p[i][j] = i + j;
  // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
  return 1;
}
9, như trong BCPL hoặc C ++. Nhiều trong số này đã được triển khai dưới dạng tiện ích mở rộng trong một số trình biên dịch C.

C99 dành cho hầu hết các phần tương thích ngược với C90, nhưng nghiêm ngặt hơn theo một số cách; Cụ thể, một tuyên bố thiếu một nhà xác định loại không còn có

#include 

int main(void)
{
    printf("hello, world\n");
}
1 hoàn toàn giả định. Một macro tiêu chuẩn if/else1 được xác định với giá trị if/else2 để chỉ ra rằng hỗ trợ C99 có sẵn. GCC, Solaris Studio và các trình biên dịch C khác bây giờ [khi nào?] Hỗ trợ nhiều hoặc tất cả các tính năng mới của C99. Trình biên dịch C trong Microsoft Visual C ++, tuy nhiên, thực hiện tiêu chuẩn C89 và các phần của C99 được yêu cầu để tương thích với C ++ 11. [22] [Cập nhật nhu cầu]when?] support many or all of the new features of C99. The C compiler in Microsoft Visual C++, however, implements the C89 standard and those parts of C99 that are required for compatibility with C++11.[22][needs update]

Ngoài ra, hỗ trợ cho các định danh unicode (tên biến / tên hàm) dưới dạng ký tự thoát (ví dụ: if/else3) hiện đang được yêu cầu.]. Hỗ trợ cho tên Unicode thô là tùy chọn.when?] required. Support for raw Unicode names is optional.

C11[edit][edit]

Năm 2007, công việc bắt đầu sửa đổi một bản sửa đổi khác của tiêu chuẩn C, được gọi một cách không chính thức là "C1X" cho đến khi xuất bản chính thức của ISO/IEC 9899: 2011 vào năm 2011-12-08. Ủy ban Tiêu chuẩn C đã thông qua các hướng dẫn để hạn chế việc áp dụng các tính năng mới chưa được kiểm tra bởi các triển khai hiện có.

Tiêu chuẩn C11 bổ sung nhiều tính năng mới cho C và thư viện, bao gồm các loại macro chung, cấu trúc ẩn danh, hỗ trợ unicode được cải thiện, hoạt động nguyên tử, đa luồng và các chức năng được kiểm tra giới hạn. Nó cũng tạo ra một số phần của thư viện C99 hiện tại tùy chọn và cải thiện khả năng tương thích với C ++. Macro if/else1 tiêu chuẩn được định nghĩa là if/else5 để chỉ ra rằng hỗ trợ C11 có sẵn.

C17[edit][edit]

Được xuất bản vào tháng 6 năm 2018 với tên ISO/IEC 9899: 2018, C17 là tiêu chuẩn hiện tại cho ngôn ngữ lập trình C. Nó giới thiệu không có tính năng ngôn ngữ mới, chỉ sửa chữa kỹ thuật và làm rõ các khiếm khuyết trong C11. Macro tiêu chuẩn if/else1 được định nghĩa là if/else7.

C2x[edit][edit]

Bài viết chính: C2X

C2X là một tên không chính thức cho bản sửa đổi tiêu chuẩn ngôn ngữ C tiếp theo (sau C17). Nó được dự kiến ​​sẽ được bỏ phiếu vào năm 2023 và do đó sẽ được gọi là C23. [23] [Better & nbsp; nguồn & nbsp; cần thiết]]better source needed]

Nhúng c [chỉnh sửa][edit]

Trong lịch sử, lập trình C nhúng yêu cầu các tiện ích mở rộng không đạt tiêu chuẩn cho ngôn ngữ C để hỗ trợ các tính năng kỳ lạ như số học điểm cố định, nhiều ngân hàng bộ nhớ riêng biệt và các hoạt động I/O cơ bản.

Năm 2008, Ủy ban Tiêu chuẩn C đã công bố một báo cáo kỹ thuật mở rộng ngôn ngữ C [24] để giải quyết các vấn đề này bằng cách cung cấp một tiêu chuẩn chung cho tất cả các triển khai tuân thủ. Nó bao gồm một số tính năng không có sẵn trong C bình thường, chẳng hạn như số học điểm cố định, không gian địa chỉ có tên và địa chỉ phần cứng I/O cơ bản.

Syntax[edit][edit]

C có một ngữ pháp chính thức được chỉ định bởi tiêu chuẩn C. [25] Kết thúc dòng thường không có ý nghĩa trong C; Tuy nhiên, ranh giới dòng có ý nghĩa trong giai đoạn tiền xử lý. Nhận xét có thể xuất hiện giữa các dấu phân cách if/else8 và if/else9 hoặc (kể từ C99) sau

int func(int N, int M)
{
  // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
  float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      p[i][j] = i + j;
  // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
  return 1;
}
9 cho đến khi kết thúc dòng. Nhận xét được phân định bởi if/else8 và if/else9 không làm tổ, và các chuỗi nhân vật này không được giải thích là người phân định nhận xét nếu chúng xuất hiện bên trong chuỗi hoặc chữ ký tự. [26]

C tập tin nguồn chứa các khai báo và định nghĩa chức năng. Định nghĩa chức năng, lần lượt, chứa các tuyên bố và tuyên bố. Các khai báo hoặc xác định các loại mới bằng cách sử dụng các từ khóa như

main()
{
    printf("hello, world\n");
}
5,
int func(int N, int M)
{
  // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
  float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      p[i][j] = i + j;
  // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
  return 1;
}
2 và
main()
{
    printf("hello, world\n");
}
7 hoặc gán các loại cho và có thể dự trữ lưu trữ cho các biến mới, thường là bằng cách viết loại theo sau là tên biến. Các từ khóa như
#include 

int main(void)
{
    printf("hello, world\n");
}
2 và
#include 

int main(void)
{
    printf("hello, world\n");
}
1 Chỉ định các loại tích hợp. Các phần của mã được đặt trong niềng răng (for8 và for9, đôi khi được gọi là "dấu ngoặc xoăn") để giới hạn phạm vi khai báo và hoạt động như một tuyên bố duy nhất cho các cấu trúc điều khiển.

Là một ngôn ngữ bắt buộc, C sử dụng các câu lệnh để chỉ định các hành động. Tuyên bố phổ biến nhất là một tuyên bố biểu thức, bao gồm một biểu thức được đánh giá, theo sau là dấu chấm phẩy; Là một tác dụng phụ của đánh giá, các chức năng có thể được gọi và các biến có thể được gán các giá trị mới. Để sửa đổi việc thực hiện tuần tự thông thường các câu lệnh, C cung cấp một số câu lệnh dòng điều khiển được xác định bởi các từ khóa được đặt trước. Lập trình có cấu trúc được hỗ trợ bởi do/while0 ... [do/while1] Thực thi có điều kiện và bởi do/while2 ... while, whilefor Thực thi lặp (vòng lặp). Tuyên bố for có các biểu thức khởi tạo, thử nghiệm và tái tạo riêng biệt, bất kỳ hoặc tất cả đều có thể được bỏ qua. do/while7 và do/while8 có thể được sử dụng để rời khỏi câu lệnh vòng lặp kèm theo hoặc bỏ qua việc tái tạo. Ngoài ra còn có một tuyên bố do/while9 không có cấu trúc, các nhánh trực tiếp đến nhãn được chỉ định trong hàm. switch chọn một while1 để được thực thi dựa trên giá trị của biểu thức số nguyên.

Biểu thức có thể sử dụng một loạt các toán tử tích hợp và có thể chứa các cuộc gọi chức năng. Thứ tự trong đó các đối số cho các chức năng và toán hạng cho hầu hết các nhà khai thác được đánh giá là không xác định. Các đánh giá thậm chí có thể được xen kẽ. Tuy nhiên, tất cả các tác dụng phụ (bao gồm cả lưu trữ cho các biến) sẽ xảy ra trước "điểm trình tự" tiếp theo; Các điểm trình tự bao gồm phần cuối của mỗi câu lệnh biểu thức và mục nhập và trả về từ mỗi cuộc gọi chức năng. Các điểm trình tự cũng xảy ra trong quá trình đánh giá các biểu thức chứa một số toán tử nhất định (while2,

main()
{
    printf("hello, world\n");
}
4, while4 và toán tử dấu phẩy). Điều này cho phép mức độ tối ưu hóa mã đối tượng cao của trình biên dịch, nhưng yêu cầu các lập trình viên C phải chăm sóc nhiều hơn để có được kết quả đáng tin cậy hơn mức cần thiết cho các ngôn ngữ lập trình khác.

Kernighan và Ritchie nói trong việc giới thiệu ngôn ngữ lập trình C: "C, giống như bất kỳ ngôn ngữ nào khác, có nhược điểm của nó. Một số nhà khai thác có quyền ưu tiên sai; một số phần của cú pháp có thể tốt hơn. đã không cố gắng sửa chữa nhiều nhược điểm này, vì tác động của những thay đổi đó đối với phần mềm đã có.

Bộ ký tự [Chỉnh sửa][edit]

Bộ ký tự nguồn C cơ bản bao gồm các ký tự sau:

  • Chữ cái chữ thường và chữ hoa của bảng chữ cái Latin cơ bản ISO: ________ 85 mật ____ 86 ____ 87 87 ____________ 88
  • Số chữ số thập phân: ________ 89 ____________ 90
  • Ký tự đồ họa: switch1
  • Ký tự khoảng trắng: không gian, tab ngang, tab dọc, thức ăn mẫu, dòng mới

Newline chỉ ra kết thúc của một dòng văn bản; Nó không cần phải tương ứng với một ký tự đơn thực tế, mặc dù để thuận tiện C coi nó là một.

Các ký tự được mã hóa nhiều byte bổ sung có thể được sử dụng trong các chữ viết, nhưng chúng không hoàn toàn di động. Tiêu chuẩn C mới nhất (C11) cho phép các ký tự Unicode đa quốc gia được nhúng một cách xác định trong văn bản nguồn C bằng cách sử dụng mã hóa switch2 hoặc switch3 (trong đó switch4 biểu thị một ký tự thập lục phân), mặc dù tính năng này chưa được thực hiện rộng rãi.

Bộ ký tự thực thi C cơ bản chứa cùng các ký tự, cùng với các biểu diễn cho cảnh báo, backspace và trả về vận chuyển. Hỗ trợ thời gian chạy cho các bộ ký tự mở rộng đã tăng lên theo từng bản sửa đổi của tiêu chuẩn C.

Các từ dành riêng [chỉnh sửa][edit]

C89 có 32 từ dành riêng, còn được gọi là từ khóa, đó là những từ không thể được sử dụng cho bất kỳ mục đích nào khác ngoài những từ mà chúng được xác định trước:

  • switch5
  • do/while7
  • while1
  • #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    2
  • switch9
  • do/while8
  • main()
    {
        printf("hello, world\n");
    }
    
    01
  • do/while2
  • main()
    {
        printf("hello, world\n");
    }
    
    03
  • do/while1
  • main()
    {
        printf("hello, world\n");
    }
    
    7
  • #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    0
  • main()
    {
        printf("hello, world\n");
    }
    
    07
  • for
  • do/while9
  • do/while0
  • #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    1
  • main()
    {
        printf("hello, world\n");
    }
    
    12
  • main()
    {
        printf("hello, world\n");
    }
    
    13
  • main()
    {
        printf("hello, world\n");
    }
    
    14
  • main()
    {
        printf("hello, world\n");
    }
    
    15
  • main()
    {
        printf("hello, world\n");
    }
    
    16
  • main()
    {
        printf("hello, world\n");
    }
    
    17
  • main()
    {
        printf("hello, world\n");
    }
    
    9
  • main()
    {
        printf("hello, world\n");
    }
    
    5
  • switch
  • main()
    {
        printf("hello, world\n");
    }
    
    21
  • int func(int N, int M)
    {
      // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
      float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          p[i][j] = i + j;
      // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
      return 1;
    }
    
    2
  • main()
    {
        printf("hello, world\n");
    }
    
    23
  • main()
    {
        printf("hello, world\n");
    }
    
    8
  • main()
    {
        printf("hello, world\n");
    }
    
    25
  • while

C99 bảo lưu thêm năm từ:

  • main()
    {
        printf("hello, world\n");
    }
    
    27
  • main()
    {
        printf("hello, world\n");
    }
    
    28
  • main()
    {
        printf("hello, world\n");
    }
    
    29
  • main()
    {
        printf("hello, world\n");
    }
    
    30
  • main()
    {
        printf("hello, world\n");
    }
    
    31

C11 bảo lưu thêm bảy từ: [28]

  • main()
    {
        printf("hello, world\n");
    }
    
    32
  • main()
    {
        printf("hello, world\n");
    }
    
    33
  • main()
    {
        printf("hello, world\n");
    }
    
    34
  • main()
    {
        printf("hello, world\n");
    }
    
    35
  • main()
    {
        printf("hello, world\n");
    }
    
    36
  • main()
    {
        printf("hello, world\n");
    }
    
    37
  • main()
    {
        printf("hello, world\n");
    }
    
    38

Hầu hết các từ được bảo lưu gần đây bắt đầu bằng một dấu gạch dưới, sau đó là một chữ cái viết hoa, bởi vì các định danh có dạng đó được bảo lưu trước đây bởi tiêu chuẩn C chỉ sử dụng bằng cách triển khai. Vì mã nguồn chương trình hiện tại không nên sử dụng các định danh này, nên nó sẽ không bị ảnh hưởng khi các triển khai C bắt đầu hỗ trợ các tiện ích mở rộng này cho ngôn ngữ lập trình. Một số tiêu đề tiêu chuẩn xác định các từ đồng nghĩa thuận tiện hơn cho các định danh được nhấn mạnh. Ngôn ngữ trước đây bao gồm một từ dành riêng được gọi là

main()
{
    printf("hello, world\n");
}
39, nhưng điều này hiếm khi được thực hiện và bây giờ [khi nào?] Đã bị xóa dưới dạng một từ dành riêng. [29]when?] been removed as a reserved word.[29]

Operators[edit][edit]

C hỗ trợ một bộ toán tử phong phú, là các ký hiệu được sử dụng trong một biểu thức để chỉ định các thao tác sẽ được thực hiện trong khi đánh giá biểu thức đó. C có toán tử cho:

  • Số học:
    main()
    {
        printf("hello, world\n");
    }
    
    0,
    main()
    {
        printf("hello, world\n");
    }
    
    41,
    main()
    {
        printf("hello, world\n");
    }
    
    42,
    main()
    {
        printf("hello, world\n");
    }
    
    43,
    main()
    {
        printf("hello, world\n");
    }
    
    44
  • Bài tập:
    main()
    {
        printf("hello, world\n");
    }
    
    45
  • Phân công tăng cường: ________ 11, & nbsp; ________ 31, & nbsp; ____ 148, & nbsp; 
    int func(int N, int M)
    {
      float (*p)[N][M] = malloc(sizeof *p);
      if (!p)
        return -1;
      for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
          (*p)[i][j] = i + j;
      print_array(N, M, p);
      free(p);
      return 1;
    }
    
    1, 
    main()
    {
        printf("hello, world\n");
    }
    
    48, 
    main()
    {
        printf("hello, world\n");
    }
    
    49, 
    main()
    {
        printf("hello, world\n");
    }
    
    50, 
    main()
    {
        printf("hello, world\n");
    }
    
    51, 
    main()
    {
        printf("hello, world\n");
    }
    
    52, 
    main()
    {
        printf("hello, world\n");
    }
    
    53, 
    main()
    {
        printf("hello, world\n");
    }
    
    54, 
    main()
    {
        printf("hello, world\n");
    }
    
    55
  • Logic bitwise:
    main()
    {
        printf("hello, world\n");
    }
    
    56,
    main()
    {
        printf("hello, world\n");
    }
    
    3,
    main()
    {
        printf("hello, world\n");
    }
    
    58,
    main()
    {
        printf("hello, world\n");
    }
    
    59
  • Bitwise thay đổi:
    main()
    {
        printf("hello, world\n");
    }
    
    60,
    main()
    {
        printf("hello, world\n");
    }
    
    61
  • Logic Boolean:
    main()
    {
        printf("hello, world\n");
    }
    
    62, while2,
    main()
    {
        printf("hello, world\n");
    }
    
    4
  • Đánh giá có điều kiện:
    main()
    {
        printf("hello, world\n");
    }
    
    65
  • Kiểm tra bình đẳng:
    main()
    {
        printf("hello, world\n");
    }
    
    66,
    main()
    {
        printf("hello, world\n");
    }
    
    67
  • Gọi chức năng:
    main()
    {
        printf("hello, world\n");
    }
    
    68
  • Tăng và giảm:
    main()
    {
        printf("hello, world\n");
    }
    
    2,
    main()
    {
        printf("hello, world\n");
    }
    
    70
  • Lựa chọn thành viên:
    main()
    {
        printf("hello, world\n");
    }
    
    71,
    main()
    {
        printf("hello, world\n");
    }
    
    72
  • Kích thước đối tượng:
    main()
    {
        printf("hello, world\n");
    }
    
    17
  • Quan hệ đặt hàng:
    main()
    {
        printf("hello, world\n");
    }
    
    74,
    main()
    {
        printf("hello, world\n");
    }
    
    75,
    main()
    {
        printf("hello, world\n");
    }
    
    76,
    main()
    {
        printf("hello, world\n");
    }
    
    77
  • Tài liệu tham khảo và dereference:
    main()
    {
        printf("hello, world\n");
    }
    
    3,
    main()
    {
        printf("hello, world\n");
    }
    
    42,
    main()
    {
        printf("hello, world\n");
    }
    
    80
  • Trình tự:
    main()
    {
        printf("hello, world\n");
    }
    
    81
  • Nhóm biểu hiện phụ:
    main()
    {
        printf("hello, world\n");
    }
    
    68
  • Chuyển đổi loại:
    main()
    {
        printf("hello, world\n");
    }
    
    83

C sử dụng toán tử

main()
{
    printf("hello, world\n");
}
45 (được sử dụng trong toán học để thể hiện sự bình đẳng) để biểu thị sự gán, theo tiền lệ của Fortran và PL/I, nhưng không giống như Algol và các dẫn xuất của nó. C sử dụng toán tử
main()
{
    printf("hello, world\n");
}
66 để kiểm tra sự bình đẳng. Sự giống nhau giữa hai toán tử này (gán và bình đẳng) có thể dẫn đến việc sử dụng vô tình của người khác và trong nhiều trường hợp, lỗi không tạo ra thông báo lỗi (mặc dù một số trình biên dịch tạo ra cảnh báo). Ví dụ, biểu thức có điều kiện
main()
{
    printf("hello, world\n");
}
86 có thể được viết nhầm là
main()
{
    printf("hello, world\n");
}
87, sẽ được đánh giá là đúng nếu while5 không bằng không sau khi gán. [30]

Các nhà điều hành C ưu tiên không phải lúc nào cũng trực quan. Ví dụ: toán tử

main()
{
    printf("hello, world\n");
}
66 liên kết chặt chẽ hơn (được thực thi trước) các toán tử
main()
{
    printf("hello, world\n");
}
3 (bitwise và) và
main()
{
    printf("hello, world\n");
}
58 (bitwise hoặc) trong các biểu thức như
main()
{
    printf("hello, world\n");
}
92, phải được viết là
main()
{
    printf("hello, world\n");
}
93 nếu đó là ý định của mã hóa. [31 [31 ]

Ví dụ "Xin chào, Thế giới" [Chỉnh sửa][edit]

Hướng dẫn c# mongodb join two collections - c # mongodb tham gia hai bộ sưu tập

Ví dụ "Hello, World", xuất hiện trong phiên bản đầu tiên của K & R, đã trở thành mô hình cho một chương trình giới thiệu trong hầu hết các sách giáo khoa lập trình. Chương trình in "Xin chào, thế giới" cho đầu ra tiêu chuẩn, thường là màn hình thiết bị đầu cuối hoặc màn hình.

Phiên bản gốc là: [32]

main()
{
    printf("hello, world\n");
}

Một chương trình "Xin chào, Thế giới" tiêu chuẩn là: [A]

#include 

int main(void)
{
    printf("hello, world\n");
}

Dòng đầu tiên của chương trình chứa một chỉ thị tiền xử lý, được biểu thị bằng

#include 

int main(void)
{
    printf("hello, world\n");
}
4. Điều này khiến trình biên dịch thay thế dòng đó bằng toàn bộ văn bản của tiêu đề tiêu chuẩn
main()
{
    printf("hello, world\n");
}
95, chứa các khai báo cho các hàm đầu vào và đầu ra tiêu chuẩn như
main()
{
    printf("hello, world\n");
}
96 và
main()
{
    printf("hello, world\n");
}
97. Các khung góc xung quanh
main()
{
    printf("hello, world\n");
}
95 chỉ ra rằng
main()
{
    printf("hello, world\n");
}
95 được định vị bằng chiến lược tìm kiếm thích các tiêu đề được cung cấp với trình biên dịch cho các tiêu đề khác có cùng tên, trái ngược với các trích dẫn kép thường bao gồm các tệp tiêu đề cụ thể của dự án hoặc dự án.

Dòng tiếp theo chỉ ra rằng một hàm có tên

#include 

int main(void)
{
    printf("hello, world\n");
}
00 đang được xác định. Hàm
#include 

int main(void)
{
    printf("hello, world\n");
}
00 phục vụ một mục đích đặc biệt trong các chương trình C; Môi trường thời gian chạy gọi hàm
#include 

int main(void)
{
    printf("hello, world\n");
}
00 để bắt đầu thực thi chương trình. Trình xác định loại
#include 

int main(void)
{
    printf("hello, world\n");
}
1 chỉ ra rằng giá trị được trả lại cho Invoker (trong trường hợp này là môi trường thời gian chạy) là kết quả của việc đánh giá hàm
#include 

int main(void)
{
    printf("hello, world\n");
}
00, là một số nguyên. Từ khóa
main()
{
    printf("hello, world\n");
}
8 dưới dạng danh sách tham số chỉ ra rằng hàm này không có đối số. [B]

Nẹp xoăn mở biểu thị sự khởi đầu của định nghĩa của hàm

#include 

int main(void)
{
    printf("hello, world\n");
}
00.

Dòng tiếp theo gọi (chuyển hướng thực hiện thành) một hàm có tên

main()
{
    printf("hello, world\n");
}
96, trong trường hợp này được cung cấp từ thư viện hệ thống. Trong cuộc gọi này, hàm
main()
{
    printf("hello, world\n");
}
96 được truyền (cung cấp) một đối số duy nhất, địa chỉ của ký tự đầu tiên trong chuỗi theo nghĩa đen
#include 

int main(void)
{
    printf("hello, world\n");
}
09. Chuỗi theo nghĩa đen là một mảng không tên với các phần tử loại
#include 

int main(void)
{
    printf("hello, world\n");
}
2, được thiết lập tự động bởi trình biên dịch với ký tự 0 có giá trị cuối cùng để đánh dấu phần cuối của mảng (
main()
{
    printf("hello, world\n");
}
96 cần biết điều này).
#include 

int main(void)
{
    printf("hello, world\n");
}
12 là một chuỗi thoát mà C dịch thành một ký tự mới, trên đầu ra biểu thị sự kết thúc của dòng hiện tại. Giá trị trả về của hàm
main()
{
    printf("hello, world\n");
}
96 là loại
#include 

int main(void)
{
    printf("hello, world\n");
}
1, nhưng nó bị loại bỏ âm thầm vì nó không được sử dụng. .

Nẹp xoăn đóng cho biết phần cuối của mã cho hàm

#include 

int main(void)
{
    printf("hello, world\n");
}
00. Theo thông số kỹ thuật C99 và mới hơn, hàm
#include 

int main(void)
{
    printf("hello, world\n");
}
00, không giống như bất kỳ hàm nào khác, sẽ ngầm trả lại giá trị while9 khi đạt được for9 chấm dứt hàm. .

Kiểu dữ liệu [Chỉnh sửa][edit]

Hệ thống loại trong C là tĩnh và gõ yếu, làm cho nó tương tự như hệ thống của con cháu Algol như Pascal. [34] Có các loại tích hợp cho các số nguyên có kích thước khác nhau, cả đã ký và không dấu, số điểm nổi và các loại được liệt kê (

main()
{
    printf("hello, world\n");
}
7). Loại số nguyên
#include 

int main(void)
{
    printf("hello, world\n");
}
2 thường được sử dụng cho các ký tự một byte. C99 đã thêm một kiểu dữ liệu boolean. Ngoài ra còn có các loại có nguồn gốc bao gồm mảng, con trỏ, hồ sơ (
main()
{
    printf("hello, world\n");
}
5) và công đoàn (
int func(int N, int M)
{
  // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
  float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      p[i][j] = i + j;
  // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
  return 1;
}
2).

C thường được sử dụng trong chương trình hệ thống cấp thấp trong đó có thể thoát khỏi hệ thống loại. Trình biên dịch cố gắng đảm bảo tính chính xác của hầu hết các biểu thức, nhưng lập trình viên có thể ghi đè các kiểm tra theo nhiều cách khác nhau, bằng cách sử dụng một loại đúc để chuyển đổi một cách rõ ràng giá trị từ loại này sang loại khác hoặc bằng cách sử dụng con trỏ hoặc hiệp hội để diễn giải lại các bit bên dưới của một đối tượng dữ liệu theo một số cách khác.

Một số người tìm thấy cú pháp khai báo của C không trực quan, đặc biệt đối với các con trỏ chức năng. .

Chuyển đổi số học thông thường của C cho phép tạo mã hiệu quả, nhưng đôi khi có thể tạo ra kết quả không mong muốn. Ví dụ, việc so sánh các số nguyên đã ký và không dấu có chiều rộng bằng nhau đòi hỏi phải chuyển đổi giá trị đã ký thành không dấu. Điều này có thể tạo ra kết quả bất ngờ nếu giá trị đã ký là âm.

Pointers[edit][edit]

C hỗ trợ việc sử dụng các con trỏ, một loại tham chiếu ghi lại địa chỉ hoặc vị trí của một đối tượng hoặc chức năng trong bộ nhớ. Con trỏ có thể được thu hút để truy cập dữ liệu được lưu trữ tại địa chỉ được trỏ đến hoặc để gọi một hàm nhọn. Con trỏ có thể được thao tác bằng cách sử dụng chuyển số hoặc số học con trỏ. Biểu diễn thời gian chạy của giá trị con trỏ thường là một địa chỉ bộ nhớ thô (có thể được tăng cường bởi trường bù trừ trong từ), nhưng vì loại con trỏ bao gồm loại điều được trỏ đến tại thời điểm biên dịch. Số học con trỏ được tự động thu nhỏ theo kích thước của kiểu dữ liệu nhọn.

Con trỏ được sử dụng cho nhiều mục đích trong C. chuỗi văn bản thường được thao tác bằng cách sử dụng con trỏ thành các mảng ký tự. Phân bổ bộ nhớ động được thực hiện bằng cách sử dụng con trỏ; Kết quả của một

#include 

int main(void)
{
    printf("hello, world\n");
}
26 thường được chuyển đến loại dữ liệu của dữ liệu sẽ được lưu trữ. Nhiều loại dữ liệu, chẳng hạn như cây, thường được thực hiện dưới dạng các đối tượng
main()
{
    printf("hello, world\n");
}
5 được phân bổ động được liên kết với nhau bằng cách sử dụng con trỏ. Con trỏ đến các con trỏ khác thường được sử dụng trong các mảng đa chiều và mảng của các đối tượng
main()
{
    printf("hello, world\n");
}
5. Con trỏ đến các chức năng (con trỏ chức năng) rất hữu ích cho việc chuyển các chức năng làm đối số cho các hàm bậc cao hơn (như QSORT hoặc BSEARCH), trong các bảng điều phối hoặc như các cuộc gọi lại cho trình xử lý sự kiện. [33]

Một giá trị con trỏ null chỉ rõ ràng đến không có vị trí hợp lệ. Dereferencing Một giá trị con trỏ null không được xác định, thường dẫn đến một lỗi phân đoạn. Các giá trị con trỏ NULL rất hữu ích để chỉ ra các trường hợp đặc biệt như không có con trỏ "tiếp theo" trong nút cuối cùng của danh sách được liên kết hoặc dưới dạng dấu hiệu lỗi từ các chức năng trả về con trỏ. Trong bối cảnh thích hợp trong mã nguồn, chẳng hạn như gán cho biến con trỏ, hằng số con trỏ null có thể được viết là while9, có hoặc không có sự đúc rõ ràng đến loại con trỏ hoặc macro

#include 

int main(void)
{
    printf("hello, world\n");
}
30 được xác định bởi một số tiêu đề tiêu chuẩn. Trong bối cảnh có điều kiện, các giá trị con trỏ null đánh giá là sai, trong khi tất cả các giá trị con trỏ khác đánh giá là true.

Void Con trỏ (

#include 

int main(void)
{
    printf("hello, world\n");
}
31) trỏ đến các đối tượng thuộc loại không xác định và do đó có thể được sử dụng làm con trỏ dữ liệu "chung". Vì kích thước và loại của đối tượng nhọn không được biết đến, nên các con trỏ void không thể bị hủy bỏ, cũng không phải là số học của con trỏ trên chúng, mặc dù chúng có thể dễ dàng (và trong nhiều bối cảnh) được chuyển đổi đến và từ bất kỳ con trỏ đối tượng nào khác Loại. [33]

Việc sử dụng bất cẩn các con trỏ là có khả năng nguy hiểm. Bởi vì chúng thường không được kiểm soát, một biến con trỏ có thể được thực hiện để chỉ ra bất kỳ vị trí tùy ý nào, có thể gây ra các hiệu ứng không mong muốn. Mặc dù các con trỏ được sử dụng đúng cách đến những nơi an toàn, chúng có thể được thực hiện để chỉ ra những nơi không an toàn bằng cách sử dụng số học con trỏ không hợp lệ; các đối tượng mà chúng chỉ ra có thể tiếp tục được sử dụng sau khi phân loại (con trỏ lủng lẳng); Chúng có thể được sử dụng mà không được khởi tạo (con trỏ hoang dã); Hoặc chúng có thể được gán trực tiếp một giá trị không an toàn bằng cách sử dụng diễn viên, liên minh hoặc thông qua một con trỏ tham nhũng khác. Nói chung, C được phép cho phép thao tác và chuyển đổi giữa các loại con trỏ, mặc dù các trình biên dịch thường cung cấp các tùy chọn cho các cấp độ kiểm tra khác nhau. Một số ngôn ngữ lập trình khác giải quyết các vấn đề này bằng cách sử dụng các loại tham chiếu hạn chế hơn.

Arrays[edit][edit]

Các loại mảng trong C theo truyền thống có kích thước tĩnh, cố định được chỉ định tại thời điểm biên dịch. Tiêu chuẩn C99 gần đây hơn cũng cho phép một dạng mảng có độ dài thay đổi. Tuy nhiên, cũng có thể phân bổ một khối bộ nhớ (có kích thước tùy ý) vào thời gian chạy, sử dụng hàm

#include 

int main(void)
{
    printf("hello, world\n");
}
26 của thư viện tiêu chuẩn và coi nó như một mảng.

Vì các mảng luôn được truy cập (có hiệu lực) thông qua các con trỏ, các truy cập mảng thường không được kiểm tra so với kích thước mảng cơ bản, mặc dù một số trình biên dịch có thể cung cấp giới hạn kiểm tra như một tùy chọn. [36] [37] Do đó, vi phạm giới hạn mảng là có thể và có thể dẫn đến những hậu quả khác nhau, bao gồm truy cập bộ nhớ bất hợp pháp, tham nhũng dữ liệu, ghi đè bộ đệm và ngoại lệ thời gian chạy.

C không có điều khoản đặc biệt để khai báo các mảng đa chiều, mà dựa vào đệ quy trong hệ thống loại để khai báo các mảng của mảng, điều này có hiệu quả thực hiện điều tương tự. Các giá trị chỉ số của "mảng đa chiều" kết quả có thể được coi là tăng theo thứ tự đa năng. Các mảng đa chiều thường được sử dụng trong các thuật toán số (chủ yếu từ đại số tuyến tính được áp dụng) để lưu trữ ma trận. Cấu trúc của mảng C rất phù hợp với nhiệm vụ cụ thể này. Tuy nhiên, trong các phiên bản đầu của C, giới hạn của mảng phải được biết đến các giá trị cố định hoặc nếu không sẽ được truyền rõ ràng cho bất kỳ chương trình con nào yêu cầu chúng và không thể truy cập các mảng có kích thước động bằng cách sử dụng lập chỉ mục kép. .

Ví dụ sau đây sử dụng C (C99 trở lên hiện đại) hiển thị phân bổ một mảng hai chiều trên đống và sử dụng lập chỉ mục mảng đa chiều để truy cập (có thể sử dụng kiểm tra giới hạn trên nhiều trình biên dịch C):

int func(int N, int M)
{
  float (*p)[N][M] = malloc(sizeof *p);
  if (!p)
    return -1;
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      (*p)[i][j] = i + j;
  print_array(N, M, p);
  free(p);
  return 1;
}

Và đây là một triển khai tương tự bằng tính năng Auto VLA của C99:

int func(int N, int M)
{
  // Caution: checks should be made to ensure N*M*sizeof(float) does NOT exceed limitations for auto VLAs and is within available size of stack.
  float p[N][M]; // auto VLA is held on the stack, and sized when the function is invoked
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      p[i][j] = i + j;
  // no need to free(p) since it will disappear when the function exits, along with the rest of the stack frame
  return 1;
}

Khả năng thay thế mảng mảng [Chỉnh sửa][edit]

Ký hiệu đăng ký

#include 

int main(void)
{
    printf("hello, world\n");
}
33 (trong đó
#include 

int main(void)
{
    printf("hello, world\n");
}
34 chỉ định một con trỏ) là đường cú pháp cho ________ 235. [38] Tận dụng kiến ​​thức của trình biên dịch về loại con trỏ, địa chỉ
#include 

int main(void)
{
    printf("hello, world\n");
}
36 điểm không phải là địa chỉ cơ sở (được chỉ ra bởi
#include 

int main(void)
{
    printf("hello, world\n");
}
34) được tăng lên bởi
int func(int N, int M)
{
  float (*p)[N][M] = malloc(sizeof *p);
  if (!p)
    return -1;
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      (*p)[i][j] = i + j;
  print_array(N, M, p);
  free(p);
  return 1;
}
4 byte, mà được xác định là địa chỉ cơ sở được tăng lên bởi
int func(int N, int M)
{
  float (*p)[N][M] = malloc(sizeof *p);
  if (!p)
    return -1;
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
      (*p)[i][j] = i + j;
  print_array(N, M, p);
  free(p);
  return 1;
}
4 được nhân lên một yếu tố
#include 

int main(void)
{
    printf("hello, world\n");
}
34 trỏ đến. Do đó,
#include 

int main(void)
{
    printf("hello, world\n");
}
33 chỉ định phần tử
#include 

int main(void)
{
    printf("hello, world\n");
}
42 của mảng.

Hơn nữa, trong hầu hết các bối cảnh biểu thức (một ngoại lệ đáng chú ý là toán hạng

main()
{
    printf("hello, world\n");
}
17), một biểu thức của loại mảng được tự động chuyển đổi thành một con trỏ sang phần tử đầu tiên của mảng. Điều này ngụ ý rằng một mảng không bao giờ được sao chép toàn bộ khi được đặt tên là một đối số cho một hàm, mà chỉ là địa chỉ của phần tử đầu tiên của nó được thông qua. Do đó, mặc dù các cuộc gọi chức năng trong C sử dụng ngữ nghĩa qua từng giá trị, các mảng có hiệu lực được truyền qua tham chiếu.

Tổng kích thước của một mảng

#include 

int main(void)
{
    printf("hello, world\n");
}
34 có thể được xác định bằng cách áp dụng
main()
{
    printf("hello, world\n");
}
17 cho một biểu thức của loại mảng. Kích thước của một phần tử có thể được xác định bằng cách áp dụng toán tử
main()
{
    printf("hello, world\n");
}
17 cho bất kỳ phần tử nào được tham chiếu của một mảng while7, như trong
#include 

int main(void)
{
    printf("hello, world\n");
}
48. Do đó, số lượng các phần tử trong một mảng được khai báo while7 có thể được xác định là
#include 

int main(void)
{
    printf("hello, world\n");
}
50. Lưu ý rằng, nếu chỉ có một con trỏ tới phần tử đầu tiên có sẵn vì nó thường là trường hợp trong mã C do chuyển đổi tự động được mô tả ở trên, thông tin về loại đầy đủ của mảng và độ dài của nó bị mất.

Quản lý bộ nhớ [Chỉnh sửa][edit]

Một trong những chức năng quan trọng nhất của ngôn ngữ lập trình là cung cấp các cơ sở để quản lý bộ nhớ và các đối tượng được lưu trữ trong bộ nhớ. C cung cấp ba cách chính để phân bổ bộ nhớ cho các đối tượng: [33]

  • Phân bổ bộ nhớ tĩnh: Không gian cho đối tượng được cung cấp trong nhị phân vào thời gian biên dịch; Các đối tượng này có một mức độ (hoặc trọn đời) miễn là nhị phân chứa chúng được tải vào bộ nhớ.
  • Phân bổ bộ nhớ tự động: Các đối tượng tạm thời có thể được lưu trữ trên ngăn xếp và không gian này được tự động giải phóng và tái sử dụng sau khi khối mà chúng được khai báo được thoát ra.
  • Phân bổ bộ nhớ động: Các khối bộ nhớ có kích thước tùy ý có thể được yêu cầu tại thời gian chạy bằng các hàm thư viện như
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    26 từ vùng bộ nhớ được gọi là heap; Các khối này vẫn tồn tại cho đến khi sau đó được giải phóng để tái sử dụng bằng cách gọi hàm thư viện
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    52 hoặc
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    53

Ba cách tiếp cận này là phù hợp trong các tình huống khác nhau và có sự đánh đổi khác nhau. Ví dụ, phân bổ bộ nhớ tĩnh có ít chi phí phân bổ, phân bổ tự động có thể liên quan đến chi phí cao hơn một chút và phân bổ bộ nhớ động có khả năng có rất nhiều chi phí cho cả phân bổ và phân phối. Bản chất dai dẳng của các đối tượng tĩnh rất hữu ích để duy trì thông tin trạng thái qua các cuộc gọi chức năng, phân bổ tự động dễ sử dụng nhưng không gian xếp chồng thường bị hạn chế và thoáng qua hơn so với bộ nhớ tĩnh hoặc không gian heap và phân bổ bộ nhớ động cho phép phân bổ thuận tiện các đối tượng có các đối tượng có Kích thước chỉ được biết đến trong thời gian chạy. Hầu hết các chương trình C sử dụng rộng rãi cả ba.

Nếu có thể, phân bổ tự động hoặc tĩnh thường đơn giản nhất vì lưu trữ được quản lý bởi trình biên dịch, giải phóng lập trình của công việc dễ bị lỗi có khả năng phân bổ và phát hành lưu trữ theo cách thủ công. Tuy nhiên, nhiều cấu trúc dữ liệu có thể thay đổi kích thước khi chạy và vì phân bổ tĩnh (và phân bổ tự động trước C99) phải có kích thước cố định tại thời gian biên dịch, có nhiều tình huống cần thiết trong đó phân bổ động. [33] Trước tiêu chuẩn C99, các mảng có kích thước thay đổi là một ví dụ phổ biến về điều này. . không thể được phân bổ. (Phân bổ tĩnh quá lớn thường được phát hiện bởi trình liên kết hoặc trình tải, trước khi chương trình thậm chí có thể bắt đầu thực thi.)

Trừ khi có quy định khác, các đối tượng tĩnh chứa các giá trị con trỏ bằng 0 hoặc null khi khởi động chương trình. Các đối tượng được phân bổ tự động và động chỉ được khởi tạo nếu một giá trị ban đầu được chỉ định rõ ràng; Nếu không, ban đầu chúng có các giá trị không xác định (thông thường, bất kỳ mẫu bit nào xảy ra trong bộ lưu trữ, thậm chí có thể không đại diện cho một giá trị hợp lệ cho loại đó). Nếu chương trình cố gắng truy cập một giá trị không chính thức, kết quả không được xác định. Nhiều nhà biên dịch hiện đại cố gắng phát hiện và cảnh báo về vấn đề này, nhưng cả tích cực sai và âm tính sai đều có thể xảy ra.

Phân bổ bộ nhớ heap phải được đồng bộ hóa với việc sử dụng thực tế của nó trong bất kỳ chương trình nào sẽ được sử dụng lại càng nhiều càng tốt. Ví dụ: nếu con trỏ duy nhất vào phân bổ bộ nhớ heap vượt ra khỏi phạm vi hoặc có giá trị của nó được ghi đè trước khi nó được giải quyết rõ ràng, thì bộ nhớ đó không thể được phục hồi để tái sử dụng sau này và về cơ bản bị mất vào chương trình, một hiện tượng được gọi là bộ nhớ hở. Ngược lại, bộ nhớ có thể được giải phóng, nhưng sau đó được tham chiếu, dẫn đến kết quả không thể đoán trước. Thông thường, các triệu chứng thất bại xuất hiện trong một phần của chương trình không liên quan đến mã gây ra lỗi, gây khó khăn cho việc chẩn đoán lỗi. Những vấn đề như vậy được cải thiện bằng các ngôn ngữ với bộ sưu tập rác tự động.

Libraries[edit][edit]

Ngôn ngữ lập trình C sử dụng các thư viện làm phương pháp mở rộng chính của nó. Trong C, một thư viện là một tập hợp các chức năng có trong một tệp "lưu trữ" duy nhất. Mỗi thư viện thường có một tệp tiêu đề, chứa các nguyên mẫu của các hàm có trong thư viện có thể được sử dụng bởi một chương trình và khai báo các loại dữ liệu đặc biệt và ký hiệu macro được sử dụng với các chức năng này. Để một chương trình sử dụng thư viện, nó phải bao gồm tệp tiêu đề của thư viện và thư viện phải được liên kết với chương trình, trong nhiều trường hợp yêu cầu cờ trình biên dịch (ví dụ:

#include 

int main(void)
{
    printf("hello, world\n");
}
55, tốc ký cho "liên kết thư viện toán học"). [33]

Thư viện C phổ biến nhất là Thư viện tiêu chuẩn C, được chỉ định bởi các tiêu chuẩn ISO và ANSI C và đi kèm với mọi triển khai C (triển khai nhắm mục tiêu các môi trường giới hạn như hệ thống nhúng có thể chỉ cung cấp một tập hợp con của thư viện tiêu chuẩn). Thư viện này hỗ trợ đầu vào và đầu ra, phân bổ bộ nhớ, toán học, chuỗi ký tự và giá trị thời gian. Một số tiêu đề tiêu chuẩn riêng biệt (ví dụ:

main()
{
    printf("hello, world\n");
}
95) chỉ định các giao diện cho các phương tiện này và các cơ sở thư viện tiêu chuẩn khác.

Một bộ chức năng thư viện C phổ biến khác là các chức năng được sử dụng bởi các ứng dụng được nhắm mục tiêu cụ thể cho các hệ thống giống UNIX và UNIX, đặc biệt là các chức năng cung cấp giao diện cho kernel. Các chức năng này được trình bày chi tiết trong các tiêu chuẩn khác nhau như POSIX và đặc điểm kỹ thuật UNIX đơn.

Vì nhiều chương trình đã được viết bằng C, có rất nhiều thư viện khác có sẵn. Các thư viện thường được viết bằng C vì trình biên dịch C tạo mã đối tượng hiệu quả; Các lập trình viên sau đó tạo giao diện cho thư viện để các thói quen có thể được sử dụng từ các ngôn ngữ cấp cao hơn như Java, Perl và Python. [33]

Xử lý tệp và luồng [Chỉnh sửa][edit]

Đầu vào và đầu ra tệp (I/O) không phải là một phần của chính ngôn ngữ C mà thay vào đó được xử lý bởi các thư viện (như thư viện tiêu chuẩn C) và các tệp tiêu đề liên quan của chúng (ví dụ:

main()
{
    printf("hello, world\n");
}
95). Xử lý tệp thường được thực hiện thông qua I/O cấp cao hoạt động thông qua các luồng. Một luồng là từ quan điểm này, một luồng dữ liệu độc lập với các thiết bị, trong khi một tệp là một thiết bị cụ thể. I/O cấp cao được thực hiện thông qua liên kết của luồng vào một tệp. Trong thư viện tiêu chuẩn C, bộ đệm (vùng bộ nhớ hoặc hàng đợi) tạm thời được sử dụng để lưu trữ dữ liệu trước khi được gửi đến đích cuối cùng. Điều này làm giảm thời gian chờ đợi các thiết bị chậm hơn, ví dụ như ổ cứng hoặc ổ đĩa trạng thái rắn. Các hàm I/O cấp thấp không phải là một phần của thư viện C tiêu chuẩn [cần làm rõ] nhưng thường là một phần của lập trình "kim loại trần" (lập trình độc lập với bất kỳ hệ điều hành nào như chương trình nhúng hầu hết). Với một vài ngoại lệ, việc triển khai bao gồm I/O cấp thấp.clarification needed] but are generally part of "bare metal" programming (programming that's independent of any operating system such as most embedded programming). With few exceptions, implementations include low-level I/O.

Công cụ ngôn ngữ [Chỉnh sửa][edit]

Một số công cụ đã được phát triển để giúp các lập trình viên C tìm và sửa các câu lệnh với hành vi không xác định hoặc có thể là các biểu thức sai, với sự nghiêm ngặt lớn hơn so với trình biên dịch được cung cấp. Công cụ Lint là đầu tiên như vậy, dẫn đến nhiều người khác.

Kiểm tra và kiểm toán mã nguồn tự động có lợi trong bất kỳ ngôn ngữ nào và đối với C, nhiều công cụ như vậy tồn tại, chẳng hạn như Lint. Một thực tế phổ biến là sử dụng Lint để phát hiện mã đáng ngờ khi một chương trình được viết lần đầu tiên. Khi một chương trình vượt qua Lint, sau đó nó được biên dịch bằng trình biên dịch C. Ngoài ra, nhiều trình biên dịch có thể tùy chọn cảnh báo về các cấu trúc có giá trị về mặt cú pháp có khả năng thực sự là lỗi. Misra C là một bộ hướng dẫn độc quyền để tránh mã đáng ngờ như vậy, được phát triển cho các hệ thống nhúng. [39]

Ngoài ra còn có các trình biên dịch, thư viện và cơ chế cấp hệ điều hành để thực hiện các hành động không phải là một phần tiêu chuẩn của C, chẳng hạn như kiểm tra mảng, phát hiện tràn bộ đệm, tuần tự hóa, theo dõi bộ nhớ động và thu gom rác tự động.

Các công cụ như thanh lọc hoặc valgrind và liên kết với các thư viện chứa các phiên bản đặc biệt của các hàm phân bổ bộ nhớ có thể giúp phát hiện ra lỗi thời gian chạy trong việc sử dụng bộ nhớ.

Uses[edit][edit]

Đặt vấn đề để sử dụng trong lập trình hệ thống [Chỉnh sửa][edit]

Hướng dẫn c# mongodb join two collections - c # mongodb tham gia hai bộ sưu tập

Ngôn ngữ lập trình C

C được sử dụng rộng rãi để lập trình hệ thống trong việc triển khai các hệ điều hành và các ứng dụng hệ thống nhúng. [40] Đây là một số lý do:

  • Mã được tạo sau khi biên dịch không yêu cầu nhiều tính năng hệ thống và có thể được gọi từ một số mã khởi động một cách đơn giản - thật đơn giản để thực thi.
  • Các câu lệnh và biểu thức ngôn ngữ C thường ánh xạ tốt vào các chuỗi hướng dẫn cho bộ xử lý đích và do đó có nhu cầu thời gian chạy thấp về tài nguyên hệ thống-rất nhanh để thực hiện.
  • Với bộ toán tử phong phú, ngôn ngữ C có thể sử dụng nhiều tính năng của CPU mục tiêu. Trong trường hợp một CPU cụ thể có nhiều hướng dẫn bí truyền hơn, một biến thể ngôn ngữ có thể được xây dựng với các chức năng nội tại có lẽ để khai thác các hướng dẫn đó - nó có thể sử dụng tất cả các tính năng của CPU đích.
  • Ngôn ngữ giúp bạn dễ dàng phủ lên các cấu trúc lên các khối dữ liệu nhị phân, cho phép dữ liệu được hiểu, điều hướng và sửa đổi - nó có thể ghi cấu trúc dữ liệu, thậm chí các hệ thống tệp.
  • Ngôn ngữ hỗ trợ một tập hợp các toán tử phong phú, bao gồm thao tác bit, cho số học và logic số nguyên, và có lẽ các kích thước khác nhau của số điểm nổi-nó có thể xử lý dữ liệu có cấu trúc phù hợp một cách hiệu quả.
  • C là một ngôn ngữ khá nhỏ, chỉ có một số câu lệnh và không có quá nhiều tính năng tạo ra mã mục tiêu rộng rãi - nó có thể hiểu được.
  • C có quyền kiểm soát trực tiếp đối với phân bổ bộ nhớ và giải quyết, mang lại hiệu quả hợp lý và thời gian dự đoán cho các hoạt động xử lý bộ nhớ, mà không có bất kỳ mối quan tâm nào đối với các sự kiện thu gom rác ngoài thế giới lẻ tẻ-nó có hiệu suất dự đoán.
  • Phần cứng nền tảng có thể được truy cập bằng các con trỏ và loại trừng phạt, do đó các tính năng dành riêng cho hệ thống (ví dụ: thanh ghi kiểm soát/trạng thái, thanh ghi I/O) có thể được cấu hình và sử dụng với mã được viết trong C-nó tương tác tốt với nền tảng mà nó đang chạy.
  • Tùy thuộc vào trình liên kết và môi trường, mã C cũng có thể gọi các thư viện được viết bằng ngôn ngữ lắp ráp và có thể được gọi từ ngôn ngữ lắp ráp-nó tương tác tốt với mã cấp thấp khác.
  • C và các quy ước gọi và cấu trúc liên kết của nó thường được sử dụng cùng với các ngôn ngữ cấp cao khác, với các cuộc gọi cả đến C và từ C được hỗ trợ-nó tương tác tốt với mã cấp cao khác.
  • C có một hệ sinh thái rất trưởng thành và rộng, bao gồm các thư viện, khung, trình biên dịch nguồn mở, bộ gỡ lỗi và tiện ích, và là tiêu chuẩn thực tế. Có khả năng các trình điều khiển đã tồn tại trong C hoặc có một kiến ​​trúc CPU tương tự như một phần ba của trình biên dịch C.

Sau khi được sử dụng để phát triển web [Chỉnh sửa][edit]

Trong lịch sử, C đôi khi được sử dụng để phát triển web bằng giao diện Gateway (CGI) chung làm "cổng" để biết thông tin giữa ứng dụng web, máy chủ và trình duyệt. [41] C có thể đã được chọn qua các ngôn ngữ được giải thích vì tốc độ, sự ổn định và tính khả dụng gần như đại học. [42] Nó không còn là thông lệ để phát triển web được thực hiện trong C, [43] và nhiều công cụ phát triển web khác tồn tại.

Một số ngôn ngữ khác được viết bằng C [Chỉnh sửa][edit]

Hậu quả của tính khả dụng và hiệu quả rộng của C là các trình biên dịch, thư viện và thông dịch viên của các ngôn ngữ lập trình khác thường được thực hiện trong C. [44] Ví dụ, việc triển khai tham chiếu của Python, [45] Perl, [46] Ruby, [47] và PHP [48] được viết bằng C.

Được sử dụng cho các thư viện chuyên sâu về tính toán [Chỉnh sửa][edit]

C cho phép các lập trình viên tạo ra các triển khai hiệu quả các thuật toán và cấu trúc dữ liệu, bởi vì lớp trừu tượng từ phần cứng là mỏng và chi phí của nó thấp, một tiêu chí quan trọng cho các chương trình chuyên sâu tính toán. Ví dụ: Thư viện số học chính xác GNU, Thư viện khoa học GNU, Mathicala và MATLAB được viết hoàn toàn hoặc một phần bằng C. Nhiều ngôn ngữ hỗ trợ gọi các hàm thư viện trong C, ví dụ, khung công tác dựa trên Python sử dụng C cho Cao -Performance và các khía cạnh tương tác phần cứng.

C như một ngôn ngữ trung gian [chỉnh sửa][edit]

C đôi khi được sử dụng như một ngôn ngữ trung gian bằng cách triển khai các ngôn ngữ khác. Cách tiếp cận này có thể được sử dụng để di động hoặc thuận tiện; Bằng cách sử dụng C làm ngôn ngữ trung gian, các trình tạo mã cụ thể bằng máy bổ sung là không cần thiết. C có một số tính năng, chẳng hạn như các chỉ thị tiền xử lý số dòng và dấu phẩy không cần thiết tùy chọn ở cuối danh sách khởi tạo, hỗ trợ tổng hợp mã được tạo. Tuy nhiên, một số thiếu sót của C. Ngoài ra, các trình biên dịch chính đương đại GCC và LLVM đều có một biểu diễn trung gian không phải là C và các trình biên dịch đó hỗ trợ đầu mặt trước cho nhiều ngôn ngữ bao gồm C.

Các ứng dụng người dùng cuối [Chỉnh sửa][edit]

C cũng đã được sử dụng rộng rãi để triển khai các ứng dụng của người dùng cuối. [Cites cần] Tuy nhiên, các ứng dụng như vậy cũng có thể được viết bằng các ngôn ngữ cấp cao hơn, cao hơn.citation needed] However, such applications can also be written in newer, higher-level languages.

Limitations[edit][edit]

Sức mạnh của ngôn ngữ lắp ráp và sự tiện lợi của ... ngôn ngữ lắp ráp

- Dennis Ritchie, [49]

Mặc dù C đã được phổ biến, có ảnh hưởng và cực kỳ thành công, nhưng nó có những nhược điểm, bao gồm:

  • Xử lý bộ nhớ động tiêu chuẩn với
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    26 và
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    53 dễ bị lỗi. Lỗi bao gồm: rò rỉ bộ nhớ khi bộ nhớ được phân bổ nhưng không được giải phóng; và truy cập vào bộ nhớ được giải phóng trước đó.
  • Việc sử dụng con trỏ và thao tác trực tiếp bộ nhớ có nghĩa là tham nhũng bộ nhớ là có thể, có lẽ do lỗi của lập trình viên hoặc kiểm tra không đủ dữ liệu xấu.
  • Có một số kiểm tra loại, nhưng nó không áp dụng cho các khu vực như các hàm variadic và kiểm tra loại có thể bị phá vỡ một cách tầm thường hoặc vô tình.
  • Vì mã được tạo bởi trình biên dịch chứa một vài kiểm tra, nên có một gánh nặng cho lập trình viên để xem xét tất cả các kết quả có thể xảy ra và bảo vệ chống lại các bộ đệm, kiểm tra giới hạn mảng, ngăn xếp chồng, cạn kiệt bộ nhớ, điều kiện cuộc đua, cách ly luồng, v.v.
  • Việc sử dụng các gợi ý và thao tác thời gian chạy của các phương tiện này có thể có hai cách để truy cập cùng một dữ liệu (bí danh), điều này không thể xác định được tại thời điểm biên dịch. Điều này có nghĩa là một số tối ưu hóa có thể có sẵn cho các ngôn ngữ khác là không thể ở C. Fortran được coi là nhanh hơn.
  • Một số chức năng thư viện tiêu chuẩn, ví dụ:
    main()
    {
        printf("hello, world\n");
    }
    
    97, có thể dẫn đến quá trình ghi đè bộ đệm.
  • Có tiêu chuẩn hóa hạn chế trong hỗ trợ cho các biến thể cấp thấp trong mã được tạo, ví dụ: các quy ước gọi chức năng khác nhau và ABI; quy ước đóng gói cấu trúc khác nhau; Đặt hàng byte khác nhau trong các số nguyên lớn hơn (bao gồm cả endianness). Trong nhiều triển khai ngôn ngữ, một số tùy chọn này có thể được xử lý với Chỉ thị tiền xử lý ________ 261, [50] [51] và một số có từ khóa bổ sung, ví dụ: Sử dụng quy ước gọi
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    62. Nhưng chỉ thị và các tùy chọn không được hỗ trợ nhất quán. [52]
  • Xử lý chuỗi bằng thư viện tiêu chuẩn là tốn nhiều mã hóa, với quản lý bộ nhớ rõ ràng cần thiết.
  • Ngôn ngữ không trực tiếp hỗ trợ định hướng đối tượng, hướng nội, đánh giá biểu thức thời gian chạy, thuốc generic, v.v.
  • Có rất ít bảo vệ chống lại việc sử dụng các tính năng ngôn ngữ không phù hợp, có thể dẫn đến mã không thể giải quyết được. Cơ sở này cho Code Code đã được tổ chức với các cuộc thi như cuộc thi mã C quốc tế và cuộc thi C Underanded C.
  • C thiếu hỗ trợ tiêu chuẩn để xử lý ngoại lệ và chỉ cung cấp mã trả lại để kiểm tra lỗi. Các chức năng thư viện tiêu chuẩn
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    63 và
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    64 đã được sử dụng trong [53] để thực hiện cơ chế bắt thử thông qua các macro.

Đối với một số mục đích, các kiểu bị hạn chế của C đã được thông qua, ví dụ: Misra C hoặc Cert C, trong nỗ lực giảm cơ hội cho lỗi. Các cơ sở dữ liệu như CWE cố gắng đếm các cách C, v.v. có các lỗ hổng, cùng với các khuyến nghị để giảm thiểu.

Có những công cụ có thể giảm thiểu chống lại một số nhược điểm. Các trình biên dịch c đương đại bao gồm các séc có thể tạo ra các cảnh báo để giúp xác định nhiều lỗi tiềm năng.

Một số nhược điểm này đã thúc đẩy việc xây dựng các ngôn ngữ khác.

[edit]edit]

Hướng dẫn c# mongodb join two collections - c # mongodb tham gia hai bộ sưu tập

Biểu đồ chỉ số TIOBE, cho thấy sự so sánh về mức độ phổ biến của các ngôn ngữ lập trình khác nhau [54]

C có cả ảnh hưởng trực tiếp và gián tiếp đến nhiều ngôn ngữ sau này như C ++, C#, D, GO, Java, JavaScript, Perl, PHP, Rust và Unix's C Shell. [55] Ảnh hưởng phổ biến nhất là cú pháp; Tất cả các ngôn ngữ được đề cập kết hợp câu lệnh và (ít nhiều có thể nhận ra) cú pháp biểu thức của C với các hệ thống loại, mô hình dữ liệu và/hoặc cấu trúc chương trình quy mô lớn khác với các cấu trúc của C, đôi khi hoàn toàn.

Một số thông dịch C hoặc Cần C tồn tại, bao gồm Ch và Cint, cũng có thể được sử dụng để viết kịch bản.

Khi các ngôn ngữ lập trình hướng đối tượng trở nên phổ biến, C ++ và Object-C là hai phần mở rộng khác nhau của C cung cấp các khả năng hướng đối tượng. Cả hai ngôn ngữ ban đầu được triển khai dưới dạng trình biên dịch nguồn từ nguồn; Mã nguồn được dịch thành C, và sau đó được biên dịch với trình biên dịch C. [56]

Ngôn ngữ lập trình C ++ (ban đầu được đặt tên là "C với các lớp") đã được Bjarne Stroustrup nghĩ ra như một cách tiếp cận để cung cấp chức năng hướng đối tượng với cú pháp giống C. [57] C ++ thêm cường độ gõ lớn hơn, phạm vi và các công cụ khác hữu ích trong lập trình hướng đối tượng và cho phép lập trình chung thông qua các mẫu. Gần như một superset của C, C ++ bây giờ [khi nào?] Hỗ trợ hầu hết C, với một vài ngoại lệ.when?] supports most of C, with a few exceptions.

Mục tiêu-C ban đầu là một lớp rất "mỏng" trên đỉnh của C và vẫn là một siêu cấp nghiêm ngặt của C cho phép lập trình hướng đối tượng bằng cách sử dụng mô hình gõ động/tĩnh lai. Objective-C rút ra cú pháp của nó từ cả C và SmallTalk: cú pháp liên quan đến tiền xử lý, biểu thức, khai báo chức năng và các lệnh gọi chức năng được kế thừa từ C, trong khi cú pháp cho các tính năng hướng đối tượng ban đầu được lấy từ SmallTalk.

Ngoài C ++ và Objective-C, Ch, CILK và song song thống nhất C gần như là Supersets của C.

Xem thêm [sửa][edit]

  • Khả năng tương thích của C và C ++
  • So sánh Pascal và C
  • So sánh các ngôn ngữ lập trình
  • Cuộc thi mã c obfuscated quốc tế
  • Danh sách các ngôn ngữ lập trình dựa trên c
  • Danh sách trình biên dịch c

Notes[edit][edit]

  1. ^Mã ví dụ ban đầu sẽ biên dịch trên hầu hết các trình biên dịch hiện đại không ở chế độ tuân thủ tiêu chuẩn nghiêm ngặt, nhưng nó không hoàn toàn phù hợp với các yêu cầu của C89 hoặc C99. Trên thực tế, C99 yêu cầu một thông điệp chẩn đoán phải được tạo ra. The original example code will compile on most modern compilers that are not in strict standard compliance mode, but it does not fully conform to the requirements of either C89 or C99. In fact, C99 requires that a diagnostic message be produced.
  2. ^Hàm
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    00 thực sự có hai đối số, lần lượt là
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    66 và
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    67, có thể được sử dụng để xử lý các đối số dòng lệnh. Tiêu chuẩn ISO C (Mục 5.1.2.2.1) yêu cầu cả hai hình thức
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    00 phải được hỗ trợ, đây là điều trị đặc biệt không được cung cấp cho bất kỳ chức năng nào khác.
    The
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    00 function actually has two arguments,
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    66 and
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    67, respectively, which can be used to handle command line arguments. The ISO C standard (section 5.1.2.2.1) requires both forms of
    #include 
    
    int main(void)
    {
        printf("hello, world\n");
    }
    
    00 to be supported, which is special treatment not afforded to any other function.

References[edit][edit]

  1. ^Prinz, Peter; Crawford, Tony (ngày 16 tháng 12 năm 2005). C Bán kết. O'Reilly Media, Inc. P. & NBSP; 3. ISBN & NBSP; 9780596550714. Prinz, Peter; Crawford, Tony (December 16, 2005). C in a Nutshell. O'Reilly Media, Inc. p. 3. ISBN 9780596550714.
  2. ^Ritchie (1993): "Thompson đã thực hiện một nỗ lực ngắn gọn để tạo ra một hệ thống được mã hóa trong một phiên bản đầu của C trước khi các cấu trúc trong năm 1972, nhưng đã từ bỏ nỗ lực." Ritchie (1993): "Thompson had made a brief attempt to produce a system coded in an early version of C—before structures—in 1972, but gave up the effort."
  3. ^Fruderica (ngày 13 tháng 12 năm 2020). "Lịch sử của C". Cppreference.com. Được lưu trữ từ bản gốc vào ngày 24 tháng 10 năm 2020. Truy cập ngày 24 tháng 10 năm 2020. Fruderica (December 13, 2020). "History of C". The cppreference.com. Archived from the original on October 24, 2020. Retrieved October 24, 2020.
  4. ^Ritchie (1993): "Kế hoạch thành phần loại được thông qua bởi C nợ đáng kể cho Algol 68, mặc dù có lẽ, có lẽ, không xuất hiện dưới dạng mà các tín đồ của Algol sẽ chấp thuận." Ritchie (1993): "The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of."
  5. ^ AB "Verilog Hdl (và C)" (pdf). Trường nghiên cứu khoa học máy tính tại Đại học Quốc gia Úc. Ngày 3 tháng 6 năm 2010. Được lưu trữ từ bản gốc (PDF) vào ngày 6 tháng 11 năm 2013. Truy cập ngày 19 tháng 8 năm 2013. 1980s: & nbsp ;; Verilog lần đầu tiên được giới thiệu & nbsp ;; Verilog lấy cảm hứng từ ngôn ngữ lập trình Ca b "Verilog HDL (and C)" (PDF). The Research School of Computer Science at the Australian National University. June 3, 2010. Archived from the original (PDF) on November 6, 2013. Retrieved August 19, 2013. 1980s: ; Verilog first introduced ; Verilog inspired by the C programming language
  6. ^"C Ngôn ngữ giảm xuống mức độ phổ biến thấp nhất". Nhà phát triển.com. Ngày 9 tháng 8 năm 2016. Truy cập ngày 1 tháng 8 năm 2022. "C Language Drops to Lowest Popularity Rating". Developer.com. August 9, 2016. Retrieved August 1, 2022.
  7. ^ abcdefritchie (1993)a b c d e f Ritchie (1993)
  8. ^"Lập trình phổ biến ngôn ngữ". 2009. Lưu trữ từ bản gốc vào ngày 16 tháng 1 năm 2009. Truy cập ngày 16 tháng 1 năm 2009. "Programming Language Popularity". 2009. Archived from the original on January 16, 2009. Retrieved January 16, 2009.
  9. ^"Chỉ số cộng đồng lập trình tiobe". 2009. Lưu trữ từ bản gốc vào ngày 4 tháng 5 năm 2009. Truy cập ngày 6 tháng 5 năm 2009. "TIOBE Programming Community Index". 2009. Archived from the original on May 4, 2009. Retrieved May 6, 2009.
  10. ^ ab "Lịch sử của C". en.cppreference.com. Được lưu trữ từ bản gốc vào ngày 29 tháng 5 năm 2018. Truy cập ngày 28 tháng 5 năm 2018.a b "History of C". en.cppreference.com. Archived from the original on May 29, 2018. Retrieved May 28, 2018.
  11. ^"Chỉ số tiobe cho tháng 10 năm 2021". Truy cập ngày 7 tháng 10 năm 2021. "TIOBE Index for October 2021". Retrieved October 7, 2021.
  12. ^Ritchie, Dennis. "BCPL đến B đến C". Được lưu trữ từ bản gốc vào ngày 12 tháng 12 năm 2019. Truy cập ngày 10 tháng 9 năm 2019. Ritchie, Dennis. "BCPL to B to C". Archived from the original on December 12, 2019. Retrieved September 10, 2019.
  13. ^ Abcdejensen, Richard (ngày 9 tháng 12 năm 2020). "" Một điều ngu ngốc chết tiệt để làm "Nguồn gốc của C". ARS Technica. Truy cập ngày 28 tháng 3 năm 2022.a b c d e Jensen, Richard (December 9, 2020). ""A damn stupid thing to do"—the origins of C". Ars Technica. Retrieved March 28, 2022.
  14. ^ Abjohnson, S. C .; Ritchie, D. M. (1978). "Tính di động của các chương trình C và hệ thống UNIX". Công nghệ hệ thống Bell. J. 57 (6): 2021 Từ2048. Citeseerx & NBSP; 10.1.1.138.35. doi: 10.1002/j.1538-7305.1978.tb02141.x. S2CID & NBSP; 17510065. .a b Johnson, S. C.; Ritchie, D. M. (1978). "Portability of C Programs and the UNIX System". Bell System Tech. J. 57 (6): 2021–2048. CiteSeerX 10.1.1.138.35. doi:10.1002/j.1538-7305.1978.tb02141.x. S2CID 17510065. (Note: The PDF is an OCR scan of the original, and contains a rendering of "IBM 370" as "IBM 310".)
  15. ^McIlroy, M. D. (1987). Một người đọc Unix nghiên cứu: Các trích đoạn được chú thích từ hướng dẫn của lập trình viên, 1971 Phản1986 (PDF) (Báo cáo kỹ thuật). CSTR. Bell Labs. p. & nbsp; 10. 139. Lưu trữ (PDF) từ bản gốc vào ngày 11 tháng 11 năm 2017. Truy cập ngày 1 tháng 2 năm 2015. McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. p. 10. 139. Archived (PDF) from the original on November 11, 2017. Retrieved February 1, 2015.
  16. ^Kernighan, Brian W .; Ritchie, Dennis M. (tháng 2 năm 1978). Ngôn ngữ lập trình C (1st & nbsp; ed.). Vách đá Englewood, NJ: Hội trường Prentice. ISBN & NBSP; 978-0-13-110163-0. Kernighan, Brian W.; Ritchie, Dennis M. (February 1978). The C Programming Language (1st ed.). Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-110163-0.
  17. ^"C trang thủ công". Hướng dẫn sử dụng thông tin linh tinh miễn phí (FreeBSD 13.0 & nbsp; ed.). Ngày 30 tháng 5 năm 2011. Lưu trữ từ bản gốc vào ngày 21 tháng 1 năm 2021. Truy cập ngày 15 tháng 1 năm 2021. [1] Lưu trữ ngày 21 tháng 1 năm 2021, tại Wayback Machine "C manual pages". FreeBSD Miscellaneous Information Manual (FreeBSD 13.0 ed.). May 30, 2011. Archived from the original on January 21, 2021. Retrieved January 15, 2021. [1] Archived January 21, 2021, at the Wayback Machine
  18. ^Kernighan, Brian W .; Ritchie, Dennis M. (tháng 3 năm 1988). Ngôn ngữ lập trình C (2 & nbsp; ed.). Vách đá Englewood, NJ: Hội trường Prentice. ISBN & NBSP; 978-0-13-110362-7. Kernighan, Brian W.; Ritchie, Dennis M. (March 1988). The C Programming Language (2nd ed.). Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-110362-7.
  19. ^Stroustrup, Bjarne (2002). Anh chị em cạnh tranh: C và C ++ (PDF) (Báo cáo). Phòng thí nghiệm AT & T. Lưu trữ (PDF) từ bản gốc vào ngày 24 tháng 8 năm 2014. Truy cập ngày 14 tháng 4 năm 2014. Stroustrup, Bjarne (2002). Sibling rivalry: C and C++ (PDF) (Report). AT&T Labs. Archived (PDF) from the original on August 24, 2014. Retrieved April 14, 2014.
  20. ^C liêm chính. Tổ chức Quốc tế về Tiêu chuẩn hoá. Ngày 30 tháng 3 năm 1995. Lưu trữ từ bản gốc vào ngày 25 tháng 7 năm 2018. Truy cập ngày 24 tháng 7 năm 2018. C Integrity. International Organization for Standardization. March 30, 1995. Archived from the original on July 25, 2018. Retrieved July 24, 2018.
  21. ^"JTC1/SC22/WG14 & NBSP; - C". Trang chủ. ISO/IEC. Được lưu trữ từ bản gốc vào ngày 12 tháng 2 năm 2018. Truy cập ngày 2 tháng 6 năm 2011. "JTC1/SC22/WG14 – C". Home page. ISO/IEC. Archived from the original on February 12, 2018. Retrieved June 2, 2011.
  22. ^Andrew Binstock (ngày 12 tháng 10 năm 2011). "Phỏng vấn Herb Sutter". Tiến sĩ Dobbs. Được lưu trữ từ bản gốc vào ngày 2 tháng 8 năm 2013. Truy cập ngày 7 tháng 9 năm 2013. Andrew Binstock (October 12, 2011). "Interview with Herb Sutter". Dr. Dobbs. Archived from the original on August 2, 2013. Retrieved September 7, 2013.
  23. ^"Lịch trình sửa đổi C23 WG 14 N 2759" (PDF). www.open-std.org. Lưu trữ (PDF) từ bản gốc vào ngày 24 tháng 6 năm 2021. Truy cập ngày 10 tháng 10 năm 2021. "Revised C23 Schedule WG 14 N 2759" (PDF). www.open-std.org. Archived (PDF) from the original on June 24, 2021. Retrieved October 10, 2021.
  24. ^"TR 18037: nhúng c" (pdf). ISO / IEC. Lưu trữ (PDF) từ bản gốc vào ngày 25 tháng 2 năm 2021. Truy cập ngày 26 tháng 7 năm 2011. "TR 18037: Embedded C" (PDF). ISO / IEC. Archived (PDF) from the original on February 25, 2021. Retrieved July 26, 2011.
  25. ^Cáp Nhĩ Tân, Samuel P .; Steele, Guy L. (2002). C: Hướng dẫn tham khảo (5 & NBSP; Ed.). Vách đá Englewood, NJ: Hội trường Prentice. ISBN & NBSP; 978-0-13-089592-9. Chứa một ngữ pháp BNF cho C. Harbison, Samuel P.; Steele, Guy L. (2002). C: A Reference Manual (5th ed.). Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-089592-9. Contains a BNF grammar for C.
  26. ^Kernighan & Ritchie (1988), tr. & NBSP; 192. Kernighan & Ritchie (1988), p. 192.
  27. ^Kernighan & Ritchie (1978), tr. & NBSP; 3. Kernighan & Ritchie (1978), p. 3.
  28. ^"ISO/IEC 9899: 201X (ISO C11) Dự thảo ủy ban" (PDF). Lưu trữ (PDF) từ bản gốc vào ngày 22 tháng 12 năm 2017. Truy cập ngày 16 tháng 9 năm 2011. "ISO/IEC 9899:201x (ISO C11) Committee Draft" (PDF). Archived (PDF) from the original on December 22, 2017. Retrieved September 16, 2011.
  29. ^Kernighan & Ritchie (1988), trang & nbsp; 192, 259. Kernighan & Ritchie (1988), pp. 192, 259.
  30. ^"10 lỗi lập trình phổ biến trong C ++". Cs.Ucr.edu. Được lưu trữ từ bản gốc vào ngày 21 tháng 10 năm 2008. Truy cập ngày 26 tháng 6 năm 2009. "10 Common Programming Mistakes in C++". Cs.ucr.edu. Archived from the original on October 21, 2008. Retrieved June 26, 2009.
  31. ^Schultz, Thomas (2004). C và 8051 (thứ 3 & nbsp; ed.). Otsego, MI: PageFree Publishing Inc. P. & NBSP; 20. ISBN & NBSP; 978-1-58961-237-2. Được lưu trữ từ bản gốc vào ngày 29 tháng 7 năm 2020. Truy cập ngày 10 tháng 2 năm 2012. Schultz, Thomas (2004). C and the 8051 (3rd ed.). Otsego, MI: PageFree Publishing Inc. p. 20. ISBN 978-1-58961-237-2. Archived from the original on July 29, 2020. Retrieved February 10, 2012.
  32. ^Kernighan & Ritchie (1978), tr. & NBSP; 6. Kernighan & Ritchie (1978), p. 6.
  33. ^ ABCDEFGKLEMENS, Ben (2013). Thế kỷ 21 C. O'Reilly Media. ISBN & NBSP; 978-1-4493-2714-9.a b c d e f g Klemens, Ben (2013). 21st Century C. O'Reilly Media. ISBN 978-1-4493-2714-9.
  34. ^Feuer, Alan R .; Gehani, Narain H. (tháng 3 năm 1982). "So sánh các ngôn ngữ lập trình C và Pascal". Khảo sát điện toán ACM. 14 (1): 73 bóng92. doi: 10.1145/356869.356872. S2CID & NBSP; 3136859. Feuer, Alan R.; Gehani, Narain H. (March 1982). "Comparison of the Programming Languages C and Pascal". ACM Computing Surveys. 14 (1): 73–92. doi:10.1145/356869.356872. S2CID 3136859.
  35. ^Kernighan & Ritchie (1988), tr. & NBSP; 122. Kernighan & Ritchie (1988), p. 122.
  36. ^Ví dụ, GCC cung cấp _fortify_source. "Các tính năng bảo mật: Kiểm tra bộ đệm thời gian biên dịch (fortify_source)". Fedoraproject.org. Được lưu trữ từ bản gốc vào ngày 7 tháng 1 năm 2007, lấy ngày 5 tháng 8 năm 2012. For example, gcc provides _FORTIFY_SOURCE. "Security Features: Compile Time Buffer Checks (FORTIFY_SOURCE)". fedoraproject.org. Archived from the original on January 7, 2007. Retrieved August 5, 2012.
  37. ^เอี่ยม สิริวงศ์, โอภาศ (2016). Lập trình với C. Bangkok, Thái Lan: Công ty TNHH Giáo dục SE-Giáo dục Limited. Trang & NBSP; 225 Từ230. ISBN & NBSP; 978-616-08-2740-4. เอี่ยมสิริวงศ์, โอภาศ (2016). Programming with C. Bangkok, Thailand: SE-EDUCATION PUBLIC COMPANY LIMITED. pp. 225–230. ISBN 978-616-08-2740-4.
  38. ^Raymond, Eric S. (ngày 11 tháng 10 năm 1996). Từ điển hacker mới (thứ 3 & nbsp; ed.). MIT Press. P. & NBSP; 432. ISBN & NBSP; 978-0-262-68092-9. Được lưu trữ từ bản gốc vào ngày 12 tháng 11 năm 2012. Truy cập ngày 5 tháng 8 năm 2012. Raymond, Eric S. (October 11, 1996). The New Hacker's Dictionary (3rd ed.). MIT Press. p. 432. ISBN 978-0-262-68092-9. Archived from the original on November 12, 2012. Retrieved August 5, 2012.
  39. ^"Trang người đàn ông cho Lint (FreeBSD Phần 1)". unix.com. Ngày 24 tháng 5 năm 2001. Truy cập ngày 15 tháng 7 năm 2014. "Man Page for lint (freebsd Section 1)". unix.com. May 24, 2001. Retrieved July 15, 2014.
  40. ^Dale, Nell B .; Weems, Chip (2014). Lập trình và giải quyết vấn đề với C ++ (thứ 6 & nbsp; ed.). Burlington, MA: Học tập Jones & Bartlett. ISBN & NBSP; 978-1449694289. OCLC & NBSP; 894992484. Dale, Nell B.; Weems, Chip (2014). Programming and problem solving with C++ (6th ed.). Burlington, MA: Jones & Bartlett Learning. ISBN 978-1449694289. OCLC 894992484.
  41. ^Dr. Nguồn của DOBB. Hoa Kỳ .: Miller Freeman, Inc. Tháng 11 tháng 12 năm 1995. Dr. Dobb's Sourcebook. U.S.A.: Miller Freeman, Inc. November–December 1995.
  42. ^"Sử dụng C cho lập trình CGI". Linuxjournal.com. Ngày 1 tháng 3 năm 2005. Lưu trữ từ bản gốc vào ngày 13 tháng 2 năm 2010. Truy cập ngày 4 tháng 1 năm 2010. "Using C for CGI Programming". linuxjournal.com. March 1, 2005. Archived from the original on February 13, 2010. Retrieved January 4, 2010.
  43. ^Perkins, Luc (ngày 17 tháng 9 năm 2013). "Phát triển web trong C: Crazy? Hay điên như một con cáo?". Vừa phải. Perkins, Luc (September 17, 2013). "Web development in C: crazy? Or crazy like a fox?". Medium.
  44. ^"C - Mẹ của tất cả các ngôn ngữ". Học viện CNTT tại IITK. Ngày 13 tháng 11 năm 2018. Truy cập ngày 11 tháng 10 năm 2022. "C - the mother of all languages". ICT Academy at IITK. November 13, 2018. Retrieved October 11, 2022.
  45. ^"1. Mở rộng Python với C hoặc C ++ - Tài liệu Python 3.10.7". docs.python.org. Truy cập ngày 11 tháng 10 năm 2022. "1. Extending Python with C or C++ — Python 3.10.7 documentation". docs.python.org. Retrieved October 11, 2022.
  46. ^"Tổng quan về động cơ Perl 5 | opensource.com". opensource.com. Truy cập ngày 11 tháng 10 năm 2022. "An overview of the Perl 5 engine | Opensource.com". opensource.com. Retrieved October 11, 2022.
  47. ^"Để ruby ​​từ c và c ++". www.ruby-lang.org. Truy cập ngày 11 tháng 10 năm 2022. "To Ruby From C and C++". www.ruby-lang.org. Retrieved October 11, 2022.
  48. ^"PHP là gì? Làm thế nào để viết chương trình PHP đầu tiên của bạn". Freecodecamp.org. Ngày 3 tháng 8 năm 2022. Truy cập ngày 11 tháng 10 năm 2022. "What is PHP? How to Write Your First PHP Program". freeCodeCamp.org. August 3, 2022. Retrieved October 11, 2022.
  49. ^Metz, Cade. "Dennis Ritchie: Vai Steve Jobs đứng trên". Có dây. Truy cập ngày 19 tháng 4 năm 2022. Metz, Cade. "Dennis Ritchie: The Shoulders Steve Jobs Stood On". Wired. Retrieved April 19, 2022.
  50. ^Corob-MSft. "Chỉ thị Pragma và từ khóa __pragma và _pragma". learn.microsoft.com. Truy cập ngày 24 tháng 9 năm 2022. corob-msft. "Pragma directives and the __pragma and _Pragma keywords". learn.microsoft.com. Retrieved September 24, 2022.
  51. ^"Pragmas (bộ tiền xử lý c)". gcc.gnu.org. Truy cập ngày 24 tháng 9 năm 2022. "Pragmas (The C Preprocessor)". gcc.gnu.org. Retrieved September 24, 2022.
  52. ^"Pragmas". Intel. Truy cập ngày 10 tháng 4 năm 2022. "Pragmas". Intel. Retrieved April 10, 2022.
  53. ^Roberts, Eric S. (ngày 21 tháng 3 năm 1989). "Thực hiện các ngoại lệ trong C" (PDF). Trung tâm nghiên cứu hệ thống DEC. SRC-RR-40. Truy cập ngày 4 tháng 1 năm 2022. Roberts, Eric S. (March 21, 1989). "Implementing Exceptions in C" (PDF). DEC Systems Research Center. SRC-RR-40. Retrieved January 4, 2022.
  54. ^McMillan, Robert (ngày 1 tháng 8 năm 2013). "Có phải Java mất mojo không?". Có dây. Được lưu trữ từ bản gốc vào ngày 15 tháng 2 năm 2017. Truy cập ngày 5 tháng 3 năm 2017. McMillan, Robert (August 1, 2013). "Is Java Losing Its Mojo?". Wired. Archived from the original on February 15, 2017. Retrieved March 5, 2017.
  55. ^O'Regan, Gerard (ngày 24 tháng 9 năm 2015). Trụ cột của máy tính & nbsp ;: Một bản tóm tắt của các công ty công nghệ then chốt. ISBN & NBSP; 978-3319214641. OCLC & NBSP; 922324121. O'Regan, Gerard (September 24, 2015). Pillars of computing : a compendium of select, pivotal technology firms. ISBN 978-3319214641. OCLC 922324121.
  56. ^Rauchwerger, Lawrence (2004). Ngôn ngữ và trình biên dịch cho Điện toán song song & NBSP ;: Hội thảo quốc tế lần thứ 16, LCPC 2003, College Station, TX, USA, ngày 2 tháng 10 năm 2003 & NBSP ;: Sửa đổi các bài báo. Springer. ISBN & NBSP; 978-3540246442. OCLC & NBSP; 57965544. Rauchwerger, Lawrence (2004). Languages and compilers for parallel computing : 16th international workshop, LCPC 2003, College Station, TX, USA, October 2-4, 2003 : revised papers. Springer. ISBN 978-3540246442. OCLC 57965544.
  57. ^Stroustrup, Bjarne (1993). "Lịch sử của C ++: 1979−1991" (PDF). Lưu trữ (PDF) từ bản gốc vào ngày 2 tháng 2 năm 2019. Truy cập ngày 9 tháng 6 năm 2011. Stroustrup, Bjarne (1993). "A History of C++: 1979−1991" (PDF). Archived (PDF) from the original on February 2, 2019. Retrieved June 9, 2011.

Sources[edit][edit]

  • Ritchie, Dennis M. (tháng 3 năm 1993). "Sự phát triển của ngôn ngữ C. Thông báo ACM Sigplan. ACM. 28 (3): 201 Từ208. doi: 10.1145/155360.155580.28 (3): 201–208. doi:10.1145/155360.155580.
    • Theo lịch sự của tác giả, cũng tại Ritchie, Dennis M. "Chistory". www.bell-labs.com. Truy cập ngày 29 tháng 3 năm 2022.. Retrieved March 29, 2022.
  • Ritchie, Dennis M. (1993). "Sự phát triển của ngôn ngữ C. Hội nghị ACM Sigplan thứ hai về lịch sử ngôn ngữ lập trình (Hopl-II). ACM. Trang & NBSP; 201 Từ208. doi: 10.1145/154766.155580. ISBN & NBSP; 0-89791-570-4. Truy cập ngày 4 tháng 11 năm 2014.. Retrieved November 4, 2014.
  • Kernighan, Brian W .; Ritchie, Dennis M. (1988). Ngôn ngữ lập trình C (2 & nbsp; ed.). Hội trường Prentice. ISBN & NBSP; 0-13-110362-8.

Đọc thêm [Chỉnh sửa][edit]

  • Plauger, P.J. (1992). Thư viện C tiêu chuẩn (1 & nbsp; ed.). Hội trường Prentice. ISBN & NBSP; 978-0131315099. (nguồn) (source)
  • Banahan, M .; Brady, D .; Doran, M. (1991). Cuốn sách C: Có tiêu chuẩn ANSI C (2 & nbsp; ed.). Addison-Wesley. ISBN & NBSP; 978-0201544336. (tự do) (free)
  • Cáp Nhĩ Tân, Samuel; Steele, Guy Jr. (2002). C: Hướng dẫn tham khảo (5 & nbsp; ed.). Lề. ISBN & NBSP; 978-0130895929. (lưu trữ) (archive)
  • Vua, K.N. (2008). C Lập trình: Một cách tiếp cận hiện đại (2 & nbsp; ed.). W. W. Norton. ISBN & NBSP; 978-0393979503. (lưu trữ) (archive)
  • Griffiths, David; Griffiths, Dawn (2012). Đầu C đầu tiên (1 & nbsp; ed.). O'Reilly. ISBN & NBSP; 978-1449399917.
  • Perry, Greg; Miller, Trưởng khoa (2013). C Lập trình: Hướng dẫn của người mới bắt đầu tuyệt đối (3 & nbsp; ed.). Hàng đợi. ISBN & NBSP; 978-0789751980.
  • Deitel, Paul; Deitel, Harvey (2015). C: Cách lập trình (8 & nbsp; ed.). Lề. ISBN & NBSP; 978-0133976892.
  • Gusted, Jens (2019). C (2 & nbsp; ed.). Manning. ISBN & NBSP; 978-1617295812. (tự do) (free)

Liên kết bên ngoài [Chỉnh sửa][edit]

  • Trang web chính thức của nhóm làm việc ISO C
    • ISO/IEC 9899, ​​các tài liệu C chính thức có sẵn công khai, bao gồm cả cơ sở lý luận C99
    • "C99 với Corrigenda TC1, TC2 và TC3 bao gồm" (PDF). & NBSP; (3.61 & NBSP; MB)(PDF). (3.61 MB)
  • comp.lang.c Câu hỏi thường gặp
  • Lịch sử của C, bởi Dennis Ritchie

C được sử dụng để làm gì?

C Ngôn ngữ lập trình là ngôn ngữ lập trình độc lập với máy, chủ yếu được sử dụng để tạo ra nhiều loại ứng dụng và hệ điều hành như Windows và các chương trình phức tạp khác như cơ sở dữ liệu Oracle, Git, Python Interpreter và Games và được coi là nền tảng lập trình trong quá trình ...to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

Người vận hành trong C là gì?

Các toán tử C là một trong những tính năng trong C có các ký hiệu có thể được sử dụng để thực hiện các thao tác toán học, quan hệ, bitwise, có điều kiện hoặc logic. Ngôn ngữ lập trình C có rất nhiều nhà khai thác tích hợp để thực hiện các nhiệm vụ khác nhau theo nhu cầu của chương trình.one of the features in C which has symbols that can be used to perform mathematical, relational, bitwise, conditional, or logical manipulations. The C programming language has a lot of built-in operators to perform various tasks as per the need of the program.

C và C ++ có giống nhau không?

Mặc dù C và C ++ nghe có vẻ giống nhau, các tính năng và cách sử dụng của chúng khác nhau.C là ngôn ngữ lập trình thủ tục hỗ trợ các đối tượng và lớp.Mặt khác, C ++ là phiên bản nâng cao của lập trình C với hỗ trợ lập trình hướng đối tượng.. C is a procedural programming language that support objects and classes. On the other hand C++ is an enhanced version of C programming with object-oriented programming support.

C trong ngôn ngữ C là gì?

C là gì?C là ngôn ngữ lập trình đa năng được tạo ra bởi Dennis Ritchie tại Phòng thí nghiệm Bell năm 1972. Đây là một ngôn ngữ rất phổ biến, mặc dù đã già.C được liên kết mạnh mẽ với Unix, vì nó được phát triển để viết hệ điều hành Unix.a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.