int main() {
int y;
int x{ y = 5 };
//x is 5
}
Comment est-ce possible, puisque y = 5 n'est pas une expression calculable?
Aussi, pourquoi le compilateur ou l'IDE ne se plaignent-ils pas du fait que main () ne retourne pas d'int?
c++
initialization
declaration
assignment-operator
counterstriker0
la source
la source
y = 5
est une expression, et elle a de la valeur5
. Pourquoi pensez-vous que ce n'est pas le cas?return
demain
, voir cette question .y = 5
donne 5 ici. La possibilité pour les opérateurs d'affectation de renvoyer quelque chose est en effet une caractéristique bizarre de C / C ++.Réponses:
Je vais commencer par votre dernière question
Selon la norme C ++ (fonction principale 6.6.1)
Et par rapport à cette question
À partir de la norme C ++ (8.18 Opérateurs d'affectation et d'affectation composée)
Sp cette déclaration
peut être divisé de manière équivalente en deux instructions
De plus en C ++ vous pouvez même faire une référence à la variable y de la manière suivante
Voici un programme démonstratif
Sa sortie est
Vous pouvez cette déclaration
réécrire aussi
Cependant, tenez compte du fait qu'il existe une différence entre ces deux déclarations (ressemblant aux déclarations ci-dessus).
et
Dans la première déclaration, la variable
x
a le typeint
. Dans la deuxième déclaration, la variablex
a le typestd::initializer_list<int>
.Pour rendre la différence plus visible, voyez comment les valeurs des objets sont sorties.
La sortie du programme est
la source
C'est une affectation, et les affectations donnent des valeurs, c'est-à-dire le "type non qualifié cv de l'opérande gauche", voir [expr.ass / 3] . D'où
y = 5
résulte eny
, qui est5
, qui est utilisé pour initialiserx
.En ce qui concerne votre deuxième question, voir cppreference on main (ou [basic.start.main / 5] ):
Par conséquent, le compilateur ou l'IDE vous avertissant d'une
return
instruction manquante à la fin demain
serait tout à fait faux. Certes, le fait que vous devriez toujours lesreturn
objets de non-void
fonctions execptmain
est un peu ... eh bien, pour une raison historique, je suppose.la source
return
. -pedanticLe
operator=()
résultat est une valeur, qui est la valeur affectée à la variable. Pour cette raison, il est possible de chaîner des affectations comme ceci:la source
Si vous jetez un oeil à la documentation sur cppreference , vous verrez que
operator=()
retourner une référence à l'objet qui a été assigné. Par conséquent, une affectation peut être utilisée comme une expression qui renvoie l'objet qui a été affecté.Ensuite, c'est juste une affectation normale avec des accolades.
la source