2012-07-16 22 views
8

En GNUC C, puede usar typeof(expression), y es legal usar una expresión con efectos secundarios dentro. Así, por ejemplo, puede hacer que el código C:Efectos secundarios dentro de un typeof() expresión

int x = 0; 
typeof(x++) y; 

En este caso, el efecto secundario es ignorado y X sigue siendo cero después (esto tiene sentido ya que los tipos son un tiempo de compilación-único).

Sin embargo, el GCC documentation dice:

El operando de typeof se evalúa por sus efectos secundarios si y sólo si es una expresión de tipo modificado variablemente o el nombre de un tipo tal.

¿Qué significa esta frase? ¿Es realmente posible escribir typeof con un efecto secundario y hacer que el efecto secundario se ejecute realmente en el tiempo de ejecución? Para mí, esta frase parece indicar esto.

+0

http://stackoverflow.com/q/4436889/195488 –

+1

@ 0A0D Esa pregunta también habla de 'typeof', pero no menciona los efectos secundarios, solo las expresiones sin efectos secundarios. –

+0

@PhilippWendler: ¡Buena pregunta! – pje

Respuesta

9

Sí, es posible en ciertos casos tener efectos secundarios dentro de typeof evaluados. Como dice la documentación, debe estar dentro de un "tipo modificado variablemente". Este es un tipo que depende de algún valor de tiempo de ejecución, como int[x].

Así que el código siguiente es legal, declara y al ser de tipo int[1], yx tiene el valor 1 después:

int x = 0; 
typeof(int[++x]) y; 

Por supuesto, los tipos por igual a los modificados de forma variable en general, esto sólo es legal para declaraciones de variables locales (función interna).

+3

Tenga en cuenta que esto es lo mismo que para 'sizeof': el operando de expresión no se evalúa, excepto si aparece una matriz de longitud variable y el valor del tamaño de la matriz afecta el resultado de la expresión' sizeof'. – ouah

Cuestiones relacionadas