В чем разница между (char) 0 и '\ 0'? в С - PullRequest
28 голосов
/ 28 сентября 2011

В чем разница между использованием (char)0 и '\0' для обозначения завершающего нулевого символа в массиве символов?

Ответы [ 4 ]

27 голосов
/ 28 сентября 2011

Они оба равны 0, но (char) 0 - это символ, а '\0' - (неинтуитивно) - int. Эта разница в типах обычно не должна влиять на вашу программу, если значение равно 0.

Я предпочитаю '\0', так как это константа, предназначенная для этого.

23 голосов
/ 13 октября 2011

Нотация с обратной косой чертой в символьном литерале позволяет вам указать числовое значение символа вместо использования самого символа.Так '\1' [*] означает «символ, числовое значение которого равно 1», '\2' означает «символ, числовое значение которого равно 2» и т. Д. Почти.Из-за причуды C символические литералы на самом деле имеют тип int, и действительно int используется для обработки символов и в других контекстах, таких как возвращаемое значение fgetc.Таким образом, '\1' означает «числовое значение в виде целого числа для символа, числовое значение которого равно 1» и т. Д.

Поскольку символы являются числовыми значениями в C, «символчье числовое значение равно 1 ", на самом деле равно (char)1, а дополнительное оформление в '\1' не влияет на компилятор - '\1' имеет тот же тип и значение, что и 1 в C.нотация с обратной косой чертой более необходима в строковых литералах, чем в символьных литералах, для вставки непечатаемых символов, у которых нет собственного escape-кода.

Лично я предпочитаю писать 0, когда имею в виду0, и пусть неявные преобразования делают свое дело.Некоторые люди находят это очень трудным для понимания.При работе с этими людьми полезно написать '\0', когда вы имеете в виду символ со значением 0, то есть в тех случаях, когда вы ожидаете, что ваш 0 скоро неявно преобразуется в тип char.Аналогично, это может помочь написать NULL, когда вы имеете в виду константу нулевого указателя, 0.0, когда вы имеете в виду double со значением 0 и т. Д.

Имеет ли это какое-либо значение для компилятора, инужен ли актерский состав, зависит от контекста.Поскольку '\0' имеет точно такой же тип и значение, что и 0, его необходимо привести к char при точно таких же обстоятельствах.Так что '\0' и (char)0 различаются по типу, для точно эквивалентных выражений вы можете рассмотреть (char)'\0' против (char)0 или '\0' против 0.NULL имеет тип, определенный реализацией - иногда его необходимо привести к типу указателя, поскольку он может иметь целочисленный тип.0.0 имеет тип double, поэтому, безусловно, отличается от 0.Тем не менее, float f = 1.0; идентичен float f = 1; и float f = 1.0f, тогда как 1.0 / i, где i является целым числом, обычно имеет значение, отличное от 1 / i.

Итак, любое общее правилоиспользовать '\0' или 0 исключительно для удобства читателей вашего кода - это все равно для компилятора.Выберите, какой вы (и ваши коллеги) предпочитаете внешний вид, или, возможно, определите макрос ASCII_NUL.

[*] или '\01' - поскольку обратный слеш вводит восьмеричное число,не десятичный, иногда целесообразно сделать это немного более очевидным, убедившись, что он начинается с 0. Конечно, не имеет значения для 0, 1, 2.Я говорю «иногда», потому что после обратной косой черты могут следовать только 3 восьмеричные цифры, поэтому вы не можете написать \0101 вместо \101, чтобы напомнить читателю, что это восьмеричное значение.Это все довольно неловко и приводит к еще большему убранству: \x41 для заглавной буквы A, и поэтому вы можете написать '\x0' для 0, если хотите.

2 голосов
/ 28 сентября 2011

Ноль может означать много разных вещей в C. Вы должны использовать нулевой символ '\ 0', потому что тогда не может быть никакой путаницы в том, что ваше намерение - завершение строки.

Если вы установите char в 0, это может означать нулевое завершение, но это также может означать, что вы просто используете char как 8-битное целое число для вычислений, а не как часть строки. Это может привести к путанице, если вы также используете указатели в том же коде и сравниваете их с нулем, который затем является нулевым указателем.

0 голосов
/ 28 сентября 2011

Символьный массив означает, что вы берете строку, поэтому я советую вам использовать '\0' в конце символьного массива после прочтения всех символов пользователя, потому что 0 - простой символ, но '\0' - NULL, что указываетконец строки.

...