Câu trả lời cho câu hỏi của bạn phụ thuộc vào ngôn ngữ C mà nó đang hỏi về.
Ngôn ngữ được mô tả trong Hướng dẫn tham khảo C năm 1974 của Dennis Ritchie là ngôn ngữ cấp thấp mang đến sự tiện lợi cho việc lập trình của các ngôn ngữ cấp cao hơn. Các phương ngữ xuất phát từ ngôn ngữ đó cũng có xu hướng là ngôn ngữ lập trình cấp thấp.
Tuy nhiên, khi Tiêu chuẩn C 1989/1990 được xuất bản, nó không mô tả ngôn ngữ cấp thấp đã trở nên phổ biến để lập trình máy thực tế, mà thay vào đó mô tả một ngôn ngữ cấp cao hơn có thể - nhưng không bắt buộc phải - - Thực hiện ở cấp độ thấp hơn.
Như các tác giả của ghi chú C Standard, một trong những điều làm cho ngôn ngữ trở nên hữu ích là nhiều triển khai có thể được coi là trình biên dịch cấp cao. Do C cũng được sử dụng thay thế cho các ngôn ngữ cấp cao khác và vì nhiều ứng dụng không yêu cầu khả năng thực hiện những điều mà ngôn ngữ cấp cao không thể làm được, nên các tác giả của Tiêu chuẩn cho phép thực hiện theo cách tùy tiện nếu các chương trình đã cố gắng sử dụng các cấu trúc cấp thấp. Do đó, ngôn ngữ được mô tả bởi Tiêu chuẩn C chưa bao giờ là ngôn ngữ lập trình cấp thấp.
Để hiểu sự khác biệt này, hãy xem xét cách Ngôn ngữ của Ritchie và C89 sẽ xem đoạn mã:
struct foo { int x,y; float z; } *p;
...
p[3].y+=1;
trên nền tảng trong đó "char" là 8 bit, "int" là 16 bit big endian, "float" là 32 bit và các cấu trúc không có yêu cầu đệm hoặc căn chỉnh đặc biệt nên kích thước của "struct foo" là 8 byte.
Trên Ngôn ngữ của Ritchie, hành vi của câu lệnh cuối cùng sẽ lấy địa chỉ được lưu trong "p", thêm 3 * 8 + 2 [tức là 26] byte vào đó và lấy giá trị 16 bit từ các byte tại địa chỉ đó và tiếp theo , thêm một vào giá trị đó và sau đó ghi lại giá trị 16 bit đó vào cùng hai byte. Hành vi sẽ được định nghĩa là hành động theo các byte thứ 26 và 27 theo sau tại địa chỉ p mà không quan tâm đến loại đối tượng nào được lưu trữ ở đó.
Trong ngôn ngữ được xác định bởi Tiêu chuẩn C, trong trường hợp * p xác định một phần tử của "struct foo []", theo sau là ít nhất ba phần tử hoàn chỉnh hơn của loại đó, câu lệnh cuối cùng sẽ thêm một thành viên vào y phần tử thứ ba sau * p. Hành vi sẽ không được Tiêu chuẩn xác định trong bất kỳ trường hợp nào khác.
Ngôn ngữ của Ritchie là ngôn ngữ lập trình cấp thấp bởi vì, trong khi nó cho phép lập trình viên sử dụng các khái niệm trừu tượng như mảng và cấu trúc khi thuận tiện, nó xác định hành vi theo cách bố trí cơ bản của các đối tượng trong bộ nhớ. Ngược lại, ngôn ngữ được mô tả bởi C89 và các tiêu chuẩn mới hơn xác định mọi thứ theo cách trừu tượng hóa ở cấp độ cao hơn và chỉ xác định hành vi của mã phù hợp với điều đó. Việc triển khai chất lượng phù hợp với lập trình cấp thấp sẽ hành xử hữu ích trong nhiều trường hợp hơn so với tiêu chuẩn bắt buộc, nhưng không có tài liệu "chính thức" nào chỉ rõ việc triển khai phải làm gì để phù hợp với mục đích đó.
Ngôn ngữ C do Dennis Ritchie phát minh là một ngôn ngữ cấp thấp và được công nhận như vậy. Tuy nhiên, ngôn ngữ được phát minh bởi Ủy ban Tiêu chuẩn C, chưa bao giờ là ngôn ngữ cấp thấp trong trường hợp không có các đảm bảo được cung cấp thực hiện vượt xa các nhiệm vụ của Tiêu chuẩn.