ขนาดของอักขระ ('a') ใน C / C ++


298

ขนาดของตัวละครใน C และ C ++ คืออะไร? เท่าที่ฉันรู้ขนาดของถ่านเท่ากับ 1 ไบต์ทั้งใน C และ C ++

ใน C:

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

ใน C ++:

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}

ไม่น่าประหลาดใจทั้งคู่ให้ผลลัพธ์: Size of char : 1

ตอนนี้เรารู้ว่าตัวละครจะแสดงเป็น'a', 'b', 'c', '|', ... ดังนั้นฉันเพียงแค่ปรับเปลี่ยนรหัสดังกล่าวข้างต้นเหล่านี้:

ใน C:

#include <stdio.h>
int main()
{
    char a = 'a';
    printf("Size of char : %d\n", sizeof(a));
    printf("Size of char : %d\n", sizeof('a'));
    return 0;
}

เอาท์พุท:

Size of char : 1
Size of char : 4

ใน C ++:

#include <iostream>
int main()
{
    char a = 'a';
    std::cout << "Size of char : " << sizeof(a) << "\n";
    std::cout << "Size of char : " << sizeof('a') << "\n";
    return 0;
}

เอาท์พุท:

Size of char : 1
Size of char : 1

เหตุใดจึงsizeof('a')ส่งกลับค่าที่แตกต่างใน C และ C ++


8
"%|"รูปแบบต้องมีintอาร์กิวเมนต์ (หรือบางสิ่งบางอย่างที่ส่งเสริมการint) ผลเป็นผลมาจากประเภทsizeof size_tทั้งแปลงเพื่อใช้หล่อหรือหากการดำเนินการของคุณสนับสนุนการใช้งานint "%zu"
Keith Thompson

คำตอบ:


348

ใน C ประเภทของค่าคงที่ตัวละครที่เหมือน'a'จริง ๆ แล้วintมีขนาดเท่ากับ 4 (หรือค่าที่ขึ้นอยู่กับการนำไปใช้งานบางอย่าง) ใน C ++ ประเภทคือcharมีขนาด 1 นี่คือหนึ่งในความแตกต่างเล็ก ๆ ระหว่างสองภาษา


12
ในมาตรฐาน C ++ มันเป็นส่วนที่ 2.13.2 / 1 ใน C 6.4.4.4 อย่างน้อยในเอกสารที่ฉันมี

14
+1 (ยกเว้นว่าในขณะที่ "ขนาด 4" เห็นได้ชัดว่านำไปใช้กับแพลตฟอร์ม nthrgeek ก็ไม่จำเป็นต้องนำไปใช้กับทุกแพลตฟอร์ม.)
เอสบีไอ

28
@nthrgeek: ฉันขี้เกียจเกินไปที่จะพูดทั้งสองมาตรฐาน แต่ c ++ มาตรฐานมีภาคผนวกที่อุทิศตนเพื่อกันไม่ได้กับซีภายใต้ภาคผนวก C.1.1 ก็กล่าวว่า "ชนิดของตัวละครตัวอักษรที่มีการเปลี่ยนแปลงจากintการcharซึ่งจะอธิบายพฤติกรรม :)
jalf

3
@nthrgeek: §6.4.4.4, ย่อหน้าที่ 10: "ค่าคงที่จำนวนเต็มมี type int ค่าของค่าคงที่จำนวนเต็มประกอบด้วยอักขระตัวเดียวที่แมปกับอักขระการดำเนินการไบต์เดียวคือค่าตัวเลขของการแทนค่าของแผนที่ ตัวละครตีความว่าเป็นจำนวนเต็ม "
สตีเฟ่นแคนนอน

7
@nthrgeek: คุณไม่ควรขออ้างอิงมาตรฐานเว้นแต่คุณจะมีข้อโต้แย้งเกี่ยวกับประเด็นเฉพาะและคุณต้องการที่จะเข้าใจว่าทำไมคนอื่นถึงมีความคิดเห็นที่ต่างออกไป ถ้าทุกคนเห็นด้วยก็แค่ยอมรับมัน คุณ (ในฐานะนักพัฒนา) ควรฉลาดพอที่จะหาคำตอบทั่วไปได้อย่างรวดเร็วด้วยตัวเอง
มาร์ตินยอร์ค

26

ตามที่เปาโลกล่าวไว้นั่นเป็นเพราะ'a'มันอยู่intใน C แต่เป็นcharC ++

ฉันครอบคลุมความแตกต่างเฉพาะระหว่าง C และ C ++ ในสิ่งที่ฉันเขียนเมื่อไม่กี่ปีที่แล้วที่: http://david.tribble.com/text/cdiffs.htm


4
แค่อยากรู้อยากเห็น แต่คุณกำลังทำงานเกี่ยวกับการปรับปรุงเอกสาร (รายละเอียดมาก) เพื่อรวมการเปลี่ยนแปลงใหม่ใน C ++ 11 และ C11 หรือไม่
Adam Rosenfield

ไม่ใช่ตอนนี้. ความสนใจใน C และ C ++ ของฉันลดลงมากในช่วงห้าปีที่ผ่านมา
David R Tribble

3
เอ่อฉันใช้งานของคุณเขียนสิ่งนี้และคุณอยู่ที่ SO ช่างเป็นโลกใบเล็ก!

17

ใน C ประเภทของตัวอักษรตัวอักษรเป็นintและอักขระใน C ++ นี้อยู่ใน c ++ ที่จำเป็นในการสนับสนุนการทำงานมากไป ดูตัวอย่างนี้:

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

เอาท์พุท:

char

5

ในภาษา Cอักขระตามตัวอักษรไม่ใช่charประเภท C พิจารณาตัวอักษรตัวอักษรเป็นจำนวนเต็ม จึงมีความแตกต่างระหว่างไม่มีและsizeof('a')sizeof(1)

ดังนั้นขนาดตัวอักษรของตัวอักษรเท่ากับขนาดของจำนวนเต็มในซี

ใน C ++ ภาษา , charตัวอักษรตัวอักษรเป็นประเภทของ cppreferenceพูดของ:

1) ตัวอักษรตัวอักษรที่แคบหรือตัวอักษรตัวอักษรธรรมดาเช่น'a'หรือ หรือ'\n' '\13'ตัวอักษรดังกล่าวมีประเภทcharและค่าเท่ากับการเป็นตัวแทนของ c-char ในชุดอักขระการดำเนินการ หาก c-char ไม่สามารถแทนค่าได้ในหนึ่งไบต์ในชุดอักขระการดำเนินการตัวอักษรจะมีค่า int และกำหนดตามการนำไปใช้

ดังนั้นใน C ++ charอักษรตัวอักษรเป็นประเภทของ ดังนั้นขนาดของตัวอักษรใน C ++ คือหนึ่งไบต์

Alos ในโปรแกรมของคุณคุณใช้ตัวระบุรูปแบบที่ไม่ถูกต้องสำหรับsizeofโอเปอเรเตอร์

C11 §7.21.6.1 (P9):

หากข้อกำหนดการแปลงไม่ถูกต้องพฤติกรรมจะไม่ได้กำหนดไว้ 237) หากอาร์กิวเมนต์ใด ๆ นั้นไม่ใช่ประเภทที่ถูกต้องสำหรับข้อกำหนดการแปลงที่สอดคล้องกันพฤติกรรมนั้นจะไม่ได้กำหนดไว้

ดังนั้นคุณควรใช้ตัว%zuระบุรูปแบบแทน%dมิฉะนั้นจะเป็นพฤติกรรมที่ไม่ได้กำหนดใน C


%zuไม่รองรับหลายแพลตฟอร์ม แต่พกพาได้ดีขึ้นใช้งาน(int)sizeof(char)และจัดรูปแบบได้ดีขึ้น%d
chqrlie

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