Введи в bool: `!!` vs `(bool)` - PullRequest
0 голосов
/ 02 марта 2019

Есть ли разница в использовании !!x против (bool)x?

Предполагая __STDC_VERSION__ >= 199901L и #include <stdbool.h>

Обе они гарантируют, что результат либо 0или 1, и переполнение не происходит, независимо от размера и значения x?

1 Ответ

0 голосов
/ 02 марта 2019

!!x (в C, а не в C ++) имеет тип int.(bool)x (включая <stdbool.h>) имеет тип _Bool.В то время как _Bool с быстро повышаются до int с, эти два можно сказать отдельно от _Generic.

!!x (или эквивалент 0!=x) всегда будет либо0 или 1 и (bool)x всегда будут либо (bool)0, либо (bool)1, и если они компилируются (= не нарушает никаких ограничений), а x определено, оно всегда будет хорошо определено.

Переполнение в таких выражениях, как !!x+INT_MAX или (bool)x+INT_MAX (bool повышено до int), все еще вызывает озабоченность.


Ссылки:

6.3.1.2 : (_Bool) x <=> (_Bool) (0! = X)

1 Когда любое скалярное значение преобразуется в _Bool, результатом будет 0, если значениесравнивается равным 0;в противном случае результат равен 1,59)

( 6.2.5p18 , 6.2.5p21 - скаляры являются числовыми типами или указателями

Целочисленные и плавающие типы вместе называются арифметическими типами. ...

Арифметические типы и типы указателей вместе называются скалярными типами. ...)

6,5.3.3p5 : !! x <=> 0! = X

Результат оператора логического отрицания!равно 0, если значение его операнда сравнивается с 0, 1, если значение его операнда сравнивается равным 0. Результат имеет тип int.Выражение! E эквивалентно (0 == E).

...