Я знаю, что вы должны использовать 0
вместо NULL в С++ (хотя NULL
определяется как 0
в С++ большую часть времени).
Недавно я наткнулся на некоторый код, где вместо этого использовался 0x0
.
В чем разница?
Я знаю, что вы должны использовать 0
вместо NULL в С++ (хотя NULL
определяется как 0
в С++ большую часть времени).
Недавно я наткнулся на некоторый код, где вместо этого использовался 0x0
.
В чем разница?
0x0
является просто 0
, записанным в шестнадцатеричной системе. Между ними нет разницы:
0 16= 0 10:)
NULL
обычно #define
d to 0
где-то и делает то же самое.
Нет никакой разницы. В C NULL часто определяется как (void *)0
, но на С++ это недопустимо. Несколько древних компиляторов получили это неправильно, но они действительно древние.
IMO, лучше использовать NULL, поскольку он более четко отображает намерение и дает вам хороший, легкий символ S & R, когда ваш компилятор обновляется до С++ 0x, который будет включать nullptr
.
Кстати, все,
0x0 - hex, как вы уже упоминали, но
0 является восьмеричным, а не десятичным!: -)
т.е. любое число, начинающееся с 0 (и не сопровождаемое x), равно восьмеричному:
0 = 0 01 = 1 02 = 2 ... 07 = 7 010 = 8 011 = 9 012 = 10 ...
: -)
0x0
и 0
представляют одно и то же значение, поэтому вы можете использовать тот, который лучше всего подходит вашему глазу. Когда мы получим С++ 0x, мы будем иметь ключевое слово nullptr
для представления нулевых указателей любого типа.
0x0 является просто выражением значения 0 в шестнадцатеричном формате. Я сомневаюсь, что компилятор позаботится о разнице.
Нет разницы
По-моему, 0x0 более явственно.
Некоторые люди могут путать 0 с "0" (0x30 - я видел, как это произошло).
Проще говоря, это вопрос вкуса. Людям нравится записывать адреса памяти в шестнадцатеричном формате, поэтому запись NULL как 0x0 будет более классической. Для обычных, таких как я, 0 будет достаточно.
Итак, на этом сайте есть действительно хорошая информация о NULL: http://c-faq.com/null/index.html
NULL на самом деле является "нулевым указателем", поэтому он может иметь тип, например "(void *) 0". Это говорит компилятору, что NULL не следует рассматривать как int, а скорее как "указатель на int". И в C компилятор выдаст предупреждения/ошибки, если типы не совпадают.
Значение "0" и "0x0" эквивалентно в С++. Всякий раз, когда число имеет префикс "0x", это означает, что это значение является шестнадцатеричным представлением этого числа. Например, 0x5 == 5.
Кроме того, 0xA [в шестнадцатеричном, основание 16) == 10 [в базе 10].
изменить
Вот некоторые источники. В glibc, NULL, по-видимому, определяется по-разному в разных местах. (почему это должно быть?)
# define NULL ((void *) 0) (stdlib/gmp-impl.h)
# define NULL 0 (posix/getopt1.c)
edit2
ну, похоже, я пропустил эту отметку! Прости! (CW'd, не стесняйтесь держать downvoting!)