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

Возвращаемое значение оператора sizeof() в C & С++

#include<stdio.h>
int main()
{
    printf("%d", sizeof('a'));
    return 0;
}

Почему приведенный выше код создает разные результаты при компиляции на C и С++? В C он печатает 4 в С++, это более приемлемый ответ, т.е. 1.
Когда я заменяю 'a' внутри sizeof() переменной char, объявленной в основной функции, результат равен 1 в обоих случаях!

4b9b3361

Ответ 1

Потому что, и это может быть шокирующим, C и С++ не являются одним и тем же языком.

C определяет символьные литералы как имеющие тип int, тогда как С++ считает, что они имеют тип char.

Это случай, когда многосимвольные константы могут быть полезны:

const int foo = 'foo';

Это создаст целое число, значение которого, вероятно, будет 6713199 или 7303014 в зависимости от порядка байтов и настроения компилятора. Другими словами, многосимвольные символьные литералы не являются "переносимыми", вы не можете зависеть от того, что полученное значение легко предсказать.

Как отмечают комментаторы (спасибо!), это справедливо и для C и С++, кажется, что С++ делает многосимвольные символьные литералы другим типом. Умно!

Кроме того, в качестве незначительной заметки, которую я хотел бы упомянуть в теме, обратите внимание, что sizeof не является функцией и что значения size_t не являются int. Таким образом:

printf("the size of a character is %zu\n", sizeof 'a');

или, если ваш компилятор слишком стар, чтобы не поддерживать C99:

printf("the size of a character is %lu\n", (unsigned long) sizeof 'a');

представляют собой самый простой и правильный способ печати размеров, которые вы исследуете.

Ответ 2

В C символ 'a' является символьной константой, которая рассматривается как целое число, поэтому вы получаете размер 4, тогда как в С++ он рассматривается как char.

возможный дублирующий вопрос Размер символа ('a') в C/С++

Ответ 3

Например, один из случаев, когда С++ несовместим с C. В API-интерфейсах C, которые возвращают один символ (например, getch) return и int, потому что это позволяет пространство для маркера EOF (-1). Поэтому по этой причине он видит 'c' как int.

С++ вводит перегрузку операторов и функций, что означает, что мы, вероятно, хотим обрабатывать

cout << 'c'

иначе:

cout << 99