литерала в 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 */