La pregunta es doble: en primer lugar, es
char c = CHAR_MAX;
c += 1;
evaluado de manera diferente de
char c = CHAR_MAX;
c = c + 1;
y la respuesta es no, no lo es , porque C11 / C18 6.5.16.2p3 :
- Una asignación compuesta de la forma
E1 op = E2es equivalente a la expresión de asignación simple, E1 = E1 op (E2)excepto que el valor l E1se evalúa solo una vez, y con respecto a una llamada de función secuenciada indeterminadamente, la operación de una asignación compuesta es una evaluación única. Si E1tiene un tipo atómico, la asignación compuesta es una operación de lectura-modificación-escritura con memory_order_seq_cstsemántica de orden de memoria. 113)
Entonces, la pregunta es qué sucede en c = c + 1. Aquí los operandos se +someten a las conversiones aritméticas habituales cy 1, por lo tanto, son promovidos a int, a menos que una arquitectura realmente loca requiera que charse promueva unsigned int. +Luego se evalúa el cálculo de , y el resultado, de tipo int/ unsigned intse vuelve a convertir chary se almacena en c.
Hay 3 formas definidas por la implementación en las que esto puede evaluarse:
CHAR_MINes 0 y, por charlo tanto, no está firmado.
Cualquiera de los dos chares promovido intao unsigned inty si se promociona a un int, entonces CHAR_MAX + 1necesariamente encajará en un inttambién, y no se desbordará, o si unsigned intpuede encajar o ajustarse a cero. Cuando el valor resultante, que es numéricamente CHAR_MAX + 1o 0después de la reducción del módulo, vuelva a c, después de la reducción del módulo, se convertirá en 0, es decirCHAR_MIN
De charlo contrario, se firma, entonces si CHAR_MAX es menor que INT_MAX, el resultado de CHAR_MAX + 1se ajustará a int, y el estándar C11 / C18 6.3.1.3p3 se aplica a la conversión que ocurre después de la asignación :
- De lo contrario, el nuevo tipo se firma y el valor no se puede representar en él; el resultado está definido por la implementación o se genera una señal definida por la implementación.
O, si f sizeof (int) == 1 y char está firmado, entonces charse promociona a an int, y CHAR_MAX == INT_MAX=> CHAR_MAX + 1causará un desbordamiento de enteros y el comportamiento será indefinido .
Es decir, los posibles resultados son:
Si chares un tipo entero sin signo, el resultado es siempre 0, es decir CHAR_MIN.
De charlo contrario, es un tipo entero con signo, y el comportamiento está definido por la implementación / indefinido:
CHAR_MIN o algún otro valor definido por la implementación,
- se genera una señal definida por la implementación, posiblemente terminando el programa,
- o el comportamiento no está definido en algunas plataformas donde
sizeof (char) == sizeof (int).
Todas las operaciones de incremento c = c + 1, c += 1, c++y ++ctienen los mismos efectos secundarios en la misma plataforma. El valor evaluado de la expresión c++será el valor canterior al incremento; para los otros tres, será el valor de cdespués del incremento.