Prenons le code suivant:
int main() {
    int i = 2;
    int b = ++i++;
    return 3;
}Il se compile avec ce qui suit avec une erreur:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
    3 |     int b = ++i++;
      |                ^~Cela me semble juste. L'incrément de suffixe a une priorité plus élevée que l'incrément de préfixe, donc le code est analysé comme int b = ++(i++);et iest une valeur r. D'où l'erreur.
Considérons maintenant cette variante entre parenthèses pour remplacer les priorités par défaut:
int main() {
    int i = 2;
    int b = (++i)++;
    return 3;
}Ce code compile et renvoie 3. À lui seul, cela me semble juste, mais il semble en contradiction avec le premier code.
La question: pourquoi (++i)un lvaluequand ine l'est pas?
Merci!
MISE À JOUR: le message d'erreur ci-dessus provenait de gcc (x86-64 9.2). Voici le rendu exact: erreur avec gcc
Clang x86-64 9.0.0 a un message assez différent: erreur avec clang
<source>:3:13: error: expression is not assignable
    int b = ++i++;
            ^ ~~~Avec GCC, vous avez l'impression que le problème est avec l'opérateur postfix et vous pouvez alors vous demander pourquoi ++iest OK alors que ce in'est pas le cas, d'où ma question. Avec Clang, il est plus clair que le problème vient de l'opérateur de préfixe.