!!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).