#include <stdio.h>
int main() {
char a = 'A';
int b = 90000;
float c = 6.5;
printf("%d ",sizeof(6.5));
printf("%d ",sizeof(90000));
printf("%d ",sizeof('A'));
printf("%d ",sizeof(c));
printf("%d ",sizeof(b));
printf("%d",sizeof(a));
return 0;
}
Выход:
8 4 4 4 4 1
Почему выходные данные отличаются для одинаковых значений?
6.5
это не поплавок, этоdouble
printf("%d",sizeof(6.5f));
чтобы сделать этоfloat
.printf("%zu", sizeof(6.5));
Ответы:
Символьные константы в C (противоположные C ++) имеют тип
int
. Итак, этот вызовВыходы 4. То
sizeof( 'A' )
есть равноsizeof( int )
.Из стандарта C (6.4.4.4 Символьные константы)
С другой стороны (6.5.3.4 Операторы sizeof и alignof)
Таким образом, операнд
sizeof
оператора в этом выраженииsizeof( 'A' )
имеет тип int, а в этом выраженииsizeof( a )
a объявлен какоперанд имеет тип
char
.Обратите внимание, что звонки, как это
использовать неверный спецификатор формата преобразования. Вы должны написать
Также в приведенном выше вызове используется константа типа, в
double
то время как в этом вызовепеременная
c
имеет типfloat
.Вы можете получить тот же результат для этих вызовов, если в первом вызове используется константа типа float, например
источник
Константы, как и переменные, имеют свой собственный тип:
6.5
: Константа с плавающей точкой типаdouble
90000
: Целочисленная константа типаint
(еслиint
это 32 бита) илиlong
(еслиint
это 16 бит)'A'
: Символьная константа типаint
в C иchar
C ++Размеры, которые печатаются, являются размерами вышеуказанных типов.
Также результат
sizeof
оператора имеет типsize_t
. Таким образом, при печати правильный спецификатор формата для использования%zu
, а не%d
.источник
Потому что значения не имеют значения
sizeof
. Это размер типов.символьные константы
int
s, а неchar
s.Константы с плавающей точкой по умолчанию
double
s, если вы не суффиксуете их с помощьюf
илиl
.источник