El código siguiente muestra esta diferencia:¿La precedencia del operador en C++ difiere para los punteros y los iteradores?
#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 una salida:
abcd
bcd
si separamos operación de asignación y el operador de la subasta:
while(it != end) {
*it = tolower(*it); // <-- incr before assignment ?
it++;
}
la salida será el esperado.
¿Qué pasa con el código original?
$ g++ --version
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
Es peor que el comportamiento no especificado, no hay un comportamiento indefinido en la expresión original. Existe un posible ordenamiento de subexpresiones donde se evalúa 'it ++' (es decir, una escritura en 'it') antes de que' it' se lea en la evaluación de parámetros para 'tolower' sin ningún punto de secuencia intermedio. Esto puede suceder ya sea que el operador de asignación sea o no una llamada de función o no. De cualquier forma 5 [expr], el párrafo 8 confirma que esto es un comportamiento indefinido. –