2012-01-05 2 views
27

Извините за простой вопрос, но я нахожусь в отпуске, чтение книги на основной звук, а не мой C или Objective C книги со мной ...Одд использование фигурных скобок в C

Что фигурные скобки, выполняемые в этом определении переменной?

MyRecorder recorder = {0}; 
+16

Я хотел бы назвать '{0} ', то *** универсальный нулевой инициализатор ***. Он «работает», рекурсивно при необходимости, для каждого типа! ints, doubles, structs, массивы, указатели, указатели на структуры, структуры с массивами указателей, ..., – pmg

+2

pmg: опубликуйте это как ответ! –

+1

@pmg - почему вы не опубликовали свой комментарий в качестве ответа? – vikingosegundo

ответ

22

Предполагая, что MyRecorder является struct, это sets every member to their respective representation of zero (0 для целых чисел, NULL для указателей и т.д.).

На самом деле это также работает на всех других типов данных, таких как int, double, указатели, массивы, вложенные структуры, ..., все, что вы можете себе представить (спасибо PMG за указание на это!)

UPDATE: котировка извлекается из веб-сайта, связанного выше, ссылаясь на окончательный проект C99:

[6.7.8.21] Если есть меньше инициализаторы в списке распорной корпусе, чем есть элементы или члены совокупности, [ ...] остаток от неявно инициализируется таким же образом, как объекты, которые имеют статическую продолжительность хранения.

+0

Элементы структуры не имеют значений по умолчанию: может быть лучше сказать нуль явно --- "устанавливает каждый член в (нужный тип) ноль". – pmg

+0

@pmg: Спасибо, я исправил это. –

+0

Ах! Круто. В этом есть смысл. Благодарю. – John

9

Его инициализирующий всех членов recorder структуры 0 в соответствии со стандартом C99. Может показаться, что он инициализирует каждый бит структуры с помощью 0 бит. Но это не так для каждого компилятора.

Смотрите этот пример кода,

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

Это выход.

$ ./a.out 
0 
0 
0.000000 
+1

"Инициализация всех элементов структуры рекордера до 0." применяется в применении стандарта C99. «На самом деле он инициализирует каждый бит структуры с помощью 0 бит». применим только на практике на обычных архитектурах, а стандарт C99 указывает несколько раз, что он не говорит, что это правда, и что стандартная архитектура компилятора/целевой архитектуры не должна делать ее правдой. –

+0

@Complicatedseebio Спасибо, обновил ответ. –

3
+1

также может быть скаляра: 'MyRecorder recorder = {0};' где 'MyRecorder' является псевдонимом' int', например, действителен в C – ouah

+1

@ouah Судя по имени 'struct', я говорю об этом * очень маловероятно *, что это «int» или фактически что-то иное, чем структура/объединение. – dasblinkenlight

0

MyRecorder может быть один из следующих параметров и вы пытаетесь инициализировать все элементы, которые с нулевого

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

typedef int MyRecorder2[3]; 
3

На самом деле, это не initliaze всех элементов структуры, только первые один. Но, остальные автоматически инициализируются с помощью 0, потому что это то, что задают C-стандарт.

Если вы положили: MyRecorder recorder = {3};

Первый элемент будет 3, а остальные Вайль быть 0.

Смежные вопросы