2012-01-05 12 views
27

Lo siento por la simple pregunta, pero estoy de vacaciones la lectura de un libro de sonido del núcleo, y no tengo mi C o libros Objective C conmigo ...extraño uso de llaves en C

¿Cuáles son las llaves usan en esta definición variable?

MyRecorder recorder = {0}; 
+16

me gusta llamar el '' {0}, la *** *** universales inicializador cero. "Funciona", recursivamente si es necesario, ¡para todo tipo! ints, dobles, estructuras, matrices, punteros, punteros a estructuras, estructuras con matrices de punteros, ..., ... – pmg

+2

pmg: publicar eso como una respuesta! –

+1

@pmg: ¿por qué no publicaste tu comentario como respuesta? – vikingosegundo

Respuesta

22

Suponiendo que MyRecorder es una struct, este sets every member to their respective representation of zero (0 para enteros, NULL para los punteros, etc.).

En realidad esto también funciona en todos los otros tipos de datos como int, double, punteros, arrays, estructuras anidadas, ..., todo lo que se puede imaginar (gracias a PMG para señalar esto!)

ACTUALIZACIÓN: una cita extraída de la página web vinculado anteriormente, citando el borrador final de C99:

[6.7.8.21] Si hay menos inicializadores en una lista adjunta corsé- que elementos o miembros de un agregado, [ ...] el resto de agregado se inicializará implícitamente igual que los objetos que tienen una duración de almacenamiento estática.

+0

los miembros de la estructura no tienen valores predeterminados: puede ser mejor decir cero explícitamente "establece a cada miembro en (el tipo correcto de) cero". – pmg

+0

@pmg: Gracias, arreglé esto. –

+0

¡Ah! Guay. Eso tiene sentido. Gracias. – John

9

Su inicialización todos los miembros de la estructura recorder a 0 según la norma C99. Podría parecer que inicializa cada bit de la estructura con 0 bits. Pero eso no es cierto para cada compilador.

ver este código de ejemplo,

#include<stdio.h> 

struct s { 
    int i; 
    unsigned long l; 
    double d; 
}; 

int main(){ 
    struct s es = {0}; 
    printf("%d\n", es.i); 
    printf("%lu\n", es.l); 
    printf("%f\n", es.d); 
    return 0; 
} 

Ésta es la salida.

$ ./a.out 
0 
0 
0.000000 
+1

"Inicializa todos los miembros de la estructura de la grabadora a 0." está en aplicación del estándar C99. "De hecho, inicializa cada bit de la estructura con 0 bits". solo es cierto en la práctica en arquitecturas convencionales, y el estándar C99 señala varias veces que no está diciendo que sea cierto, y que una arquitectura de compilación/objetivo conforme a las normas no tiene por qué ser cierta. –

+0

@Complicatedseebio Gracias, actualizó la respuesta. –

3
+1

también podría ser un escalar: 'MyRecorder recorder = {0};' donde 'MyRecorder' es un alias de' int' por ejemplo es válido en C – ouah

+1

@ouah A juzgar por el nombre de la 'struct', lo digo es * muy poco probable * que sea un 'int' o, de hecho, cualquier cosa que no sea una estructura/unión. – dasblinkenlight

0

MyRecorder podría ser uno de los siguientes y que está intentando inicializar todos los elementos de ese cero

typedef struct _MyRecorder1 { 
    int i; 
    int j; 
    int k; 
}MyRecorder1; 

typedef int MyRecorder2[3]; 
3

En realidad, no initliaze todos los elementos de la estructura, sólo el primer uno. Pero los otros se inicializan automáticamente con 0 porque esto es lo que el estándar C pide que hagamos.

Si pone: MyRecorder recorder = {3};

El primer elemento será el 3 y los otros Weill ser 0.