Il codice illustra questa differenza:La precedenza dell'operatore in C++ differisce per i puntatori e gli iteratori?
#include <iostream>
#include <string>
int main()
{
char s[] = "ABCD";
std::string str(s);
char *p = s;
while(*p) {
*p++ = tolower(*p); // <-- incr after assignment
}
std::cout << s << std::endl;
std::string::iterator it = str.begin(), end = str.end();
while(it != end) {
*it++ = tolower(*it); // <-- incr before assignment ?
}
std::cout << str << std::endl;
return 0;
}
produce output:
abcd
bcd
se separiamo operazione di assegnazione ed esercente minimo:
while(it != end) {
*it = tolower(*it); // <-- incr before assignment ?
it++;
}
l'uscita sarà come previsto.
Cosa c'è che non va nel codice originale?
$ g++ --version
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
È peggio di un comportamento non specificato, c'è un comportamento non definito nell'espressione originale. Esiste un possibile ordinamento di sottoespressioni in cui 'it ++' viene valutato (cioè una scrittura su 'it') prima che' it' venga letto nella valutazione dei parametri per 'tolower' senza punti di sequenza intermedi. Ciò può accadere indipendentemente dal fatto che l'operatore di assegnazione sia o meno una chiamata di funzione. Ad ogni modo 5 [espr], il paragrafo 8 conferma che si tratta di un comportamento indefinito. –