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.