Вместо NULL следует писать "0x0" или "0"?

Я знаю, что вы должны использовать 0 вместо NULL в С++ (хотя NULL определяется как 0 в С++ большую часть времени).

Недавно я наткнулся на некоторый код, где вместо этого использовался 0x0.

В чем разница?

Ответ 1

0x0 является просто 0, записанным в шестнадцатеричной системе. Между ними нет разницы:

0 16= 0 10:)

NULL обычно #define d to 0 где-то и делает то же самое.

Ответ 2

Нет никакой разницы. В C NULL часто определяется как (void *)0, но на С++ это недопустимо. Несколько древних компиляторов получили это неправильно, но они действительно древние.

IMO, лучше использовать NULL, поскольку он более четко отображает намерение и дает вам хороший, легкий символ S & R, когда ваш компилятор обновляется до С++ 0x, который будет включать nullptr.

Ответ 3

Кстати, все,

0x0 - hex, как вы уже упоминали, но

0 является восьмеричным, а не десятичным!: -)

т.е. любое число, начинающееся с 0 (и не сопровождаемое x), равно восьмеричному:

0 = 0
01 = 1
02 = 2
...
07 = 7
010 = 8
011 = 9
012 = 10
...

: -)

Ответ 4

0x0 и 0 представляют одно и то же значение, поэтому вы можете использовать тот, который лучше всего подходит вашему глазу. Когда мы получим С++ 0x, мы будем иметь ключевое слово nullptr для представления нулевых указателей любого типа.

Ответ 5

0x0 является просто выражением значения 0 в шестнадцатеричном формате. Я сомневаюсь, что компилятор позаботится о разнице.

Ответ 6

Нет разницы

По-моему, 0x0 более явственно.

Некоторые люди могут путать 0 с "0" (0x30 - я видел, как это произошло).

Ответ 7

Проще говоря, это вопрос вкуса. Людям нравится записывать адреса памяти в шестнадцатеричном формате, поэтому запись NULL как 0x0 будет более классической. Для обычных, таких как я, 0 будет достаточно.

Ответ 8

Итак, на этом сайте есть действительно хорошая информация о 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!)