Подтвердить что ты не робот

Нечетное использование фигурных скобок в C

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

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

MyRecorder recorder = {0};
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Инициализация всех элементов структуры 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

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

Если вы ставите: MyRecorder recorder = {3};

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

Ответ 5

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

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

typedef int MyRecorder2[3];