เหตุใดขนาดของชนิดข้อมูลจึงแตกต่างกันเมื่อค่าถูกส่งโดยตรงไปยังตัวดำเนินการ 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));floatจะทำให้มันเป็น
Johnny Mopp

2
"เหตุใดเอาต์พุตจึงแตกต่าง 0 ที่นี่" ทำไมมันควรจะเหมือนกัน? ความจริงที่ว่าคุณสามารถกำหนดให้กับคนอื่นไม่ได้หมายความว่าพวกเขามีประเภทเดียวกัน
Slava

5
ตัวระบุรูปแบบควรเป็นตัวอย่างเช่นprintf("%zu", sizeof(6.5));
Weather Vane

คำตอบ:


9

ค่าคงที่ตัวละครใน C (ตรงข้ามกับ C ++) intมีชนิด ดังนั้นการโทรนี้

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

เอาท์พุท 4. นั่นคือจะมีค่าเท่ากับsizeof( 'A' )sizeof( int )

จากมาตรฐาน C (6.4.4.4 ค่าคงที่ตัวละคร)

10 ค่าคงตัวเลขจำนวนเต็มมีประเภท int ....

ในทางกลับกัน (6.5.3.4 ขนาดและการจัดตำแหน่งของผู้ประกอบการ)

4 เมื่อ sizeof ถูกนำไปใช้กับตัวถูกดำเนินการที่มีประเภทถ่าน, ถ่านที่ไม่ได้ลงนามหรือถ่านที่ลงนามแล้ว (หรือรุ่นที่มีคุณสมบัติเหมาะสม) ผลลัพธ์คือ 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));

ตัวแปรที่มีชนิดcfloat

คุณสามารถรับผลลัพธ์เดียวกันสำหรับการโทรเหล่านี้หากการโทรครั้งแรกใช้ค่าคงที่ของประเภทลอยเช่น

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

19

ค่าคงที่เช่นตัวแปรมีประเภทของตนเอง:

  • 6.5 : ค่าคงที่จุดลอยตัวของประเภท double
  • 90000: ค่าคงที่จำนวนเต็มประเภทint(ถ้าintเป็น 32 บิต) หรือlong(ถ้าintเป็น 16 บิต)
  • 'A' : ค่าคงที่ของอักขระintใน C และcharC ++

ขนาดที่พิมพ์เป็นขนาดของประเภทข้างต้น

นอกจากนี้ยังมีผลมาจากการที่ผู้ประกอบการมีประเภทsizeof size_tดังนั้นเมื่อมีการพิมพ์รูปแบบที่เหมาะสมในการระบุการใช้งานเป็นไม่ได้%zu%d


1

sizeofเพราะค่าที่ไม่ได้เรื่องที่จะ มันเป็นขนาดของประเภท

  • ค่าคงที่ของอักขระคือints ไม่ใช่chars

  • ค่าคงที่จุดลอยตัวโดยเริ่มต้นdoubles เว้นแต่คุณจะต่อท้ายพวกเขาด้วยหรือfl

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.