Нотация с обратной косой чертой в символьном литерале позволяет вам указать числовое значение символа вместо использования самого символа.Так '\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, если хотите.