В чем разница между использованием (char)0
и '\0'
для обозначения завершающего нулевого символа в массиве символов?
В чем разница между (char) 0 и '\ 0'? в C
Ответ 1
Обозначение обратной косой черты в символьном литерале позволяет вам указывать числовое значение символа вместо использования самого символа. Таким образом, '\1'
[*] означает "символ, числовое значение которого равно 1", '\2'
означает "символ, числовое значение которого равно 2" и т.д. Почти. Из-за причуды C характерные литералы действительно имеют тип int
, и действительно int
используется для обработки символов в других контекстах, например, для возвращаемого значения fgetc
. Таким образом, '\1'
означает "числовое значение как int, символа, числовое значение которого равно 1" и т.д.
Поскольку символы являются числовыми значениями в C, "символ, числовое значение которого равно 1" на самом деле составляет (char)1
, а дополнительное украшение в '\1'
не влияет на компилятор - '\1'
имеет тот же тип и значение как 1
в C. Поэтому нотация обратной косой черты более необходима в строковых литералах, чем в символьных литералах, для вставки непечатаемых символов, которые не имеют собственного кода эвакуации.
Лично я предпочитаю писать 0
, когда я имею в виду 0, и пусть неявные преобразования делают свое дело. Некоторые люди считают это очень трудным для понимания. При работе с этими людьми полезно писать '\0'
, когда вы имеете в виду символ со значением 0, то есть в тех случаях, когда вы ожидаете, что ваш 0
скоро будет неявно преобразован в тип char
. Точно так же это может помочь написать NULL
, когда вы имеете в виду константу нулевого указателя, 0.0
, когда вы имеете в виду double со значением 0 и т.д.
Независимо от того, имеет ли какое-либо значение для компилятора и зависит от того, нужен ли он для трансляции, зависит от контекста. Поскольку '\0'
имеет точно такой же тип и значение, что и 0
, его нужно отличить до char
в точно таких же обстоятельствах. Таким образом, '\0'
и (char)0
отличаются по типу, для точно эквивалентных выражений вы можете либо рассмотреть (char)'\0'
vs (char)0
, либо '\0'
vs 0
. NULL
имеет тип, определенный реализацией - иногда его нужно отличить от типа указателя, так как он может иметь целочисленный тип. 0.0
имеет тип double
, поэтому он определенно отличается от 0
. Тем не менее, float f = 1.0;
идентичен float f = 1;
и float f = 1.0f
, тогда как 1.0 / i
, где i
является int, обычно имеет другое значение от 1 / i
.
Итак, любое общее правило: использовать ли '\0'
или 0
чисто для удобства читателей вашего кода - это все равно для компилятора. Выберите, какой вы (и ваши коллеги) предпочитаете внешний вид или, возможно, определяете макрос ASCII_NUL
.
[*] или '\01'
- поскольку обратная косая черта вводит восьмеричное число, а не десятичную, иногда разумно сделать это немного более очевидным, гарантируя, что оно начинается с 0. Не делает различий для 0, 1, 2 из курс. Я говорю "иногда", потому что обратная косая черта может сопровождаться только 3 восьмеричными цифрами, поэтому вы не можете писать \0101
вместо \101
, чтобы напомнить читателю, что это восьмеричное значение. Все это довольно неудобно и приводит к еще большему украшению: \x41
для капитала A, поэтому вы можете написать '\x0'
для 0. Если вы хотите.
Ответ 2
Они оба равны 0, но (char) 0
- это char, а '\0'
(unintuitively) a int
. Это различие не должно обычно влиять на вашу программу, если значение равно 0.
Я предпочитаю '\0'
, так как это константа, предназначенная для этого.
Ответ 3
Zero может означать много разных вещей в C. Вы должны использовать нулевой символ '\ 0', потому что тогда не может быть путаницы в том, что ваше намерение является завершением строки.
Если вы установите для параметра char значение 0, это может означать нулевое завершение, но это также означает, что вы просто используете char как 8-разрядное целое для вычислений, а не как часть строки. Это можно смутить, если вы также используете указатели в одном коде и сравниваете их с нулем, который затем является нулевым указателем.
Ответ 4
Символьный массив означает, что вы берете String, поэтому я советую вам использовать '\0'
в конце массива символов после прочтения всех символов пользователя, потому что 0
- это простой символ, но '\0'
is NULL
, который указывает конец строки.