Разница типов символьных литералов в C и C++

Опубликовано: 15 Сентября, 2022

Каждый литерал (константа) в C/C++ будет иметь связанный с ним тип информации. Как в C, так и в C++ числовые литералы (например, 10) будут иметь тип int . Это означает, что sizeof(10) и sizeof(int) вернут одно и то же значение.
Если мы скомпилируем сказанное в виде кода, то это будет выглядеть примерно так.
Пример:

Выход:

4
4

Однако символьные литералы (например, 'V') будут иметь разные типы, sizeof('V') возвращает разные значения в C и C++. В C символьный литерал обрабатывается как тип int , тогда как в C++ символьный литерал обрабатывается как тип char ( sizeof('V') и sizeof(char) одинаковы в C++, но не в C. Давайте посмотрим на это. интересное поведение на примере.

Результат вышеуказанной программы:

  • Результат C - sizeof('V') = 4 и sizeof(char) = 1
  • Результат C++ — sizeof('V') = 1 и sizeof(char) = 1

Точнее, мы можем сказать, что в C sizeof('V') будет обрабатываться как длинное целое без знака, давайте посмотрим на пример, чтобы было понятнее.

Вывод: это даст эту ошибку.

source.c: In function "main":
source.c:7:10: warning: format "%d" expects argument of type "int", but argument 2 has type "long unsigned int" [-Wformat=]
    7 | printf("%d", sizeof("V"));
      |         ~^   ~~~~~~~~~~~
      |          |   |
      |          int long unsigned int
      |         %ld

Такое поведение требуется в C++ для поддержки перегрузки функций. Пример сделает это более понятным. Предскажите вывод следующей программы C++.

Выход:

From foo: char

Компилятор должен вызвать

void foo(char);

так как тип 'V' - char .

Эта статья предоставлена Venki . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.

C++