C / C ++ 'da karakter boyutu (' a ')


299

C ve C ++ 'daki karakterin boyutu nedir? Bildiğim kadarıyla char boyutu C ve C ++ hem de 1 bayt.

C dilinde:

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

C ++ dilinde:

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

Sürpriz yok, ikisi de çıktı veriyor: Size of char : 1

Şimdi sıra karakterler temsil edildiği biliyoruz 'a', 'b', 'c', '|'sadece bu yukarıdaki kodları değiştirilmiş, ... Yani:

C dilinde:

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

Çıktı:

Size of char : 1
Size of char : 4

C ++ dilinde:

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

Çıktı:

Size of char : 1
Size of char : 1

Neden sizeof('a')C ve C ++ 'da farklı değerler döndürür?


8
"%|"Biçim bir gerektiriyor intargüman (veya teşvik şey int). sizeoftür sonucu verir size_t. intBir döküm kullanmaya dönüştürün veya uygulamanız destekliyorsa kullanın "%zu".
Keith Thompson

Yanıtlar:


349

C'de, 4 gibi bir karakter sabitinin türü 'a'aslında int4'tür (veya uygulamaya bağlı başka bir değer). C ++ 'da, tür char1 boyutundadır. Bu, iki dil arasındaki birçok küçük farktan biridir.


12
C ++ Standardında bölüm 2.13.2 / 1, C 6.4.4.4'te, en azından sahip olduğum dokümanda.

14
+1 ("4 boyutu" açıkça nthrgeek'in platformu için geçerli olsa da, tüm platformlar için geçerli olmayabilir.)
sbi

28
@nthrgeek: Her iki standartları alıntı çok tembelim, ancak C ++ standardı C. Altında Ek C.1.1 olan uyumsuzluktan adanmış bir ek vardır, bu karakterin yazı tipi değiştirilir" olduğundan bahseder intiçin chardavranışını açıklıyor. :)
jalf

3
@nthrgeek: §6.4.4.4, paragraf 10: "Bir tamsayı karakter sabiti int türüne sahiptir. Tek baytlık yürütme karakterine eşlenen tek bir karakter içeren bir tamsayı karakter sabiti değeri, eşlenen temsili sayısal olarak gösterir karakter tamsayı olarak yorumlanır. "
Stephen Canon

7
@nthrgeek: Belirli bir nokta hakkında tartışmıyorsanız ve diğer kişinin neden farklı bir düşünceye sahip olduğunu anlamak istemiyorsanız standart bir referans istememelisiniz. Herkes kabul ederse kabul et. Siz (bir geliştirici olarak) bunun gibi ortak cevapları kendiniz hızlı bir şekilde bulabilecek kadar akıllı olmalısınız.
Martin York

26

Paul belirtildiği gibi, bunun nedeni 'a'bir olduğunu intC ama a'dachar C ++.

Birkaç yıl önce yazdığım bir şeyde C ve C ++ arasındaki bu farkı fark ediyorum: http://david.tribble.com/text/cdiffs.htm


4
Sadece merak ediyorum, ama bu (çok ayrıntılı) dokümanı C ++ 11 ve C11'deki yeni değişiklikleri içerecek şekilde güncellemek için mi çalışıyorsunuz?
Adam Rosenfield

Şu anda değil. C ve C ++ 'a olan ilgim son beş yılda çok azaldı.
David R Tribble

3
Ah, ben yazmaya işinizi kullanılan bu ve burada SO üzerinde bulunmaktadır. Ne kadar küçük bir dünya!

17

C de karakter değişmezlerinin türü C ++ ' da int ve char şeklindedir . Bu, fonksiyon aşırı yüklenmesini desteklemek için C ++ 'da gereklidir . Bu örneğe bakın:

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

Çıktı:

char

5

C dilinde , karakter değişmezi bir chartür değildir . C, karakter değişmezini tamsayı olarak görür. Yani, sizeof('a')ve arasında bir fark yoktur sizeof(1).

Yani, sizeof karakter değişmez değeri C'deki sizeof tamsayısına eşittir.

C ++ dilinde , karakter değişmezidir char. Cppreference diyelim en:

1) dar karakter değişmez değeri veya sıradan karakter değişmez değeri, örneğin 'a'veya '\n'veya '\13'. Böyle bir değişmezin türüchar ve değeri, yürütme karakter kümesinde c-char'ın temsiline eşittir. C-char, yürütme karakter kümesinde tek bir bayt olarak gösterilemiyorsa, değişmez değer int ve uygulama tanımlı değere sahiptir.

Yani, C ++ karakter değişmez bir tür char. yani, C ++ 'da karakter değişmezinin boyutu bir bayttır.

Alos, Programlarınızda sizeofoperatör için yanlış format belirleyici kullandınız .

C11 §7.21.6.1 (S9):

Bir dönüşüm belirtimi geçersizse, davranış tanımsızdır.275) Herhangi bir bağımsız değişken, karşılık gelen dönüşüm belirtimi için doğru tür değilse, davranış tanımsızdır.

Yani, %zubunun yerine biçim belirtecini kullanmalısınız %d, aksi takdirde C'de tanımlanmamış bir davranıştır.


%zubirçok platformda desteklenmez, ancak daha iyi taşınabilirlik, kullanım (int)sizeof(char)ve biçim%d
chqrlie

Karakter değişmezlerinin değeri mutlaka karşılık gelen ASCII kodu değildir. Kaynak ve yürütme karakter kümelerine ve chartürün varsayılan olarak imzalanıp imzalanmadığına bağlıdır.
chqrlie
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.