2011-09-17 10 views
7

Antecedentes¿Pueden los paréntesis en C provocar una conversión implícita?

La última vez que se le preguntó si estaban causando paréntesis conversión implícita (here), @pmg era lo suficientemente bueno como para señalar que "nada en C se realiza a continuación int" Pero allí, la discusión estaba a punto operadores bit a bit, y el paréntesis resultó ser solo una distracción.

Introducción

A continuación, los paréntesis son el principal atractivo. O, para ser más aburrido pero preciso, los únicos operadores que veo son los paréntesis y los operadores de asignación.

At this reference about the C parentheses operator, no veo nada sobre paréntesis que cambien el tipo (fuera de la sintaxis de tipo de letra, que no es este caso).

Mientras tanto, here's a reference that reminds that there is automatic type conversion on assignment, pero no creo que eso explique el comportamiento de la herramienta de análisis estático que describiré aquí.

Como en mi anterior pregunta, "OK" significa que la herramienta de análisis estático hizo no advierten acerca de un conversión implícita, y "NO OK" significa que lo hizo.

int main(void) 
{ 
    unsigned int ui; 
    int i; 

    ui = (256U); // NOT OK (*) (1) 
    i = (256U); // NOT OK (*) (2) 

    i = 256; // OK 
    i = 256U; // NOT OK 
    ui = 256U; // OK (3) 
    ui = 256; // NOT OK 

return(0); 
} 

Puedo entenderlos todos excepto los dos primeros - ¿qué hacen los paréntesis? Si no hacen nada en la forma de encasillamiento implícito, entonces esperaría que (1) estuviera bien y (2) que NO estuviera bien. Si realizan una promoción de tipo automática de tipos menores que int hasta int, entonces esperaría que (1) NO ESTÉ BIEN y (2) que esté bien. Pero esta herramienta dice que ambos NO ESTÁN BIEN.

¿Es este un error de la herramienta de análisis estático, o es la herramienta correcta y hay algo más que necesito aprender sobre las conversiones de tipo implícito en C?

(Por cierto espero que el valor 256 es suficientemente pequeña para no ser la causa de desbordamiento en mi máquina ...)

+2

Su herramienta analyzis estática es probable mal. ¿Qué herramienta estás usando y cuáles son los errores que te dice? – nos

+0

Las garantías estándar C que el valor de 256 no se desbordará, no en la aritmética, no en el preprocesador - a menos que se asigna a un 'char' de algún tipo. –

Respuesta

8

Primero, aclaremos algunos términos. Nada puede causar un "lanzamiento implícito", porque no existe tal cosa. Un cast es un operador explícito, que consiste en un nombre de tipo entre paréntesis que precede a una expresión, como (double)42; especifica una conversión . Las conversiones pueden ser explícitas (especificadas por un operador de conversión) o implícitas, como en double x = 42;. Entonces, lo que realmente está preguntando es si los paréntesis pueden causar una conversión implícita.

Y la respuesta, al menos en el código que nos ha mostrado, es no.

Citando al C99 standard (3.7 MB PDF), la sección 6.5.1p5:

Una expresión entre paréntesis es una expresión primaria. Su tipo y valor son idénticos a los de la expresión sin parentesis.Es un lvalue, un designador de función o una expresión vacía si la expresión sin parche es, respectivamente, un lvalue, una función designator o una expresión vacía.

Y como 256U es ya un primary expression, los paréntesis no hacen ninguna diferencia en absoluto; los paréntesis generalmente indican precedencia, pero en este caso no hay predecencia para indicar.

Qué herramienta de análisis estático está usando? Probablemente deberías enviar un informe de error.

+1

+1 para aclarar la definición de cast –

+0

+1 de mí también para el mismo. Seré más cuidadoso con la terminología en el futuro. – talkaboutquality

4

La herramienta está confundido alguna manera. No hay casting aquí. Esos paréntesis solo indican precedencia.

Cuestiones relacionadas