2010-11-30 7 views
6

¿Por qué C++ (y probablemente C también) me permiten asignar e int a una char sin al menos darme una advertencia?C++ Asignar un int a un char: ¿por qué funciona esto sin al menos una advertencia?

¿Se puede asignar directamente el valor, al igual que en

int i = 12; 
char c = i; 

es decir, hacer una conversión implícita, o tendría que utilizar un static_cast<>?

EDITAR

Por cierto, estoy usando gcc.

+7

Es probable que reciba una advertencia si aumenta sus niveles de advertencia. –

+1

También estoy de acuerdo en subir los niveles de advertencia es una buena idea. En cualquier caso, si necesita asignar, use static_cast para que quede claro – seand

+4

En GCC, no recibe una advertencia sobre posibles problemas de conversión de tipo hasta que utilice el indicador '-Wconversion' (' -Wall' doesn ' t advertir esto). En VC++, '/ W4' advertirá sobre la posible pérdida de datos de esta conversión. – birryree

Respuesta

7

Se permitió en C antes de que se inventara una sintaxis de conversión explícita. Luego, siguió siendo una práctica común, por lo que C++ lo heredó para no romper una gran cantidad de código.

En realidad, la mayoría de los compiladores emiten una advertencia. Si no lo hace, intente cambiar su configuración.

-3

char es lo mismo que corto. Entonces, debería haber una advertencia sobre la posible pérdida de información. Puede ser que tengas advertencias apagadas, intenta configurar de alguna manera tu compilador/ide.

+9

Eso no es necesariamente cierto en absoluto que 'sizeof (char) == sizeof (short)', y en plataformas comunes (x86), definitivamente no son del mismo tamaño. La única garantía que tienes es que 'sizeof (short)> = sizeof (char)'. – birryree

+3

char no es lo mismo que corto. – ybungalobill

1

C como originalmente diseñado no era realmente un strongly-typed language. La filosofía general era que usted el programador debe saber lo que está haciendo, y el compilador está allí para ayudarlo a hacerlo. Si solicitó convertir entre float, int y unsigned char seis o siete veces en una sola expresión, bueno eso debe ser lo que quería.

C++ tipo de recogido solo para que todo el código C existente no sea demasiado oso para virar. Sin embargo, intentan hacerlo más fuerte con cada revisión. Hoy casi cualquier compilador de C++ le dará una advertencia si sube los niveles de advertencia (lo que I altamente le recomiendo que haga).

De lo contrario, tal vez debería buscar en verdaderos lenguajes fuertemente tipados, como Java y Ada. El código Ada equivalente no se compilaría sin una conversión explícita.

0

Respuesta corta: Está bien (según el estándar C++) en su ejemplo.
Respuesta un poco más larga: No está bien si se firma el signo de "Char" y está tratando de asignarle un valor fuera de su rango. Sin embargo, está bien si no está firmado (si el signo firmado está o no depende de tu entorno), entonces obtendrás aritmética de módulo. Los compiladores usualmente tienen un interruptor para avisarte debido al primer caso, pero mientras permanezcas dentro de los límites está perfectamente bien (sin embargo, un lanzamiento explícito para aclarar tus intenciones no duele).

Cuestiones relacionadas