Rumah >pembangunan bahagian belakang >C++ >Adakah 2[arr] = 5 Menyusun dan Lulus Penegasan dalam C dan C ?

Adakah 2[arr] = 5 Menyusun dan Lulus Penegasan dalam C dan C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-03 07:17:10246semak imbas

Does 2[arr] = 5 Compile and Pass Assertion in C and C  ?

Mengakses Tatasusunan mengikut Indeks[array] dalam C dan C

Dalam ujian pengetahuan yang kadangkala dikemukakan oleh penemuduga, kod berikut dibentangkan:

int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?

Mungkin pada mulanya ungkapan 2[arr] gagal dihimpun, kerana ia kelihatan seperti cuba mengindeks tatasusunan menggunakan integer sebagai nama tatasusunan. Walau bagaimanapun, sintaks yang tidak dijangka ini sememangnya sah dalam kedua-dua C dan C .

Untuk memahami sebabnya, mari kita mendalami teknikal operator [] dalam bahasa ini.

C dan C Semantik Akses Tatasusunan

Mengikut standard C99 (6.5.2.1 perenggan 1), pengendali [] mengharapkan hujah dalam bentuk:

  • Satu ungkapan jenis penunjuk-ke-objek
  • Satu ungkapan jenis integer
  • Ungkapan terhasil daripada jenis yang sama dengan objek

Selanjutnya, perenggan 2 bahagian yang sama menerangkan bahawa E1[E2] bersamaan dengan (*((E1) (E2))). Ini menunjukkan bahawa ungkapan E1[E2] boleh ditafsirkan sebagai manipulasi penunjuk:

  • E1 ditukar kepada penunjuk kepada elemen awal tatasusunan.
  • E2 ditambah kepada penuding, menghasilkan penuding baharu yang menghala ke elemen E2-th tatasusunan.
  • Membatalkan rujukan yang terhasil penunjuk mengembalikan nilai elemen tatasusunan yang dipilih.

Yang penting, tiada keperluan dalam piawaian bahawa susunan hujah menjadi [] adalah waras. Oleh itu, ungkapan 2[arr] dianggap bersamaan dengan (*((2) (arr))).

  • 2, integer, ditambah pada penunjuk yang menunjuk kepada elemen pertama bagi arr.
  • Penunjuk yang terhasil menghala ke elemen ketiga arr.
  • Membatalkan penuding yang terhasil (iaitu, mengakses arr[2]) memberikan nilai 5 kepada elemen ketiga.

Oleh itu, kedua-dua tugasan dan penegasan seterusnya berjaya, seperti yang dijangkakan.

Atas ialah kandungan terperinci Adakah 2[arr] = 5 Menyusun dan Lulus Penegasan dalam C dan C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn