NULL
- это макрос, который расширяется до 0
(или некоторого интегрального константного выражения со значением 0
, например, (1 - 1)
).В остальном это не «специальный».
Любое выражение с целочисленной константой со значением ноль можно использовать в качестве константы нулевого указателя, что является причиной того, что int* ptr = 0;
разрешено.Однако здесь выражение b ? 0 : 0
;это не целочисленное константное выражение (b
не является константой);его тип - int
, который неявно преобразуется в int*
Обходной путь может заключаться в явном указании типа указателя:
int* const null_int_ptr = 0;
int* ptr = b ? null_int_ptr : null_int_ptr;
В примере немногоПридумано, хотя: обычно, когда используется условный оператор, по крайней мере, один из аргументов на самом деле является указателем типа (например, b ? ptr : 0
);когда один из операндов является типом указателя, 0
неявно преобразуется в тот же тип указателя, и, следовательно, тип всего условного выражения является типом указателя, а не int
.
Единственный случайгде вы можете иметь эту «проблему», где константа нулевого указателя используется как второй и третий операнды условного оператора, что довольно странно.