Ukuran karakter ('a') di C / C ++

298

Berapa ukuran karakter dalam C dan C ++? Sejauh yang saya tahu ukuran char adalah 1 byte di C dan C ++.

Dalam C:

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

Dalam C ++:

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

Tidak ada kejutan, keduanya memberikan output: Size of char : 1

Sekarang kita tahu bahwa karakter yang direpresentasikan sebagai 'a', 'b', 'c', '|', ... Jadi saya hanya memodifikasi kode di atas dengan ini:

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

Keluaran:

Size of char : 1
Size of char : 4

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

Keluaran:

Size of char : 1
Size of char : 1

Mengapa sizeof('a')mengembalikan nilai yang berbeda dalam C dan C ++?

whacko__Cracko
sumber
8
The "%|"Format membutuhkan intargumen (atau sesuatu yang mempromosikan ke int). sizeofmenghasilkan hasil dari tipe size_t. Baik dikonversi menjadi intmenggunakan gips atau, jika implementasi Anda mendukungnya, gunakan "%zu".
Keith Thompson

Jawaban:

348

Dalam C, jenis karakter seperti konstan'a' sebenarnya adalah int, dengan ukuran 4 (atau nilai implementasi-tergantung lainnya). Dalam C ++, tipenya adalah char, dengan ukuran 1. Ini adalah salah satu dari banyak perbedaan kecil antara kedua bahasa.

Eric Postpischil
sumber
12
Dalam C ++ Standard, bagian 2.13.2 / 1, di C 6.4.4.4, setidaknya dalam dokumen yang saya dapatkan.
14
+1 (Kecuali itu, sementara "ukuran 4" jelas berlaku untuk platform nthrgeek, itu tidak selalu berlaku untuk semua platform.)
sbi
28
@nthrgeek: Saya terlalu malas untuk mengutip kedua standar, tetapi standar C ++ memiliki lampiran yang didedikasikan untuk ketidakcocokan dengan C. Di bawah Lampiran C.1.1, disebutkan bahwa "Jenis karakter literal diubah dari intmenjadi char, yang menjelaskan perilaku. :)
jalf
3
@nthrgeek: §6.4.4.4, paragraf 10: "Konstanta karakter integer bertipe int. Nilai konstanta karakter integer yang mengandung karakter tunggal yang memetakan ke karakter eksekusi byte tunggal adalah nilai numerik representasi representasi yang dipetakan. karakter ditafsirkan sebagai bilangan bulat. "
Stephen Canon
7
@nthrgeek: Anda seharusnya tidak meminta referensi standar kecuali Anda memiliki argumen tentang poin tertentu dan Anda ingin memahami mengapa orang lain memiliki pendapat yang berbeda. Jika semua orang setuju, terima saja. Anda (sebagai pengembang) harus cukup pintar untuk dengan cepat menemukan jawaban umum seperti ini sendirian.
Martin York
26

Seperti yang dikatakan Paul, itu karena 'a'adalah intdalam C tetapi chardalam C ++.

Saya membahas perbedaan spesifik antara C dan C ++ dalam sesuatu yang saya tulis beberapa tahun yang lalu, di: http://david.tribble.com/text/cdiffs.htm

David R Tribble
sumber
4
Hanya ingin tahu, tetapi apakah Anda berupaya memperbarui dokumen (sangat rinci) itu untuk memasukkan perubahan baru dalam C ++ 11 dan C11?
Adam Rosenfield
Tidak saat ini. Ketertarikan saya pada C dan C ++ telah berkurang banyak dalam lima tahun terakhir ini.
David R Tribble
3
Eh, saya menggunakan pekerjaan Anda untuk menulis ini dan di sini Anda berada di SO. Dunia yang begitu kecil!
17

Dalam C tipe literal karakter adalah int dan char dalam C ++. Ini dalam C ++ diperlukan untuk mendukung fungsi yang berlebihan . Lihat contoh ini:

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

Keluaran:

char
Smith
sumber
5

Dalam bahasa C , karakter literal bukan chartipe. C menganggap karakter literal sebagai integer. Jadi, tidak ada perbedaan antara sizeof('a')dan sizeof(1).

Jadi, ukuran literal karakter sama dengan sizeof integer dalam C.

Dalam bahasa C ++ , karakter literal adalah tipe char. The cppreference mengatakan ini:

1) karakter sempit harfiah atau karakter biasa, misalnya 'a'atau '\n'atau '\13'. Literal tersebut memiliki tipechar dan nilai yang sama dengan representasi c-char dalam set karakter eksekusi. Jika c-char tidak dapat direpresentasikan sebagai byte tunggal dalam set karakter eksekusi, literal memiliki tipe int dan nilai implementasi-didefinisikan.

Jadi, dalam karakter C ++ literal adalah tipe char. jadi, ukuran literal karakter dalam C ++ adalah satu byte.

Alos, Dalam program Anda, Anda telah menggunakan penentu format yang salah untuk sizeofoperator.

C11 §7.21.6.1 (P9):

Jika spesifikasi konversi tidak valid, perilaku tidak terdefinisi.275) Jika ada argumen yang bukan tipe yang tepat untuk spesifikasi konversi yang sesuai, perilaku tidak terdefinisi.

Jadi, Anda harus menggunakan %zupenentu format alih-alih %d, jika tidak maka perilaku tidak ditentukan dalam C.

msc
sumber
%zutidak didukung pada banyak platform, tetapi portabilitas, penggunaan, (int)sizeof(char)dan format yang lebih baik%d
chqrlie
Nilai literal karakter belum tentu sesuai dengan kode ASCII. Itu tergantung pada set karakter sumber dan eksekusi dan apakah charjenisnya ditandatangani atau tidak ditandatangani secara default.
chqrlie