new - sobrecarga de operadores c++
¿Por qué los operadores de disminución múltiple no funcionan en C cuando funcionan en C++? (1)
Mirando this pregunta y probando algunos de los códigos:
int x = 100;
while ( 0 <-------------------- x )
{
printf("%d ", x);
}
Intenté compilar con gcc
y obtuve el siguiente error:
file.c: In function ''main'':
file:c:10:27: error: lvalue required as decrement operand
while ( 0 <-------------------- x )
Pero compilar con g++
funciona. ¿Por qué este código es válido en C ++ pero no en C?
En C, --x
es un valor, no un valor de --x
. Su efecto es disminuir x
, y evaluar el nuevo valor asignado de x
. Dado que --x
no es un valor lime, no puede disminuirse.
En C ++, --x
es un lvalue, no un rvalue. Su efecto es decrementar x
, y evaluar a x
como un valor l. Como --x
es un valor de nuevo, se puede disminuir de nuevo.
La razón por la que tiene sentido que --x
sea un lvalue en C ++ es porque C ++ introdujo tipos de referencia. Dado
void f(int &);
int i;
puede tener sentido llamar a f(--i)
, que pasa i
por referencia después de disminuirlo.
Como C no tiene tipos de referencia, no tiene mucho sentido que --i
sea un valor l. Históricamente, nunca lo fue, ya diferencia de C ++, C nunca obtuvo una razón convincente para cambiar las reglas.
Tenga en cuenta que C ++ requería cambios más extensos que hacer que --x
un valor --x
para que realmente funcione. Hacer que --x
un valor de --x
, sin nada más, haría --x
un comportamiento indefinido, porque no habría un punto de secuencia entre la modificación de x
y la posterior conversión de valor a valor de l. Aún más claramente así para ----x
. C ++ tuvo que modificar las reglas de secuencia para que funcionara. En C, las modificaciones a las reglas de secuenciación pueden causar problemas para que los compiladores existentes se ajusten a las nuevas reglas, por lo que tales modificaciones probablemente se rechacen a menos que haya un gran beneficio.