Разница типов символьных литералов в C и C++
Каждый литерал (константа) в 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 . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.