литерала в C: это int или char?
если я объявлю это:
int i = 0 + 'A';
is 'A'
считается char
или int
?
некоторые люди могут использовать:
int i = 0 + (int)'A';
но это действительно необходимо?
3 ответов
в C, символьные константы, такие как 'A'
типа int
. В C++ они имеют тип char
.
в C тип символьной константы редко имеет значение. Это гарантированно будет int
, а если язык был изменен, чтобы сделать его char
, большинство существующих кодов будет продолжать работать должным образом. (Код, который явно ссылается на sizeof 'A'
изменило бы поведение, но нет особого смысла писать, что, если вы не пытаетесь различать C и C++, и есть лучшие и более надежные способы сделать это. Есть случаи, связанные с макросами, где sizeof 'A'
может быть разумным; я не буду вдаваться в подробности здесь.)
в вашем примере кода:
int i = 0 + 'A';
0
типа int
, и два операнда +
повышены, если необходимо, к общему типу, поэтому поведение точно такое же в любом случае. Даже это:
char A = 'A';
int i = 0 + A;
делает то же самое, с A
(где is типа char
) будучи повышен до int
. Выражения типа char
обычно, но не всегда, неявно назначен int
.
в C++, символьные константы имеют тип char
-- но применяются те же правила продвижения. Когда Страуструп разработал C++, он изменил тип символьных констант для согласованности (это, по общему признанию, немного удивительно, что A
типа int
), и включить более последовательную перегрузку (которую C не поддерживает). Например, если символьные константы C++ имеют значение тип int
, тогда так:
std::cout << 'A';
печати 65
, значение ASCII 'A'
(если система не использует EBCDIC); для него имеет смысл печатать A
.
int i = 0 + (int)'A';
приведение не требуется как на C, так и на C++. В C, 'A'
уже типа int
, так что преобразование не имеет никакого эффекта. В C++ он имеет тип char
, но без броска он будет неявно преобразован в int
в любом случае.
в обоих C и C++, муляжи должны быть с подозрением. Оба языка предоставляют неявные преобразования во многих контекстах, и эти преобразования обычно Поступай правильно. Явное приведение либо переопределяет неявное преобразование, либо создает преобразование, которое в противном случае не имело бы места. Во многих (но далеко не во всех) случаях приведение указывает на проблему, которая лучше решается либо с помощью неявного преобразования, предоставленного языком, либо путем изменения объявления, чтобы преобразуемая вещь имела правильный тип в первое место.
(Паскаль Cuoq напоминает мне в комментариях, если простой char
без подписи и как int
, то выражение типа char
будет повышен до unsigned int
, а не int
. Это может произойти только если CHAR_BIT >= 16
, т. е. если реализация имеет 16-битные или большие байты,и если sizeof (int) == 1
, и простой char
не подписан. Я не уверен, что такие реализации действительно существуют, хотя я понимаю, что C компиляторы для некоторых DSPs есть CHAR_BIT > 8
.)
В C,'A'
тип int
(не char). Я думаю, что некоторые люди int i = 0 + (int)'A';
в C++ (или сделать код полезным в обоих C++/C).
в соответствии со стандартом ISO C99, тип буквенного символа в C является int
.
однако литеральные символы, такие как "c", имеют диапазон, который вписывается в char
.
Таким образом, вы можете назначить буквальный символ char
переменной без потери информации.
char c = 'c'; /* 'c' is int, but (c == 'c') is true */