Maison >développement back-end >C++ >L'évaluation d'une fonction de longueur de chaîne récursive est-elle garantie au moment de la compilation en C ?

L'évaluation d'une fonction de longueur de chaîne récursive est-elle garantie au moment de la compilation en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 02:31:28822parcourir

Is the Evaluation of a Recursive String Length Function Guaranteed at Compile Time in C  ?

Calcul de la longueur d'une chaîne C au moment de la compilation

En C , il est possible d'effectuer des calculs sur des littéraux de chaîne lors de la compilation. Considérez l'extrait de code suivant :

<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>

Ce code utilise une fonction récursive pour déterminer la longueur d'une chaîne littérale donnée au moment de la compilation. En imprimant les résultats, nous pouvons confirmer que la fonction calcule correctement les longueurs de chaîne, c'est-à-dire 4 et 8. Le code assembleur résultant démontre également que ces calculs sont effectués lors de la compilation.

Cependant, la question critique demeure : l'évaluation de cette fonction de longueur est-elle garantie au moment de la compilation selon la norme C ?

La réponse n'est pas aussi simple qu'on pourrait le supposer. Selon le projet de norme C (section 5.19), les expressions constantes « peuvent être évaluées lors de la traduction ». Cependant, il ne s'agit que d'une note non normative, et non d'une garantie inébranlable.

Pour garantir une évaluation au moment de la compilation, nous pouvons utiliser deux stratégies :

  1. Utiliser des expressions constantes : Certaines expressions doivent être constantes selon la norme, comme les limites des tableaux ou les étiquettes de cas. L'emploi de la fonction length dans ces contextes garantit son évaluation au moment de la compilation.
  2. Initialiser une variable constexpr : L'affectation du résultat de la fonction length à une variable constexpr oblige le compilateur à exécuter la fonction à au moment de la compilation.

Par conséquent, bien que la norme n'exige pas explicitement que la fonction de longueur soit évaluée au moment de la compilation, nous pouvons appliquer une telle évaluation en l'utilisant comme expression constante ou en initialisant une variable constexpr. Cette pratique ouvre la possibilité d'effectuer des calculs sophistiqués sur des littéraux de chaîne lors de la compilation, tels que le calcul de hachages ou l'exécution de manipulations de chaînes complexes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn