2010-12-14 20 views
42

me encontré con una expresión en C comolo que es typeof ((c) + 1) en C

typeof((c) + 1) _tmp = c; 

Lo que quiere decir esto exactamente?

Gracias por la respuesta.

¿Una pregunta? ¿Qué pasa si el tipo de c es struct en lugar de los tipos primitivos, entonces, qué hará +1?

+3

Cómo se declaró 'C'? – SiegeX

+1

buena pregunta :-) – Anycorn

+1

realmente buena pregunta! Aprendí algo nuevo hoy – slezica

Respuesta

4

No es estándar C. C no tiene tal cosa como typeof (a menos que se trate de algo definido por el usuario).

typeof es normalmente una extensión del compilador (el compilador de GCC es más probable). Usted puede leer sobre ello aquí

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

+9

Esto realmente no funciona t explicar qué está haciendo el '+ 1' – SiegeX

+2

@SiegeX: Esto tampoco explica qué' '' está haciendo y qué ';' está haciendo. Cuando una pregunta tan amplia como "¿qué está haciendo?" Cuando se le pregunta, depende de la persona que hace la respuesta decidir qué decir y qué no decir. Decidí que lo anterior es suficiente. – AnT

+9

felicidades por su decisión. Sin embargo, yo, y muchos otros (mire otros comentarios sobre otras respuestas) sentí que una explicación de lo que estaba haciendo el '+ 1' era en orden, ya que no es intuitiva dentro del alcance de' typeof'. – SiegeX

5

crear var _tmp st _tmp es de tipo conversión hacia arriba (max) de c o int y la puso a valor de c.

por ejemplo

char c -> int _tmp // char(c) + 1 is int 
float c -> float _tmp // float(c) + 1 is float 
+1

¿Qué hará +1? Entiendo el uso de typeof, pero no entiendo qué hará +1 en typeof do – zombie

+1

@zom force tmp para convertirse en int si 'c' es" más pequeño "que int – Anycorn

+0

¿Dónde entra en juego el' + 1'? – SiegeX

56

El operador typeof en C plano (no C++) es una adición GCC a la norma. Le dice al compilador que desea utilizar el tipo de expresión entre paréntesis.

Usando typeof como se indica anteriormente, puede declarar variables de tipos desconocidos para usted o en ese contexto, utilizando el tipo de otra variable como referencia. También se puede usar para lanzar.

La operación + dentro de typeof tiene un efecto peculiar. typeof((c) + 1) significa "el tipo de c, o el tipo de 1, lo que quede después de la promoción". Recuerde que, por ejemplo, caracteres son promovidos a enteros cuando se utiliza en operaciones de enteros, enteros son promovidos a los flotadores, flotadores a los dobles, etc.

Por lo tanto, es typeof(int_variable + char_variable)int, ya que el char serían promovidos a int para llevar a cabo la operacion.

Tenga en cuenta que solo el compilador puede resolver esto: typeof no evalúa, no tiene ningún valor, no ocurre nada en el tiempo de ejecución.

La descripción completa de typeof puede ser found here.

+0

@Santiago Lezica: ¿cuál es el 'tipo de 1'? Lo siento, no obtuve ese – Cratylus

+0

@ user * hmm digamos que cuando escribe '1' en su código, el compilador supone que es un entero con valor 1. El tipo de' 1' es 'int'. – slezica

+0

@Santiago Lezica: Entonces, ¿cuál es el tipo de compilador específico? – Cratylus

1

Typeof devuelve un tipo, y se evalúa en tiempo de compilación.

Toda la declaración significa declarar una variable tmp con el mismo tipo que c (generalmente).

Podría declarar un tipo relacionado o diferente, ya que el tipo de c + 1 puede ser diferente de c. (esto es más probable en C++).

+0

Incluso en C, si 'c' es' char' o 'short' y' int' es más grande que el tipo de la expresión 'c + 1' será por' int' . Si 'c' es un tipo integral más grande o es un' float' o 'double', entonces el tipo de expresión es el tipo de' c'. No requiere C++ para obtener cierta confusión sobre los tipos ... – RBerteig

+1

¿Qué pasa si el tipo de c aquí es una estructura, entonces, ¿qué hará + 1? – zombie

4

Además de la otra respuesta, el + aquí es bastante sutil. Permite que c sea una expresión o un tipo.

  • si es una expresión entonces, como se ha dicho, c es promovido a int (al menos) y el tipo de toda la expresión ha al menos rango entero de int.
  • Si se trata de una expresión de tipo, el paréntesis que rodea c lo convierte en un molde del valor +1. Entonces, el tipo resultante es solo c.

Para ambas clases de acrobacia, es importante que c es de tipo aritmético y es también tener en cuenta que este truco aquí podría perder el signo numérico de c. Por lo tanto, este uso de la extensión typeof no es tan útil como podría parecer. En la mayoría de los casos, utilizando uintmax_t o intmax_t sería suficiente.

4

comparar el código,

typeof((c) + 1) _tmp = c; 

con

typeof(c) _tmp = c; 

typeof permite que los argumentos de tipos o variables. Ahora considere como c,

  • struct { int a; int b }
  • un puntero a struct { int a; int b }
  • el texto real int.

Así como promovercharcomo por uʍop ǝpısdn, la macro protege contra una asignación struct. Por lo que el siguiente código no se compilará,

struct { int a; int b } c; 
typeof((c)+1) _tmp = c; 

La gente puede desear prohibir struct asignaciones por razones de eficiencia y el tamaño del código, especialmente con-en una macro genérico.

1

En mi opinión, sólo para el puntero, typeof((c) + 1) = typeof(c); por lo que este puede que aseguran el paso de parámetros es puntero