Почему эта программа отличается от C и С++?
Возможный дубликат:
Размер символа ('a') в C/С++
Следующая программа
#include <stdio.h>
int main()
{
printf("%d\n", sizeof('\0'));
printf("%d\n", sizeof(0));
}
скомпилирован с выходами gcc
4
4
и с g++
1
4
Почему это происходит? Я знаю, что это не компилятор, а разница между C и С++, но какая причина?
Ответы
Ответ 1
В C символьные константы имеют тип int
в соответствии с 6.4.4.4 (10) стандарта,
Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы содержащий один символ, который сопоставляется однобайтовому символу выполнения, является числовое значение представления отображаемого символа, интерпретируемого как целое число.
Таким образом, вы дважды печатаете размер int
.
В С++ символьные константы имеют тип char
.
Ответ 2
Литеральный символ \0
рассматривается как int
в C, поэтому вы фактически печатаете sizeof(int)
вместо sizeof(char)
.
ideone
дает те же результаты (C, С++).
Ответ 3
В C символьных литералах есть ints. В С++ это символы.
Ответ 4
Вывод уже зависит от компилятора, так как вы используете неверный спецификатор формата для size_t
, это будет %zu
. В 64-разрядных системах с size_t
шире, чем int
это может дать вам любой вид мусора.
В противном случае это условие зависит от компилятора. Оба значения, которые вы пытаетесь напечатать, являются int
в C и char
и int
в С++. Таким образом, в C это обычно дает вам 4 4
или 8 8
и в С++ 1 4
или 1 8
.