0
votes

Opérandes dans "int i = 0"

Je voudrais demander si ce code court: xxx

a 1 opérande ou 2? Le i est un opérande, mais est 0 aussi? Selon Wikipedia , 0 ne devrait pas (ou peut-être que je me méprise). Si 0 n'est pas opérand, est-ce une constante ou quelque chose? Si c'est important, le code est en C99.


5 commentaires

Je ne peux pas voir comment le lien que vous avez fourni prend en charge votre demande. Citer les pièces pertinentes.


Dans la section "Informatique": "En informatique, un opérande fait partie d'une instruction informatique qui spécifie les données à manipuler ou à utiliser, tout en représentant les données elles-mêmes."


Je pense que nous ne manipulons ni ne fonctionnent pas sur 0 , juste une assise?


= fonctionne définitivement sur le 0 .


Assigner, c'est certainement une manipulation . C'est aussi une constante littérale ; Les deux ne sont pas mutuellement exclusifs.


3 Réponses :


7
votes

dans int i = 0; , = n'est pas un opérateur. C'est simplement une partie de la syntaxe variable initializaton. D'autre part, dans int i; i = 0; ce serait un opérateur.

Etant donné que = ici n'est pas un opérateur, il n'y a pas d'opérande. Au lieu de cela, 0 est l'initialiseur .


21 commentaires

Je conviens que cela fait partie de l'initialisation, mais affirmant que cela signifie que ce n'est pas un opérateur est assez audacieux. Avez-vous une source pour sauvegarder votre réclamation?


@Arbku Pouvez-vous me relier à la grammaire de révélateur? Dans C11 6.7 DÉCLARATIONS 1 J'ai trouvé Init-Déclarateur: \ N DÉCLARATOR \ N DÉCLARATOR = InitializIzer , ce qui ne mentionne pas les expressions d'assainissement. Au lieu de cela, il mentionne le symbole = directement.


@Holyblackcat hmm, vous avez peut-être raison, j'ai changé droit à la section sur l'initialisation qui commence par initialiseur: affectation-expression , mais il semble en effet que cela manque le le déclaratoire = partie. Port70.net/~nsz/c/c11/n1570.html# 6.7.9


@Arbku qui signifie probablement simplement qu'une mission peut être une initialisée, comme dans int a; int b = a = 1; .


Dans les premières initiales C d'anciennes ont été effectuées sans le signe = . (E.G., int i 0; IIRC). Les nouvelles sources UNIX maintenant publiques utilisent cela. Je ne sais pas bien pourquoi = a ensuite fait une partie de la syntaxe.


@Pskocikais, je dirais que je dirais parce que contrairement à int i 0; , int i = 0 n'a pas l'air moche. :)


@Broman opérateur doit faire partie d'une expression. S'il n'y a pas d'expression, il ne peut y avoir aucun opérateur. Il est similaire à la façon dont * n'est pas un opérateur dans int * x; .


@Holyblackcat Oui, c'est correct, d'où mon argument original de la grammaire est invalide. (Sans rapport avec cela, je dirais toujours que le i et le 0 pourrait être appelé opérandes, comme si elles seraient dans quelque chose comme MOV [RBP + 4] , 0 , mais c'est plus d'un argument général que tout basé sur la nomenclature C.)


@Holyblackcat beauté dans les yeux du spectateur (je ressemble en quelque sorte à la syntaxe distincte en fait) mais il y avait une raison spécifique où il s'est affronté avec quelque chose d'autre IIRC. J'aurais dû sauver la source que je l'ai vue à Parce que je n'ai pas beaucoup de chance d'essayer de le trouver maintenant.


@Holyblackcat Je fais de mon mieux pour falsifier votre demande en ce moment, car c'était vraiment intéressant. Je n'ai rien trouvé qui supporte qu'un opérateur ne peut exister en dehors d'une expression, ni qu'il n'y a pas d'expression ici.


BTW La question initiale concerne opérandes , pas les opérateurs. Donc, on pourrait affirmer que, quel que soit le = s'appelle un opérateur dans ce contexte, il reste (au moins conceptuellement) et "opération" se produisant (initialisation i à à < Code> 0 ), et les opérandes seraient conceptuellement être le i et le 0 . (Encore une fois, on pourrait également affirmer que, selon le contexte, l'existence de cette initialisation n'entraînerait peut-être aucune opération réelle "", par exemple, il pourrait être optimisé par le compilateur.)


@Bromanais, je dirais aussi que vous avez besoin d'une expr pour un opérateur. Pas que cela compte beaucoup. C'est juste la terminologie. Mais les opérateurs font des trucs et les déclarations ne déclarent que quelque chose qui est quelque part, que pour la déclaration statique-viete n'implique pas beaucoup de choses (pour les habitants, cependant. Là, il s'agit essentiellement d'une combinaison d'une déclaration vide avec une opération d'affectation).


@Broman Pour vérifier s'il y a une expression ici, vérifiez la grammaire liée ci-dessus. Selon la grammaire, la seule expression ici est le 0 lui-même. "tout ce qui supporte qu'un opérateur ne peut pas exister en dehors d'une expression" qui n'est pas un argument solide, mais C11 6.5 expressions 1 définit une expression comme "une séquence d'opérateurs et opérandes ". Cela ne dit pas que les opérateurs ne peuvent pas apparaître en dehors des expressions, mais pour moi, cela semble être impliqué.


@Pskocik ouais, je lis et je lis et je dois convenir qu'un opérateur ne peut pas exister sans expression. Mais je ne suis toujours pas convaincu que int i = 0; ne contient pas d'expression, à l'exception de l'expression triviale 0 .


@Holyblackcat Voir mon commentaire ci-dessus.


@Broman Eh bien, une expression est un terme grammatical, vous pouvez donc simplement vérifier si int i = 0; correspond à la grammaire pour une expression ou non.


@Arbku en effet, cela dépend de la façon dont vous définissez un opérande. Je suis habitué à la définir comme un argument d'un opérateur. C11 6.5 expressions 1 "Une expression est une séquence d'opérateurs et d'opérandes" n'est pas une preuve solide de cela, mais la norme ne semble pas définir "un opérande" partout.


Hmmm, c'était un très délicat et je suis parfaitement conscient que je suis sur une glace mince ici, mais je dirais qu'un déclaratoire comptent comme une expression, et la raison pour laquelle vous ne trouvez pas de déclarateur dans La grammaire des expressions est le fait que tous les déclarants sont des identifiants et un identifiant unique est une expression selon la grammaire.


Oh, j'ai trouvé quelque chose qui peut prouver ce que j'ai tort. "Un identifiant est une expression primaire, à condition qu'il ait été déclaré désignant un objet"


Laissez-nous Continuez cette discussion en chat .


@Pskocik s'il vous plaît rejoindre le chat



2
votes

Étant donné que vous avez marqué la question comme "C", une façon de regarder c'est en lisant la norme C. Comme indiqué par Cette réponse , initialisation (telle que int i = 0 ) n'est pas un expression en soi, et par une lecture stricte de la norme, le = n'est pas un opérateur en fonction de l'utilisation de ces termes de la norme .

Il n'est pas aussi clair si i et 0 sont des opérandes. D'une part, la norme C ne semble pas se référer aux parties de l'initialisation comme opérandes. D'autre part, cela ne définit pas le terme "opérande" de manière exhaustive. Par exemple, on pourrait interpréter la section 6.3 comme appelant presque toute partie de non-opérateur d'une expression un "opérande", et donc au moins le 0 se qualifierait comme une.

(Notez également que si le code était int i; i = 0; à la place, le dernier i et le 0 serait définitivement tous les deux Soyez des opérandes de l'opérateur d'affectation = . Il reste difficile de savoir si l'intention de la question était de faire une distinction entre affectation et initialisation.)

Outre la norme C, vous vous référez également à Wikipedia , en particulier:

Dans l'informatique, un opérande fait partie d'une instruction informatique qui spécifie quelles données doivent être manipulées ou activées, tout en représentant les données elles-mêmes.

Si nous considérons le contexte d'une "instruction informatique", le code C pourrait être naïf sur le code d'assemblage comme MOV [EBP-4], 0 où les deux opérandes seraient clairement < code> [EBP-4] (un emplacement où la variable appelée i est stockée) et le 0 , qui rendrait les deux i et 0 des opérandes par cette définition. Pourtant, en réalité, le code est susceptible d'être optimisé par le compilateur sous une forme différente, telle que stocker uniquement i dans un registre, auquel cas la mise à zéro, il pourrait devenir XOR EAX, EAX < / code> où le 0 n'existe plus comme un opérande explicite (mais est le résultat de l'opération). Ou, l'ensemble 0 peut être optimisé et remplacé par une valeur différente qui est attribuée inévitablement. Ou, la variable entière pourrait finir par être supprimée, par exemple, s'il est utilisé comme compteur de boucle et que la boucle est déroulée.

Donc, à la fin, soit il s'agit d'une question philosophique ("le zéro existe-t-il en tant qu'opérande s'il est optimisé"), ou juste une question de décider de l'utilisation souhaitée des termes (peut-être en fonction de sur le contexte de la discussion).


0 commentaires

1
votes

Le i code> est un opérande, mais est 0 code> aussi? Selon Wikipedia, 0 ne devrait pas (Ou peut-être que j'ai mal compris). p>

La question des liens vers la page Wikipedia décrivant le terme "opérande" dans un contexte mathématique. Cela a probablement des facteurs dans votre confusion quant à savoir si le 0 sur le côté droit du = code> est un opérande, car dans une déclaration mathématique d'égalité telle que figurant dans l'article, il n'est en aucun cas conventionnel à considérer = code> un opérateur. Il n'exprime pas de calcul, les expressions qu'elle concerne ne sont pas utilisées. c'est-à-dire em> ils ne fonctionnent pas comme des opérandes. P>

Vous avez placé la question dans le contexte C, cependant, et en C, = code> peut être utilisé comme une opérateur d'assignation. Ceci est un opérateur EM> Bona Fide EM> qu'il exprime une opération (simple) qui produit un résultat de deux opérandes, et a également un effet secondaire sur l'opérande de gauche. Dans une déclaration d'affectation telle que p> xxx pré>

, alors, les deux i code> et 0 code> sont des opérandes. P> En ce qui concerne ... p>

Si 0 n'est pas opérand, est-ce une constante ou quelque chose? p> blockQuote>

... 0 code> debout sur son propre est em> une constante en C, mais qui a peu à voir avec le fait que cela sert d'opérande dans n'importe quel Contexte donné. Être un opérande est une manière une expression, y compris simplement 0 code>, peut être utilisé em>. Plus sur cela dans un instant. P>

Il est maintenant difficile de savoir si c'était l'intention, mais le code réellement présenté dans la question est très important dans la question de la déclaration d'attribution ci-dessus. Comme les autres réponses observent également, P>

int i = 0;


0 commentaires