Mengapa ukuran tipe data berbeda ketika nilainya langsung diteruskan ke ukuran operator?

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;
}

Outputnya adalah:

8 4 4 4 4 1

Mengapa output berbeda untuk nilai yang sama?

js
sumber
12
6.5bukan pelampung, ini adalahdouble
NathanOliver
printf("%d",sizeof(6.5f));untuk membuatnya menjadi float.
Johnny Mopp
2
"mengapa outputnya berbeda di sini?" mengapa harus sama? Fakta bahwa Anda dapat menetapkan satu sama lain tidak berarti mereka memiliki tipe yang persis sama.
Slava
5
Penentu format harus, misalnya,printf("%zu", sizeof(6.5));
Weather Vane

Jawaban:

9

Konstanta karakter dalam C (berlawanan dengan C ++) memiliki tipe int. Jadi panggilan ini

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

output 4. Itu sizeof( 'A' )sama dengan sizeof( int ).

Dari Standar C (konstanta Karakter 6.4.4.4)

10 Sebuah konstanta karakter integer memiliki tipe ....

Di sisi lain (6.5.3.4 Ukuran dan keselarasan operator)

4 Ketika sizeof diterapkan pada operan yang memiliki tipe char, unsigned char, atau char yang ditandatangani, (atau versi yang berkualitas) hasilnya adalah 1.

Jadi operan sizeofoperator dalam ekspresi ini sizeof( 'A' )memiliki tipe int sedangkan dalam ekspresi ini di sizeof( a )mana a dinyatakan seperti

char a = 'A';

operan memiliki tipe char.

Perhatikan panggilan itu seperti ini

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

menggunakan specifier format konversi yang salah. Anda harus menulis

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

Juga dalam panggilan di atas ada digunakan jenis konstan doublesaat dalam panggilan ini

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

variabel cmemiliki tipe float.

Anda bisa mendapatkan hasil yang sama untuk panggilan ini jika panggilan pertama menggunakan konstanta dari tipe float like

printf("%zu",sizeof(6.5f));
Vlad dari Moskow
sumber
19

Konstanta, seperti halnya variabel, memiliki jenisnya sendiri:

  • 6.5 : Konstanta titik apung dari tipe double
  • 90000: Konstanta bilangan bulat bertipe int(jika int32 bit) atau long(jika int16 bit)
  • 'A' : Konstanta karakter bertipe intC dan charC ++

Ukuran yang dicetak adalah ukuran dari tipe di atas.

Juga, hasil dari sizeofoperator memiliki tipe size_t. Jadi saat mencetak format specifier yang tepat untuk digunakan adalah %zu, tidak %d.

dbush
sumber
1

Karena nilainya tidak penting sizeof. Ini ukuran jenisnya.

  • konstanta karakter adalah ints, bukan chars.

  • konstanta floating-point secara default doubles kecuali Anda sufiks dengan fatau l.

SS Anne
sumber