2012-01-05 36 views
27

Üzgünüm ama nelerdirTek kullanım

... çekirdek ses üzerine bir kitap okuma tatildeyim ve benim C veya benimle Objective C kitabımız yok Kıvırcık parantez bu değişken tanımında yapıyor? C99 standardına göre 0 için recorder yapının tüm üye başlatılıyor

MyRecorder recorder = {0}; 
+16

olmak Weill. Her tür için, gerekirse, "çalışır"! ints, doubles, structs, diziler, işaretçiler, structs için işaretçiler, işaretçiler dizileri ile yapıları, ..., ... – pmg

+2

pmg: bunu bir cevap olarak gönderin! –

+1

@pmg - Yorumunuzu neden bir yanıt olarak göndermediniz? – vikingosegundo

cevap

22

, MyRecorder bir struct olduğunu (vb işaretçileri için tamsayılar için 0, NULL) bu sets every member to their respective representation of zero varsayarsak.

Aslında bu da (bu işaret için PMG sayesinde!) int, double, göstergeler, diziler, iç içe yapılar, ..., her şey hayal edebileceğiniz gibi tüm diğer veri türleri üzerinde çalışır

UPDATE: C99 son halini gerekçe yukarıda bağlantılı web sitesinden ekstre bir alıntı:

[6.7.8.21], bir ortak unsurları veya üyesi vardır daha bağ kapalı listesinde daha az ilklendiriciler varsa, [ ...]'un geri kalanıtoplamı, 'un statik depolama süresine sahip olduğu nesnelerle aynı şekilde başlatılacaktır.

+0

yapı üyeleri varsayılan değerlere sahip değil: Sıfıra açıkça söylemek daha iyi olabilir --- "her üyeyi (doğru tür) sıfıra ayarlar". – pmg

+0

@pmg: Teşekkürler, bunu çözdüm. –

+0

Ah! Güzel. Bu mantıklı. Teşekkürler. – John

9

Onun. Yapının her bir bitini 0 bit ile başlatmış gibi görünebilir. Ama bu her derleyici için geçerli değil.

#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; 
} 

Bu

çıkış, bu örnekte kod bakınız.

$ ./a.out 
0 
0 
0.000000 
+1

"Tüm kaydedici yapısını üyeleri 0 olarak başlatıyor." C99 standardının uygulanmasıdır. "Aslında, yapının her bir bitini 0 biti ile başlatır." Geleneksel mimaride pratikte sadece doğrudur ve C99 standardı, bunun doğru olduğunu söylemediğini ve standart uyumlu bir derleyici/hedef mimarinin bunu doğru yapmak zorunda olmadığını pek çok kez işaret etmektedir. –

+0

@Complicatedseebio Teşekkürler, cevabı güncelledim. –

0

MyRecorder aşağıdakilerden biri olabilir ve siz Aslında, ilk sadece yapının tüm elemanları, initliaze yok sıfır

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

typedef int MyRecorder2[3]; 
3

o tüm unsurları başlatmak çalışıyorsunuz bir. Ancak, diğerleri otomatik olarak 0 ile başlatılır, çünkü C standardı bu soruyu sormaktadır.

Eğer koyarsanız: MyRecorder kaydedici = {3};

*** birinci eleman 3 olacak ve diğerleri I `{0} ', *** evrensel sıfır başlatıcı ulaşmak için 0