2011-01-10 2 views
1

Я работаю на кусок кода, который имеет заявление, как показано ниже:если (memcmp (версия, " x0 x0 x0", 3) == 0)

if (memcmp (version, "\x0\x0\x0", 3) == 0)  

Что данные что сравнивается с версией? Это то же самое, что и сравнение с «000»?

+1

Сторона примечания: В этом очень специальном случае каждый «х» не нужен. – Mehrdad

ответ

-1

Номер \ x0 - буква для NULL. «000» - это число и имеет другое представление в памяти.

+2

'\ x0' (или' \ 0') является литералом для символа NUL. NULL (с ​​двумя L) обычно зарезервирован для указателя. –

+1

'' 000 "' не является числом - это строка. – mizo

6

Нет, это не то же самое, что и "000". Он сравнивает три нулевые (0) байта. Каждый байт представляет собой фактическое значение нуля в двоичном формате. Это отличается от "000", который является строка, содержащая значения ASCII для печати характера0, который является 48 (или 30 в шестнадцатеричной.)

Так "000" будет такой же, как "\x30\x30\x30".

1

Нет - не сравнимо с "000". Это сравнение с тремя нулевыми символами. Эквивалентная и, вероятно, более ожидаемая строка будет "\0\0\0". Или просто 3-значный массив, заполненный 0, для этого случая, где код проверяет только 3 символа.

+1

Если вы хотите быть хитрым, вы можете использовать '' \ 0 \ 0 "' (и 'sizeof" \ 0 \ 0 "' для размера). –

4

"\x0\x0\x0" всего: { 0x00, 0x00, 0x00, 0x00 }. Четвертый нуль - это нулевой ограничитель строки.

Итак, чтобы ответить на ваш вопрос - нет, это не то же самое, что в сравнении с "000".

'\x0' - шестнадцатеричный нуль, тогда как '0' - код ASCII символа 0 (шестнадцатеричный 30).

1

\x0 означает char со значением 0. 0 отличается, это символ ASCII с кодом 0x30.

0

Было бы интересно узнать определение переменной version. Это void * или char * или какое-то другое странное литье. Это, вероятно, вызывает предупреждение во время компиляции.

Было бы также разумно посмотреть, как инициализируется version, чтобы убедиться, что ошибок нет. Это, безусловно, странный способ проверить (отсутствие) номер версии в программе.