#include <stdio.h>
struct temp{
unsigned int zero_bit : 1;
unsigned int first_bit : 1;
};
// struct temp_1{
// unsigned int zero_bit : 0;
// unsigned int first_bit : 0;
// } ; // Code fails
int main() {
struct temp a1;
printf("%d", a1.zero_bit); // returns 0
return 0;
}
Почему struct temp1
не работает, а struct temp
нет, учитывая, что они оба инициализированы значением 0.
Почему компилятор дает мне ложную надежду, что zero_bit
был инициализирован значением 1, хотя на самом деле он был инициализирован значением 0?
Также обратите внимание, что переменная a1
не инициализирована, и ее члены будут иметь неопределенные значения.
См.: Бит-поля.
Число после :
не является значением инициализации, а скорее шириной (в битах) битового поля :
Битовые поля
Объявляет член с явной шириной в битах. Соседнее битовое поле члены могут быть упакованы для совместного использования и разделения отдельных байтов.идентификатор (optional): ширина
Также из ссылки на документацию выше:
ширина -
целочисленное константное выражение со значением, большим или равным до нуля и меньше или равно количеству битов в базовом типе. Если оно больше нуля, это количество битов, которые это битовое поле займёт. Нулевое значение допускается только для безымянных битовых полей. и имеет особое значение: оно указывает, что следующее битовое поле в определение класса начнется на границе единицы распределения.
(выделено мной)
В struct temp
ширина 1
допустима, а в struct temp_1
ширина 0
недопустима (она не подпадает под исключение упомянутого выше безымянного битового поля).
Это причина ошибки компиляции struct temp_1
.
Другая проблема заключается в том, что в этих строках:
struct temp a1;
printf("%d", a1.zero_bit); // returns 0
a1
не инициализирован и поэтому содержит неопределенные значения. Значение 0
, которое вы видите, случайно.
Число не является инициализацией, оно говорит о том, сколько бит будет иметь каждый член битового поля. Для
temp_1
вы говорите, чтоzero_bit
иfirst_bit
будут иметь нулевые биты. Что не имеет смысла. Возможно, вы захотите обновить раздел книг или руководств для начинающих и узнать, что они говорят о битовых полях.