#include <iostream.h> int main() { int a = 2; int b = 3; a++ += b; std::cout << a; } My understanding of this had been that this expression would first evaluate a+b, store that value in a and then increment it. What is happening here?
3 Réponses :
Ceci est une erreur 1 sup>: car Ma compréhension de cela avait été que cette expression évaluerait d'abord A + B, stocker cette valeur dans A, puis l'incrémentez-la. P>
BlockQuote> Non, ça ne le fait pas. Selon PRÉCÉDÉS DE L'OPLOIRE , 1) sup> Cette réponse suppose a ++ code> renvoie un temporaire (A Value PR ) La langue vous interdit de modifier car elle est supprimée dès que l'expression complète a été évaluée. . Ceci est une sorte de sécurité échec. P>
++ CODE> Évaluit avant
+ = code>. p>
A code> et
b code> sont types intégrés ou types de classe définis par l'utilisateur bien élevé. p> p>
C'est un peu vrai. Pour les types intégrés, c'est correct. Pour les types d'utilisateurs, il n'est pas nécessaire.
@Nathanoliver Parfois, je préfère une simple demi-vérité à un complexe complet.
Compte tenu des informations minimales fournies par OP, je pense qu'il est juste de supposer que a code> et
b code> est
int code> ou quelque chose de similaire.
Pour Build in Types Ceci est une erreur temporelle de compilation, car l'asignement nécessite une lvalue et A ++ (qui est due à la priorité de l'opérateur évalué en premier) est une r devalue. Dans votre exemple, le compilateur émettra une erreur comme celle-ci Voir Compiler-Explorer :
class A { public: A operator++(int) { return A{}; } A operator+=(const A&) { return A{}; } int i; }; int main() { A a; A b; a++ += b; return 0; }
Mis à part du mauvais point d'entrée et d'en-tête, ce code pose deux problèmes. P>
Opérateur d'incrément ++ ne renvoie pas de lvalue également, il ne peut donc pas être un argument d'opérateurs d'affectation. P> A code> est défini comme
const code> de sorte qu'il ne peut pas être un lvalue, vous ne pouvez donc pas être affecté par ++ ou + = opérateur.or Toute affectation. C'est une constante! p>
Dans la question des OPS, il est à l'origine lu B ++ ... vous ne devriez donc pas le signaler
Il y a eu une mauvaise édition sur le Q. Je l'ai résolu avec la réponse de PI afin que tout correspond au titre de la question.
Quelle erreur? Quel
a code>? Quel
B code>?
S'il vous plaît poster un MCVE ...
Selon le type
A code> et
B code>. Cette expression peut littéralement faire quelque chose. La réponse suppose qu'ils sont construits dans des types de nombres, mais vous devriez vraiment inclure un exemple de reproductible minimal
Si vous voulez faire ce que vous avez écrit dans votre question, vous devriez probablement l'écrire comme
a + = b; a ++; code> au lieu de le gérer ensemble dans une construction suspendue.
Compiler bien ici :-)
ERREUR: LVALUE requise comme opérande gauche de l'affectation ... A ++ elle-même une opération, le côté gauche (LValue) nécessitait une variable dans laquelle des données traitées peuvent être stockées.
Ceci est pas b> un duplicata de tout comportement non défini. Ce code n'est pas autorisé à compiler dans Standard C ++. Rouvert.
Dupliqué possible de Points de comportement et de séquence non définis
Si vous voulez dire
a = A + B + 1 code>; Pourquoi ne pas l'écrire?
Tant de mal à cet extrait de code. code> doit être code>,
MAIN_PROGRAM code> doit être
INT MAIN () CODE>,
,
const int a code> signifie que vous ne pouvez pas faire
a ++ code>,
cout code> doit être
std :: cout code> ou avoir un
antérieur :: Cout code>.
@Timrandall Vous avez changé la sémantique du programme en échangeant
A code> et
B code>.
A code> est même un const et ne devrait pas être incrémentable du tout maintenant. Plutôt que d'osciller A et B Fixer le point d'entrée
MAIN_PROGRAM CODE> ->
INT Main () Code> J'ai retourné votre changement
@Eljay voir ci-dessus Commentaire sur Const A