Los operadores de coma tienen la precedencia más baja y la asociatividad de izquierda a derecha, por lo que esto garantiza el orden como:
i = ++j, j = i++; i será 2, y luego j será 1 después de esta declaración si i y j son 0 al principio.
Sin embargo, ¿los separadores de coma en la definición de tipo en C también garantizan el orden? Como
int i = 1, j = ++i;Tu ejemplo con el operador coma, i = ++j, j = i++; , está bien definido porque el operador de coma es un punto de secuencia.
La precedencia/asociatividad no es suficiente para garantizar esto: son diferentes al orden de evaluación y los puntos de secuencia. Por ejemplo, i * 2 + i++ * 3 no está definido porque no hay puntos de secuencia.
La coma separadora entre declaradores , por ejemplo, int i = 1, j = i++; , es también un punto de secuencia. Esto está cubierto por C11 6.7.6/3, C99 6.7.5/3:
Un declarante completo es un declarante que no forma parte de otro declarante. El final de un declarador completo es un punto de secuencia.
Entonces, hay un punto de secuencia después de i = 1 , y este código está bien definido.
Sin embargo, la coma separadora entre los argumentos de función f(i, i++) no es un punto de secuencia; por lo que el código provoca un comportamiento indefinido.
Nota: En C11, el término punto de secuencia se reemplazó principalmente con relaciones de secuenciación más complicadas para especificar claramente un modelo de subprocesos, pero eso no afecta la discusión anterior.
Sí, y aquí está la razón. Piensa en lo que dice la coma. Todo lo que dice es "oye, tengo una cosa que quiero hacer en el lado izquierdo de esta coma, una vez que hagas eso, ve a la cosa de la derecha y haz eso también. También puedes pensar en ello como una forma más corta de hacer esto
int i = 1; int j = i++;i ya se ha asignado en algún lugar de la memoria, por lo que todo lo que sucede con j es que toma ese valor almacenado en i, lo incrementa y lo establece igual a j.
Así que en el caso de
int i = 1, j = ++i;Todo lo que está diciendo es crear un número entero, establecerlo igual a uno, ahora pasar al siguiente comando, que será un int llamado j, y establecerlo igual a lo que sea i cuando se incremente.
Entonces, para responder completamente a su pregunta, sí, garantiza el orden porque el compilador ejecutará todo de arriba hacia abajo, de izquierda a derecha, a menos que se indique lo contrario.
Suponiendo que C funciona igual que C# a este respecto, los valores separados por comas (int i = 0, j = 0;) deben permanecer en orden.
La diferencia en i++ vs ++i es el tiempo de validación:
int i = 0; bool iGTZ = i++ > 0;//false i = 0; iGTZ = ++i > 0;//trueUn poco más de lo que pediste pero el orden de declaración está garantizado. Y si usted o alguien que lee esto no lo sabía, espero que ayude. :)