Mengira Panjang Rentetan C pada Masa Penyusunan
Dalam C , adalah mungkin untuk melakukan pengiraan pada literal rentetan semasa penyusunan. Pertimbangkan coretan kod berikut:
<code class="c++">#include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); }</code>
Kod ini menggunakan fungsi rekursif untuk menentukan panjang literal rentetan yang diberikan pada masa penyusunan. Dengan mencetak keputusan, kami boleh mengesahkan bahawa fungsi mengira panjang rentetan dengan betul, iaitu, 4 dan 8. Kod pemasangan yang terhasil juga menunjukkan bahawa pengiraan ini dilakukan semasa penyusunan.
Walau bagaimanapun, soalan kritikal kekal: adakah penilaian fungsi panjang ini dijamin berlaku pada masa penyusunan mengikut piawaian C?
Jawapannya tidak semudah yang disangkakan. Mengikut piawaian draf C (bahagian 5.19), ungkapan malar "boleh dinilai semasa terjemahan." Walau bagaimanapun, ini hanyalah nota bukan normatif, bukan jaminan yang kukuh.
Untuk memastikan penilaian masa penyusunan, kami boleh menggunakan dua strategi:
Oleh itu, walaupun piawaian tidak secara eksplisit mewajibkan fungsi panjang dinilai pada masa penyusunan, kami boleh menguatkuasakan penilaian tersebut dengan menggunakannya sebagai ungkapan malar atau memulakan pembolehubah constexpr. Amalan ini membuka kemungkinan melakukan pengiraan yang canggih pada literal rentetan semasa penyusunan, seperti mengira cincang atau melakukan manipulasi rentetan yang kompleks.
Atas ialah kandungan terperinci Adakah Penilaian Fungsi Panjang Rentetan Rekursif Dijamin pada Masa Kompilasi dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!