-8
votes

Pourquoi l'expression 'A ++ + = B' donne-t-elle une erreur?

#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?

12 commentaires

Quelle erreur? Quel a ? Quel B ?


S'il vous plaît poster un MCVE ...


Selon le type A et B . 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 ++; 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 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 ; Pourquoi ne pas l'écrire?


Tant de mal à cet extrait de code. doit être , MAIN_PROGRAM doit être INT MAIN () , , const int a signifie que vous ne pouvez pas faire a ++ , cout doit être std :: cout ou avoir un antérieur :: Cout .


@Timrandall Vous avez changé la sémantique du programme en échangeant A et B . A 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 -> INT Main () J'ai retourné votre changement


@Eljay voir ci-dessus Commentaire sur Const A


3 Réponses :


8
votes

Ceci est une erreur 1 : xxx

car a ++ 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.


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.

Non, ça ne le fait pas. Selon PRÉCÉDÉS DE L'OPLOIRE , ++ Évaluit avant + = .


1) Cette réponse suppose A et b sont types intégrés ou types de classe définis par l'utilisateur bien élevé.


3 commentaires

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 et b est int ou quelque chose de similaire.



0
votes

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;
}


0 commentaires

0
votes

Mis à part du mauvais point d'entrée et d'en-tête, ce code pose deux problèmes.

A est défini comme const 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!

Opérateur d'incrément ++ ne renvoie pas de lvalue également, il ne peut donc pas être un argument d'opérateurs d'affectation.


2 commentaires

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.