Почему в stdbool.h используются целые, а не беззнаковые? - PullRequest
3 голосов
/ 30 октября 2019

В stdbool.h, true и false являются просто целыми числами. Почему не подписано? Есть ли мотивы производительности?

Ответы [ 3 ]

4 голосов
/ 30 октября 2019

Использование типа int для значений false и true приводит их в соответствие с типом и набором значений, полученных в результате оператора логического отрицания (!), реляционных операторов (<, >, <=, >=), операторы равенства (==, !=), логический оператор AND (&&) и логический оператор OR (||), все из которых производятзначение 0 или 1 типа int.

Кроме того, если true определено как 1u, тогда int minust = -true; инициализирует minust значением, определяемым реализацией (или повысит реализацию-определенный сигнал) вместо инициализации minust значением -1. Компилятор может выдать предупреждение. Это потому, что 1u имеет тип unsigned int, -1u имеет значение UINT_MAX, а UINT_MAX не может быть представлен int.

Я понимаю, что аргумент -trueнемного слаб. Я пытаюсь объяснить, что определение констант false и true для типа unsigned int, а не типа чисто числовых значений 0 и 1 (то есть int), наложит ограничения(необоснованные ограничения, на мой взгляд) того, что вы можете сделать с этими константами.

3 голосов
/ 30 октября 2019

И истина, и ложь имеют значение «#defined», равное 0, 1. Таким образом, они не подписаны или не подписаны, просто являются токенами. Они будут «напечатаны» при назначении, сравнении, обычно без затрат времени выполнения.

bool b = true ;
unsigned int uv = true ;
int sv = true ;

Обе операции будут занимать одинаковое время

0 голосов
/ 30 октября 2019

Однажды на одной из моих лекций мой профессор сказал, что реализация bool в C как целые числа была посвящена электрическим правилам. 1 электричество течет, 0 нет сигнала. Итак, 1-истина 0 ложь

...