Чому розмір типу даних відрізняється, коли значення безпосередньо передається оператору sizeof?


15
#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

Чому вихід відрізняється для одних і тих же значень?


12
6.5це не поплавок, цеdouble
NathanOliver

printf("%d",sizeof(6.5f));зробити це a float.
Джонні Мопп

2
"чому вихід тут різний0t?" чому воно повинно бути однаковим? Те, що ви можете призначити один одному, не означає, що вони мають абсолютно один і той же тип.
Слава

5
Специфікатором формату повинен бути, наприклад,printf("%zu", sizeof(6.5));
Weather Vane

Відповіді:


9

Символьні константи в С (протилежно С ++) мають тип int. Тож цей дзвінок

printf("%d",sizeof('A'));

Виходи 4. Тобто sizeof( 'A' )дорівнює sizeof( int ).

Зі стандарту С (6.4.4.4 символьні константи)

10 Ціла константа символів має тип int ....

З іншого боку (6.5.3.4 Розмір операторів розміру та алігноф)

4 Коли sizeof застосовується до операнду, який має тип char, неподписаний char або підписаний char (або його кваліфіковану версію), результат дорівнює 1.

Отже, операнд sizeofоператора в цьому виразі sizeof( 'A' )має тип int, а в цьому виразі sizeof( a )де а оголошено як

char a = 'A';

операнд має тип char.

Зверніть увагу на подібні дзвінки

printf("%d",sizeof(6.5));

використовувати неправильний специфікатор формату перетворення. Треба писати

printf("%zu",sizeof(6.5));

Також у вищезазначеному виклику використовується константа типу doubleпід час цього дзвінка

printf("%zu",sizeof(c));

змінна cмає тип float.

Ви можете отримати той же результат для цих дзвінків, якби перший виклик використовував константу типу float типу

printf("%zu",sizeof(6.5f));

19

Константи, як і змінні, мають свій тип:

  • 6.5 : Константа плаваючої точки типу double
  • 90000: Ціла константа типу int(якщо int32 біта) або long(якщо int16 біт)
  • 'A' : Константа символів типу intC і charC ++

Розміри, які друкуються, - це розміри вищезазначених типів.

Також результат sizeofоператора має тип size_t. Отже, при друкуванні відповідного специфікатора формату, який потрібно використовувати, є %zuні %d.


1

Тому що значення не мають значення sizeof. Це розмір типів.

  • константи символів - це ints, не chars.

  • Константи з плаваючою комою за замовчуванням doubles, якщо ви не додаєте їх до fабо l.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.