Jawaban untuk pertanyaan Anda tergantung pada bahasa C yang ditanyakan.
Bahasa yang dijelaskan dalam Manual Referensi C 1974 Dennis Ritchie adalah bahasa tingkat rendah yang menawarkan beberapa kenyamanan pemrograman bahasa tingkat tinggi. Dialek yang berasal dari bahasa itu juga cenderung menjadi bahasa pemrograman tingkat rendah.
Namun, ketika Standar C 1989/1990 diterbitkan, ia tidak menggambarkan bahasa tingkat rendah yang telah menjadi populer untuk pemrograman mesin yang sebenarnya, tetapi sebaliknya menggambarkan bahasa tingkat yang lebih tinggi yang bisa - tetapi tidak diharuskan untuk menjadi- -diimplementasikan dalam istilah tingkat yang lebih rendah.
Seperti yang dicatat oleh penulis Standar C, salah satu hal yang membuat bahasa ini berguna adalah bahwa banyak implementasi dapat diperlakukan sebagai perakit tingkat tinggi. Karena C juga digunakan sebagai alternatif untuk bahasa tingkat tinggi lainnya, dan karena banyak aplikasi tidak memerlukan kemampuan untuk melakukan hal-hal yang tidak bisa dilakukan oleh bahasa tingkat tinggi, para penulis Standar mengizinkan implementasi untuk berperilaku secara sewenang-wenang jika program mencoba menggunakan konstruksi tingkat rendah. Akibatnya, bahasa yang dijelaskan oleh Standar C tidak pernah menjadi bahasa pemrograman tingkat rendah.
Untuk memahami perbedaan ini, pertimbangkan bagaimana Bahasa Ritchie dan C89 akan melihat potongan kode:
struct foo { int x,y; float z; } *p;
...
p[3].y+=1;
pada platform di mana "char" adalah 8 bit, "int" adalah 16 bit big-endian, "float" adalah 32 bit, dan struktur tidak memiliki persyaratan padding atau alignment khusus sehingga ukuran "struct foo" adalah 8 byte.
Pada Bahasa Ritchie, perilaku pernyataan terakhir akan mengambil alamat yang disimpan dalam "p", tambahkan 3 * 8 + 2 [yaitu 26] byte ke dalamnya, dan mengambil nilai 16-bit dari byte pada alamat di alamat itu dan selanjutnya , tambahkan satu ke nilai itu, dan kemudian tulis kembali nilai 16 bit itu ke dua byte yang sama. Perilaku akan didefinisikan sebagai bertindak pada byte 26 dan 27 mengikuti satu di alamat p tanpa memperhatikan jenis objek apa yang disimpan di sana.
Dalam bahasa yang didefinisikan oleh Standar C, jika * p mengidentifikasi elemen "struct foo []" yang diikuti oleh setidaknya tiga elemen lebih lengkap dari tipe itu, pernyataan terakhir akan menambahkan satu ke anggota y dari elemen ketiga setelah * p. Perilaku tidak akan didefinisikan oleh Standar dalam keadaan lain apa pun.
Bahasa Ritchie adalah bahasa pemrograman tingkat rendah karena, sementara itu memungkinkan seorang programmer untuk menggunakan abstraksi seperti array dan struktur ketika nyaman, itu mendefinisikan perilaku dalam hal tata letak objek di dalam memori yang mendasarinya. Sebaliknya, bahasa yang dijelaskan oleh C89 dan standar yang lebih baru mendefinisikan hal-hal dalam hal abstraksi tingkat yang lebih tinggi, dan hanya mendefinisikan perilaku kode yang konsisten dengan itu. Implementasi kualitas yang sesuai untuk pemrograman tingkat rendah akan berperilaku bermanfaat dalam lebih banyak kasus daripada yang diamanatkan oleh Standar, tetapi tidak ada dokumen "resmi" yang menentukan apa yang harus dilakukan suatu implementasi agar sesuai untuk tujuan tersebut.
Bahasa C yang ditemukan oleh Dennis Ritchie dengan demikian adalah bahasa tingkat rendah, dan diakui demikian. Bahasa yang ditemukan oleh Komite Standar C, bagaimanapun, tidak pernah menjadi bahasa tingkat rendah dengan tidak adanya jaminan yang diberikan implementasi yang melampaui mandat Standar.