Warum ist a = i + i ++ undefiniert und nicht spezifiziertes Verhalten?
Ich habe einige sehr gute Antworten über undefiniertes Verhalten und Sequenzpunkte gelesen (z.Undefiniertes Verhalten und Sequenzpunkte) und ich verstehe, dass
int i = 1;
a = i + i++; //this is undefined behaviour
ist undefinierter Code gemäß dem C ++ - Standard. Aber was ist die tiefere Begründung dafür, dass es sich um undefiniertes Verhalten handelt? Wäre es nicht genug, um es unspezifisch zu machen? Das normale Argument ist, dass C ++ - Compiler mit wenigen Sequenzpunkten besser für verschiedene Architekturen optimieren können, aber nicht auch diese Optimierungen zulassen, wenn sie nicht angegeben werden? Im
a = foo(bar(1), bar(2)); //this is unspecified behaviour
Der Compiler kann auch optimieren, und es ist kein undefiniertes Verhalten. Im ersten Beispiel scheint es klar zu sein, dass a entweder 2 oder 3 ist, daher scheint mir die Semantik klar zu sein. Ich hoffe, es gibt eine Begründung, warum einige Dinge nicht spezifiziert sind und andere undefiniert.