Странное использование фигурных скобок в C - PullRequest
29 голосов
/ 05 января 2012

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

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

MyRecorder recorder = {0};

Ответы [ 5 ]

24 голосов
/ 05 января 2012

Предполагая, что MyRecorder является struct, этот устанавливает для каждого члена их соответствующее представление нуля (0 для целых чисел, NULL для указателей и т.

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

ОБНОВЛЕНИЕ : цитата, извлеченная с веб-сайта, указанного выше, со ссылкой на окончательный вариант C99:

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

9 голосов
/ 05 января 2012

Инициализирует все члены 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
4 голосов
/ 05 января 2012
3 голосов
/ 05 января 2012

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

Если поставить: MyRecorder рекордер = {3};

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

0 голосов
/ 05 января 2012

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

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

typedef int MyRecorder2[3];
...