Подтвердить что ты не робот

В чем разница между (char) 0 и '\ 0'? в C

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

4b9b3361

Ответ 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, который указывает конец строки.