Почему сравнение с целым числом работает для nullptr?

#c 11 #nullptr

#c 11 #nullptr

Вопрос:

Для g работает следующее

 assert(nullptr == 0);
 

Мне нужно знать, происходит ли какое-либо неявное преобразование типов.
Из того, что я знаю, nullptr его можно сравнивать только с указателями, а не с целыми числами, а также с тем, что он более типобезопасен. Тогда почему сравнение с целым числом работает?

Ответ №1:

Тогда почему сравнение с целым числом работает?

Потому что в большинстве реализаций nullptr это машинный адрес 0. Другими словами (intptr_t)nullptr , равно 0. Например, это относится к Linux / x86-64. Проверьте, проверив сгенерированный код на ассемблере, полученный с помощью g -S -O2 -fverbose-asm

Я даже считаю, что это гарантировано стандартом C (читайте, например, n3337)

Однако, если вы скомпилируете свой код с недавним GCC as gcc -Wall -Wextra , вы можете получить предупреждение.

Прочитайте также assert(3) . В некоторых случаях (с NDEBUG ) он расширяется до состояния no-op во время компиляции.