Değer doğrudan sizeof operatörüne iletildiğinde veri türünün boyutu neden farklı?


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

Çıktı:

8 4 4 4 4 1

Çıktı aynı değerler için neden farklı?


12
6.5bir kayan nokta değil, birdouble
NathanOliver

printf("%d",sizeof(6.5f));yapmak için a float.
Johnny Mopp

2
"Çıktı neden burada farklı?" neden aynı olmalı? Birini diğerine atayabilmeniz, tam olarak aynı tipte oldukları anlamına gelmez.
Slava

5
Biçim belirteci, örneğinprintf("%zu", sizeof(6.5));
Weather Vane

Yanıtlar:


9

C'deki karakter sabitleri (C ++ 'nın tersi) tipindedir int. Yani bu çağrı

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

4. sizeof( 'A' )Eşittir sizeof( int ).

C Standardından (6.4.4.4 Karakter sabitleri)

10 Bir tamsayı karakter sabiti int türüne sahiptir ....

Öte yandan (6.5.3.4 Sizeof ve alignof operatörleri)

4 sizeof, char, imzasız karakter veya imzalı karakter içeren bir işlenene (veya bunun kalifiye bir versiyonuna) uygulandığında sonuç 1 olur.

Dolayısıyla, sizeofbu ifadedeki operatörün işleneni, a sizeof( 'A' )ifadesininsizeof( a )

char a = 'A';

işlenen türü vardır char.

Bunun gibi çağrılara dikkat edin

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

yanlış dönüşüm biçimi belirtecini kullanın. Yazmak zorundasın

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

Ayrıca yukarıdaki çağrıda double, bu çağrı sırasında tipte bir sabit kullanılır.

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

değişkenin ctürü vardır float.

İlk çağrı şamandıra türünde bir sabit kullanıyorsa, bu çağrılar için aynı sonucu alabilirsiniz

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

19

Sabitler, değişkenler gibi, kendi türlerine sahiptir:

  • 6.5 : Kayan nokta sabiti tipi double
  • 90000: Bir tamsayı sabit tipi int( int32 bit ise) veya long( int16 bit ise)
  • 'A' : intC ve charC ++ türünde bir karakter sabiti

Yazdırılan boyutlar yukarıdaki türlerin boyutudur.

Ayrıca, sizeofoperatörün sonucunun türü vardır size_t. Bu yüzden kullanmak için uygun format belirleyiciyi yazdırırken %zudeğil %d.


1

Çünkü değerler önemli değil sizeof. Türlerin boyutu.

  • karakter sabitleri ints değil chars'dir.

  • kayan nokta sabitleri, veya doubleile eklenmedikçe varsayılan olarak s'dir .fl

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.