/ / Pourquoi C ne supporte-t-il pas l'initialisation des variables const à l'aide d'une instruction if-else? - c, const

Pourquoi C ne supporte-t-il pas l'initialisation des variables const à l'aide d'une instruction if-else? - c, const

Je veux initialiser un const variable utilisant un sinon.
Par exemple:

const int foo;
if (bar) {
foo = 1;
} else {
foo = 2;
}

En Java, c’est un code légal (en utilisant final au lieu de const). La raison en est que, dans tous les résultats possibles, la variable est affectée une fois et n'est jamais réaffectée. En C, ce n'est pas un code légal. Quelle est la raison pour laquelle il ne peut pas être "code légal en C?"

Réponses:

6 pour la réponse № 1

Vous pouvez utiliser l'opérateur ternaire, mais gardez à l'esprit que pour les objets ayant une classe de stockage statique ou thread-locale, l'expression de l'initialiseur doit être une constante de compilation:

const int bar =  42;
#define BAR 42

#if 0
const int foo = bar ? 1 : 2; /*ERROR -- bar is not an integer constant */
#else
const int foo = BAR ? 1 : 2;
#endif

void fn(void)
{
const int foo = bar ? 1 : 2;
#if 0
static const int stc_foo = bar ? 1 : 2; /*ERROR*/
#else
static const int stc_foo = BAR ? 1 : 2;
#endif
}

La raison pour laquelle une instruction if-else ne peut "pas être utilisée pourl'initialisation est due au fait que permettre cela nécessiterait quelques modifications assez importantes de la grammaire C, et que cela compliquerait peut-être beaucoup la sémantique et la grammaire C.

Fondamentalement, au lieu de simplement vérifier que le déclarant est suivi de = Et un initializer expression et que cette expression d'initialiseurest une constante, le compilateur doit se souvenir de chaque variable statique / thread-locale qui n’a pas été initialisée, puis rechercher les branches évaluables au moment de la compilation exécutées de manière non conditionnelle, qui lui sont affectées et utilisées pour l’initialisation.

En outre, les déclarations devraient être autoriséesdans l'étendue du fichier (les instructions ne sont pas autorisées dans l'étendue du fichier dans la grammaire C actuelle) et vérifiées pour la constance et l'accès mémoire limité aux écritures dans les variables globales locales de translation translation. Alternativement, ils pourraient être implicitement transformés en constructeurs globaux, mais cela poserait des problèmes supplémentaires tels que l'ordre des constructeurs entre les unités de compilation (ce qui serait difficile à résoudre si la génération du constructeur était implicite), la nécessité d'implémentations pour supporter le constructeur global dans la première. lieu, ou le flou des caractéristiques de performance actuellement plutôt simples des affectations de variables statiques.


16 pour la réponse № 2

Vous pouvez initialiser le foo variable conditionnellement au moyen de la opérateur ternaire:

const int foo = bar ? 1 : 2;

Notez que si foo n’est pas une variable automatique, l’expression d’initialisation doit être analysée à la compilation, sinon elle ne sera pas compilée.


3 pour la réponse № 3

En C, const rend la variable lecture seulement.

Vous pouvez initialiser const variable uniquement au moment de la déclaration, pas après, car elle devient en lecture seule.

C’est pourquoi votre code n’est pas légal en C, comme vous l’êtes mettre à jour une lecture seule variable.

J'espère que ça va aider !!