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 = E2
es equivalente a la expresión de asignación simple, E1 = E1 op (E2)
excepto que el valor l E1
se 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 E1
tiene un tipo atómico, la asignación compuesta es una operación de lectura-modificación-escritura con memory_order_seq_cst
semá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 c
y 1
, por lo tanto, son promovidos a int
, a menos que una arquitectura realmente loca requiera que char
se promueva unsigned int
. +
Luego se evalúa el cálculo de , y el resultado, de tipo int
/ unsigned int
se vuelve a convertir char
y se almacena en c
.
Hay 3 formas definidas por la implementación en las que esto puede evaluarse:
CHAR_MIN
es 0 y, por char
lo tanto, no está firmado.
Cualquiera de los dos char
es promovido int
ao unsigned int
y si se promociona a un int
, entonces CHAR_MAX + 1
necesariamente encajará en un int
también, y no se desbordará, o si unsigned int
puede encajar o ajustarse a cero. Cuando el valor resultante, que es numéricamente CHAR_MAX + 1
o 0
despué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 char
lo contrario, se firma, entonces si CHAR_MAX
es menor que INT_MAX
, el resultado de CHAR_MAX + 1
se 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 char
se promociona a an int
, y CHAR_MAX == INT_MAX
=> CHAR_MAX + 1
causará un desbordamiento de enteros y el comportamiento será indefinido .
Es decir, los posibles resultados son:
Si char
es un tipo entero sin signo, el resultado es siempre 0
, es decir CHAR_MIN
.
De char
lo 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 ++c
tienen los mismos efectos secundarios en la misma plataforma. El valor evaluado de la expresión c++
será el valor c
anterior al incremento; para los otros tres, será el valor de c
después del incremento.