8
votes

Est "const int x = get ();" Legal in c? Peut-on attribuer la valeur de retour d'une fonction à une déclaration constante lors de la déclaration?

Un contributeur hautement réputé "R .." sur ce forum m'a explicitement dit que 2 jours de retour:

Les initialisateurs des objets de la durée de stockage statique doivent être des expressions constantes. Le résultat d'un appel de fonction n'est pas une expression constante.

Il parlait de variables globales. Mais je ne suis pas sûr de ce qui se passe avec les constantes déclarées à l'intérieur du Main () Fonction ou n'importe quelle fonction de cette affaire.frait, je pense que cela est si intuitivement, même pour les constantes déclarées dans les fonctions, le programme suivant obtenu à partir du lien suivant, avec son (selon son correct , me confondre .

http://www.indiabix.com/c -Programmer / const / discussion-546 xxx

peut-on expliquer s'il est valide dans C d'affecter une valeur de retour à une constante?


11 commentaires

... et IIRC, je vous ai dit il y a deux jours qu'il n'y a pas de telles choses telles que Global Variables en C, et que vous parlez de variables déclarées à la portée du fichier qui ont une durée de stockage statique. Il y a une très grande différence. Les variables déclarées à la portée des fichiers ont beaucoup moins de visibilité; Ils sont seulement visibles dans leur propre unité de traduction, après leur déclaration. Les variables globales sont également visibles en dehors de leur unité de traduction et avant leur déclaration.


@undefinedbehaviour dans quel contexte vous avez posté ce commentaire? Êtes-vous r .. en utilisant un autre identifiant? Qui est IIRC? BTW, n'y a-t-il vraiment aucune variables globales en C? Les variables ne sont-elles pas déclarées en dehors de toutes les fonctions Variables globales?


Dans le contexte des "variables globales en C", qui n'existent pas pour les raisons que j'ai indiquées ci-dessus, j'ai mentionné qu'ils n'existent pas. Je ne suis pas r .. IIRC signifie "si je me rappelle correctement". Vous pouvez rechercher "Global" dans la standard C, si vous le souhaitez, et que ça ne viendra rien de pertinent. Comme je l'ai dit précédemment, les variables déclarées en dehors de toutes les fonctions sont déclarées au champ d'application de fichier , avec Durée de stockage statique et ils sont visibles seulement du point de déclaration jusqu'à ce que la fin de l'unité de traduction . Ceci est différent de la définition de variable globale dans d'autres langues.


@undefineDeHaviour Je l'avais percée dans ma tête comme une règle rapide du DUR n que les variables extérieures aux fonctions sont appelées «variables globales» dans C.Can, vous donnez une définition rigoureuse? qu'est-ce que j'appelle de telles variables en C alors?


@undefinedbehaviour même des livres et des sites Web populaires sur C utilise ce terme.


Wikipedia semble donner une très bonne définition, dans la toute première phrase. Qu'est-ce que vous ne comprenez pas la "portée du fichier"? Est int foo = bar; int bar = 0; correct? Pourquoi pas? Cela ne signifie-t-il pas que "la barre n'est pas accessible dans chaque portée"? Cela ne serait-il pas une violation de la définition de "global"?


@undefinedbehaviour ah! Maintenant que cela rend les choses beaucoup plus claires. int foo = bar; int bar = 0; n'est pas correct car la première instruction ne reconnaîtra pas bar , mais alors bar est supposé être accessible partout dans le fichier. Donc, ce n'est pas certainement global .now ai-je compris le tout? S'il vous plaît dites oui ou non.


Oui. Considérez en JavaScript, où fonction FOO () {bar = 42; } var bar = 0; est valide ... Considérez que, en C #, un module peut être compilé et le compilé dll lié ​​à un EXE . Tous les globaux dans ce DLL sont visibles au exe . Est-ce vrai des variables déclarées à la portée du fichier en C?


@undefinedbehaviour heureux que j'ai compris.As de dll et EXE , je ne sais pas très bien ce que je sais que je sais que dans le code source multi-fichier C, si un La variable est définie dans fichier1 mais est également utilisée dans fichier2 , puis dans fichier2 il est déclaré avec le mot clé .


Je suis content que vous soyez maintenant au courant, si seulement partiellement, de la distinction entre Variables globales et les variables déclarées à la portée du fichier . Cela vous aidera à comprendre Variables globales mieux dans d'autres langages de programmation.


@undefinedbehaviour partiellement? Même après tant de discussions? Qu'est-ce que je dois encore apprendre alors?


3 Réponses :


9
votes

Oui, c'est parfaitement valide, car votre variable est automatique, c'est-à-dire pas statique .

Les restrictions s'appliquent à statique variables, dont les valeurs doivent être connues à la compilation.

Notez que c Diffuse entre "expressions constantes" et autres expressions, et que la valeur initiale utilisée pour statique variables doit être une expression aussi constante. Pour les variables statiques , il n'y a pas de telle exigence.


11 commentaires

Il sera très utile que vous puissiez partager d'autres faits à ce sujet.Veuillez élaborer un peu si cette question est une duplication. Je suis sûr que de nombreux autres débutants aimeraient en apprendre davantage à ce sujet.


Dans une langue avec autant de comportement non défini non défini et défini par la mise en œuvre, "juste l'essayer" n'est presque jamais une réponse utile à une question de "est-ce légal?".


@Cairnarvon Great, comme si je n'étais pas déjà confondu déjà, je vois quelqu'un avec une réputation de 123 000 étant révélée. Cairnarvon Veuillez le poster dans une réponse, je suis sûr que beaucoup d'autres comme moi en profiteront.


@Cairnarvon Fair Point, bien que la suggestion "Essaye" est assez commune ici, elle laisse trop trop à la mise en œuvre. J'ai ré-écrit, merci.


@Shereerfish descendez-moi, c'est bien, ça me rend meilleur! REP est gentil mais pas magique.


@unWind se détendre Veuillez élaborer votre réponse un peu plus. Cela semble être trop important à ce problème.


@unwind Roulez-vous, aidez-moi sur cela.Un utilisateur appelé comportement non défini me dit qu'il n'y a pas de variables globales en C et que "les variables globales en C" est un terme trompeur.Veuillez confirmer cela. Je l'avais acheté dans ma tête que dans C toutes variables à la portée du fichier, déclarés à l'extérieur de toutes les fonctions sont appelées variables globales


@Koushik Certains peuvent avoir envie de harceler se détendre sur ce forum, mais je dirais que votre commentaire me rappelle l'histoire des mathématiciens Hardy & Ramanujam quand ils voyagaient dans une voiture et ont vu la plaque d'immatriculation de Un taxi qui passe dire que vous êtes le prochain ramanujam cependant :-)


Mot que je traque mais j'apprécie vraiment la qualité des questions et réponses ici. Vos questions sont également délicates. Merci de l'occasion d'apprendre :-). Bien sûr que je ne suis pas ramanujan et je ne peux même pas rêver d'être :-)


@Koushik j'ai vérifié, ce serait un autre + 20.Ils 123436 maintenant


Non, sa réputation ne sera-t-elle pas mise à jour de Coz Son atteint sa limite ou donc je suppose qu'auriez dû être complet d'ici. :-)



3
votes

Oui, cette affectation est valide C. mais x n'est pas une expression constante, il s'agit d'une variable de const-qualification, qui n'est pas la même chose (au moins en C).

C11 (N1570), § 6.6 Expressions constantes

Une expression constante entière doit avoir un type entier et disposer d'opérandes qui sont des constantes entière, des constantes de dénombrement, des constantes de caractère, tailleof expressions dont les résultats sont des constantes entière, _alignof expressions et flottant constantes qui sont les opérandes immédiates des moulages.

Les constantes d'entier ressemblent à 42 , 0L ou 89.0 . Par exemple, dans l'extrait de code suivant, 2 est une constante entière, mais x n'est pas. xxx


8 commentaires

Il sera extrêmement utile que vous élaborez un peu à peu près la différence entre les variables qualifiées de Cons et les expressions constantes dans ce contexte. Merci


Bien que je dois admettre votre avatar-photo m'a distrait depuis un moment. Nous ne voyons pas beaucoup sur ce forum, et très peu à côté de cette réputation élevée


Venez sur Mademoiselle de France, veuillez élaborer un peu plus sur Const-qualifié Variable VS Const-qualifié Variable dans cet endroit.plz


@Shereerfish n'a jamais jamais averti à personne des représentations sur Internet?


@ondefineDeHaviour Quoi de Représentations de pièges ? S'il vous plaît dire


@Shereerfish "Représentations de pièges" est pour E.g comme un syndicat ayant INT et Double, vous attribuez une valeur à la double mais l'accédez à la variable INT (qui est indéfinie). vous "peut-être" (en raison de la mise en œuvre), capable de modifier la valeur d'une variable de const mais son indéfini


@Sereerfish qui n'est pas une photo de l'utilisateur Kirilenko, c'est Le joueur de tennis , de qui notre Kirilenko apparemment est un ventilateur.


@Danielfischer ne savait pas que.Stopped regardant le tennis depuis les jours des joueurs de Sharapova.Russie est plus célèbre de la Cour qu'au cours de là.



1
votes

Ce que je pense vous fait confondre, c'est que vous mélangez le qualificatif const , avec le spécificateur stockage de stockage statique . Ce sont des fonctionnalités entièrement différentes, vous ne pouvez pas les comparer les uns avec les autres.

const signifie qu'une variable est en lecture seule dans la portée où elle a été déclarée, et il ne peut être donné qu'une valeur lorsqu'elle est initialisée. C'est-à-dire sur la même ligne où la variable const a été définie. Cela signifie rien d'autre.

la durée de stockage statique signifie qu'une variable existera tout au long de l'exécution d'un programme. Toutes les variables déclarées comme statique et toutes les variables déclaralisées à la portée du fichier ("globaux") ont une durée de stockage statique. Comme mentionné, les variables avec durée de stockage statique ne peuvent être initialisées qu'avec une expression constante , qui ne doit pas être confondue avec des variables en lecture seule déclaré comme Const . .

alors quelqu'un peut-il expliquer s'il est valide dans C pour attribuer une valeur de retour à une constante?

Cela dépend.

  • Toute variable déclarée à la portée du fichier a une durée de stockage statique.
  • une variable avec une durée de stockage statique doit être initialisée avec une expression constante.
  • Une valeur de retour d'une fonction n'est pas une expression constante.
  • Ainsi, une variable avec une durée de stockage statique ne peut pas être initialisée avec une valeur de retour d'une fonction.

    Comme vous pouvez le constater, cela n'avait rien à voir avec le mot clé const mais tout à voir avec où la variable a été déclarée. Avait la variable, const ou non, été déclarée à l'intérieur d'une portée locale, il serait parfaitement bien d'initialiser avec n'importe quelle valeur, comme illustré par votre exemple de code.


0 commentaires