Considérez ce sujet comme une suite du sujet suivant :
Versement précédent
Comportement indéfini et points de séquence
Revoyons cela drôle et alambiqué (les phrases en italique sont tirées du sujet ci-dessus *smile* ) :
i += ++i;
Nous disons que cela invoque un comportement indéfini. Je présume que lorsque nous disons cela, nous supposons implicitement que type de i
est l'un des types intégrés.
Et si le type de i
est un type défini par l'utilisateur ? Disons que son type est Index
qui est défini plus loin dans ce post (voir ci-dessous). Cela invoquerait-il encore un comportement non défini ?
Si oui, pourquoi ? N'est-il pas équivalent d'écrire i.operator+=(i.operator++());
ou même syntaxiquement plus simple i.add(i.inc());
? Ou bien, invoquent-ils eux aussi un comportement indéfini ?
Si non, pourquoi pas ? Après tout, l'objet i
est modifié deux fois entre des points de séquence consécutifs. Veuillez vous rappeler la règle de base : une expression ne peut modifier la valeur d'un objet qu'une seule fois entre deux "points de séquence" consécutifs. . Et si i += ++i
est une expression, alors elle doit invoquer un comportement indéfini. Si c'est le cas, alors ses équivalents i.operator+=(i.operator++());
et i.add(i.inc());
doit aussi invoquer undefined-behavior ce qui semble être faux ! (d'après ce que je comprends)
Ou, i += ++i
n'est pas un expression pour commencer ? Si c'est le cas, qu'est-ce que c'est et quelle est la définition de l'expression "l'eau" ? expression ?
Si c'est une expression, et en même temps, son comportement est également bien défini, alors cela implique que le nombre de points de séquence associés à une expression dépend d'une manière ou d'une autre de l'élément type des opérandes impliqués dans l'expression. Ai-je raison (même partiellement) ?
Au fait, que pensez-vous de cette expression ?
//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!
a[++i] = i; //Taken from the previous topic. But here type of `i` is Index.
Vous devez en tenir compte également dans votre réponse (si vous connaissez son comportement avec certitude) :-)
Est
++++++i;
bien défini en C++03 ? Après tout, c'est ça,
((i.operator++()).operator++()).operator++();
class Index
{
int state;
public:
Index(int s) : state(s) {}
Index& operator++()
{
state++;
return *this;
}
Index& operator+=(const Index & index)
{
state+= index.state;
return *this;
}
operator int()
{
return state;
}
Index & add(const Index & index)
{
state += index.state;
return *this;
}
Index & inc()
{
state++;
return *this;
}
};
13 votes
+1 grande question, qui a inspiré de grandes réponses. Je pense que je devrais dire que c'est toujours un code horrible qui devrait être remanié pour être plus lisible, mais vous le savez probablement de toute façon :)
0 votes
Depuis quand s++ est identique à ++s ?
4 votes
La question est la suivante : qui a dit que c'était pareil ? ou qui a dit que ce n'était pas pareil ? Cela ne dépend-il pas de la façon dont vous les mettez en œuvre ? (Note : je suppose que le type de
s
est un type défini par l'utilisateur)5 votes
Je ne vois pas scalaire l'objet étant modifié deux fois entre deux points de séquence...
0 votes
@Nawaz : c'est vrai... comme je le pensais...
3 votes
@Johannes : alors il s'agit de scalaire objet. Qu'est-ce que c'est ? Je me demande pourquoi je n'en ai jamais entendu parler avant. Peut-être parce que les tutoriels/C++-faq ne le mentionnent pas, ou ne le mettent pas en avant ? Est-il différent des objets de intégré type ?
3 votes
@Phillip : Évidemment, je ne vais pas écrire un tel code dans la vraie vie ; en fait, aucun programmeur sain d'esprit ne va l'écrire. Ces questions sont généralement conçues pour que nous puissions mieux comprendre tout ce qui concerne les comportements indéfinis et les points de séquence ! :-)
0 votes
@Nawaz mon entrée de faq couvre cela. Elle dit "en réalité, elle s'applique aux objets scalaires, car les autres objets sont soit non modifiables (tableaux), soit tout simplement non applicables à cette règle (objets de classe)".
0 votes
@Johannes : Oui, j'ai vu ça ce matin. :-)
2 votes
En C++11
i += ++i
devient bien défini, même pour les types intégrés. stackoverflow.com/q/10655290/3654961 votes
@Nawaz : très bonne question. Je n'ai jamais pensé aux types définis par l'utilisateur.