2013-03-25 7 views
1

Стандарт C99 требует, чтобы «байт со всеми битами, установленными в 0, называемый null character, должен существовать в основном наборе символов выполнения, он используется для завершения символьной строки». (5.2.1.2) Затем он перечислит 99 других символов, которые должны быть в наборе выполнения. Может ли использоваться набор символов, в котором нулевой символ является одним из этих 99 символов? В частности, разрешено ли это '0' == '\0'?Может ли нулевой символ использоваться для представления нулевого символа?

Edit: Все указывает на то, что в ASCII, '0' является 0x30. Это верно, но стандарт не предусматривает использование ASCII.

+0

'0' имеет значение ascii 48 –

+1

, почему эти downvotes? это законный вопрос. –

+0

Примечание: _if_ ''0' == '\ 0'', тогда' '1' == '\ 1', '2' == '\ 2'' до' 9' 'должно быть верно также как «десятичные цифры должны быть на один больше, чем значение предыдущего». Однако '' 0 '==' \ 0 '' определенно имеет другие проблемы. Интересный вопрос из коробки - возможно, слишком далеко. – chux

ответ

2

В случае '0'='\0' вы не сможете отличить конец строки и значение '0'.

Таким образом, будет немного сложно использовать что-то вроде «0_any_string», поскольку оно уже начинается с '0'.

+1

Стандарт не требует, чтобы набор символов был ASCII. EBCDIC был использован, но допускается любой набор символов, отвечающий требованиям раздела 5.2.1. Я спрашиваю, соответствует ли гипотетический набор с '0 '' значением' 0' стандартным. – joelw

+0

Стандарт не требует, чтобы строки могли содержать все символы без прерывания. До тех пор, пока вы отвечаете требованиям: «Строка - это непрерывная последовательность символов, заканчивающихся и включающая первый нулевой символ», у вас есть строка, независимо от того, насколько хорошо вы можете ее использовать на практике. – joelw

+0

Ваш первый ответ не был ответом на вопрос вообще. –

-1

Целочисленный постоянный литерал 0 имеет различные значения в зависимости от контекста, в котором он используется. Во всех случаях он по-прежнему является целым числом константой со значением 0, это просто описано по-разному.

Если указатель сравнивается с константным литералом 0, то это чек, чтобы увидеть, является ли указатель нулевым указателем. Это 0 - это , называемый константой нулевого указателя. Стандарт C определяет, что 0 , отлитый от типа void *, является как нулевым указателем, так и нулевым указателем константа.

What is the difference between NULL, '\0' and 0

3

Независимо от того, если вы используете ASCII, EBCDIC или что-то "само-проработаны", '0' должны отличаться от '\0', по той причине, вы говорите себе:

Байт с все биты, установленные в 0, называемые null character, должны существовать в базовом наборе символов выполнения; он используется для завершения символьной строки. (5.2.1.2)

Если нулевой символ завершает символьную строку, он не может содержаться в этой строке. Это единственный символ, который не может содержаться в строке; все остальные символы могут использоваться и, следовательно, должны отличаться от 0.

+0

+1 для первого, кто на самом деле отвечает на вопрос –

1

Нет, это невозможно. Набор символов должен описываться инъективной функцией, т. Е. Функцией, которая отображает каждый символ в ровно одно различное двоичное значение. Сопоставление двух символов с одним и тем же значением сделает набор символов недетерминированным, т. Е. Компьютер не сможет интерпретировать данные подходящему символу, поскольку более одного подходит.

Стандарт C99 создает другое ограничение, заставляя отображение символа null конкретному двоичному значению. Учитывая вышеприведенный параграф, это означает, что ни один другой символ не может иметь значение, идентичное null.

+0

Конечно, мы хотели бы, чтобы карта была инъективной, и это было бы ошибкой в ​​стандарте C, если бы она не требовала этого. Но это не означает, что стандарт содержит такое требование. Можете ли вы привести часть или части стандарта C, которые требуют этого? –

+0

@ EricPostpischil, который не имеет отношения к стандарту C, а скорее к определению набора символов (любого). C является пользователем набора символов в этом аспекте. Обратите внимание на цитату в вопросе «* Байт со всеми битами, установленными в 0, называемый нулевым символом, должен существовать в базовом наборе символов выполнения *» - это означает, что язык C не должен поддерживать какой-либо набор символов, соблюдать. Но быть инъекционным является более широким требованием, и оно выходит за рамки C. – SomeWittyUsername

3

Я не думаю, что в стандарте указано, что каждый из символов, которые он перечисляет (включая нулевой символ), имеет отличное значение, за исключением цифр.Но «набор символов», содержащий значение 0, который предположительно представляет 91 из 100 обязательных символов, явно не является набором символов, содержащим требуемые 100 символов. Так что это либо:

  • часть определения на английском языке о «наборе символов»,
  • очевидно из контекста,
  • очень небольшой недостаток в тексте стандарта, что это должно означать чтобы предотвратить умышленное неверное истолкование неверным исполнителем.

Возьмите с собой.

Смежные вопросы