C veya C ++ 'da tek tırnak veya çift tırnak


Yanıtlar:


282

C ve C ++ 'da tek tırnaklar tek bir karakteri tanımlar, çift tırnaklar ise bir dizgi hazır bilgisi oluşturur. 'a'tek bir karakter değişmezidir, "a"bir 'a've bir boş sonlandırıcıyı içeren bir dize değişmezidir (2 karakter dizisidir).

C ++ 'da bir karakter değişmezinin türü char, ancak C'de, bir karakter değişmezinin türünün int, yani sizeof 'a'ints 32bit (ve CHAR_BIT 8) olan bir mimaride 4, sizeof(char)her yerde 1 olduğunu unutmayın.


47

Bazı derleyiciler ayrıca çok karakterli sabitlere izin veren bir uzantı uygular. C99 standardı şunları söylüyor:

6.4.4.4p10: "Birden fazla karakter içeren (örn., 'Ab') veya tek baytlık yürütme karakteriyle eşleşmeyen bir karakter veya kaçış dizisi içeren bir tamsayı karakter sabitinin değeri, uygulama tanımlıdır. "

Bu şöyle görünebilir, örneğin:

const uint32_t png_ihdr = 'IHDR';

Ortaya çıkan sabit (bunu uygulayan GCC'de), her karakteri alarak ve yukarı kaydırarak elde ettiğiniz değere sahiptir, böylece 'I', 32 bit değerin en önemli bitlerinde sonuçlanır. Açıkçası, platformdan bağımsız kod yazıyorsanız buna güvenmemelisiniz.


7
Teşekkürler, ben sadece bazı kodda gördüm ve benim yanıt sadece "WTF" olarak tarif edilebilir. GCC'yi 15 yıldır açık ve kapalı kullanıyorum ve şimdiye kadar hiç bir zaman bununla karşılaşmadım.
eeeeaaii

Komut satırı değerlendirmesi için kullanılan sihirli başlıkların yanı sıra +1.
Kurt

28

Tek tırnaklar karakterler ( char), çift tırnaklar ise boş sonlandırılmış dizelerdir ( char *).

char c = 'x';
char *s = "Hello World";

8
"merhaba dünya" dır const char *.
OldSchool

@Eiko yukarıdaki gibi bir * değişkeninin önüne ne zaman koyarsınız?
CodeGuru

@CodeGuru Değişken bir işaretçi türü olduğunda * kullanırsınız. Bu durumda, 's' bir karakter dizisini gösterir.
Eiko

16
  • 'x' , makinenin karakter kümesindeki x harfinin sayısal değerini temsil eden bir tam sayıdır
  • "x"karakter, bir dizi oluşan iki karakter uzunluğunda ‘x’ve ardından‘\0’

2
Oldukça geç;) Cevabınızda gerçekten yeni olan - zaten verilenlerle karşılaştırıldığında?
Kurt

10

Tek tırnak işaretleri tek bir karakter içindir. Çift tırnak işaretleri bir dize (karakter dizisi) içindir. İsterseniz, her seferinde bir karakter dizesi oluşturmak için tek tırnak kullanabilirsiniz.

char myChar     = 'A';
char myString[] = "Hello Mum";
char myOtherString[] = { 'H','e','l','l','o','\0' };

10

Ben gibi şeyler etrafında alay edildi: int cc = 'cc'; Temelde bir tamsayının bayt-bilge kopyasıdır. Dolayısıyla bakmanın yolu, temelde 2 c olan 'cc'nin cc tamsayısının daha düşük 2 baytına kopyalanmasıdır. Bir trivia arıyorsanız, o zaman

printf("%d %d", 'c', 'cc'); would give:

99 25443

çünkü 25443 = 99 + 256 * 99

Yani 'cc' çok karakterli bir sabittir ve bir dize değildir .

Şerefe


8
  1. single quoteiçindir character;
  2. double quoteiçindir string.

6

Çift tırnak işaretleri dizgi değişmezleri içindir, örneğin:

char str[] = "Hello world";

Tek tırnak işaretleri tek karakter değişmezleri içindir, örneğin:

char c = 'x';

DÜZENLEME David'in başka bir cevapta belirttiği gibi, bir karakter değişmezinin türü int.


Teşekkürler . karakter sonunda "/ 0" null karakteri olmayan 1 byte demektir .. dize sonunda null karakter içerir.
Vishwanath Dalvi

2
@mr_eclair: Bir dize hazır bilgisi her zaman örtük bir boş sonlandırıcı içerir, ancak dikkatli olun. Gibi bir şey yazabilirsiniz char str[] = {'H','e','l','l','o'};ve strolurdu değil boş terminatör var.
Oliver Charlesworth

bu durumda strbir dize değildir (en azından NTBS olarak tanımlanan bir C stili dize değil).
Steve Jessop

@Steve: Anlaşıldı. Mr_eclair için benim açımdan char[](ki genellikle "dizeleri" olarak insanlar) olan her şey null sonlandırıldı değildi.
Oliver Charlesworth

1
@OliCharlesworth bu - Neyse - değil tam gerçek: bunlar iki dize hazır bir açıklama ile ayrılmış: "hello" /*seamlessly connected to*/ "world". Ve bu, çok satırlı yorumlanmış mesajlar için anlamlı olabilir.
Kurt

6

C'de 'a' gibi tek tırnak işaretleri karakter sabitlerini belirtirken, "a" her zaman 0 karakteriyle sonlandırılmış bir karakter dizisidir


4

Karakter için tek tırnak, dize için çift tırnak kullanılır.

Örneğin..

 printf("%c \n",'a');
 printf("%s","Hello World");

Çıktı

bir Merhaba Dünya

Bunları tersi durumda ve dize için tek tırnak ve karakter için çift tırnak kullandıysanız. İşte bu sonuç olacak;

  printf("%c \n","a");
  printf("%s",'Hello World');

çıktı :

ilk satır için. çöp değeri veya beklenmedik olacak. ya da böyle çıktı olabilir.

ikinci ifade için. Hiçbir şey görmeyeceksin. Bir şey daha var. Bundan sonra daha fazla ifade varsa. Ayrıca size sonuç vermeyeceklerdir.

Not: PHP dili, tek ve çift alıntıları kolayca kullanma esnekliği sağlar.


3

Tek tırnak işaretleri bir karakteri, çift bir dizeyi belirtir.

Java'da da aynıdır.


2
Bu, soruya gerçekten bir değer katmaz, çünkü bu bilgi diğer cevaplarda zaten yer almaktadır.
Mike Precup

2

Tek karakterle tek tırnak kullanın:

char ch = 'a';

burada 'a'bir char sabiti ve ASCIIchar a değerine eşittir .

Aşağıdaki gibi dizelerle çift tırnak kullanın:

char str[] = "foo";

işte "foo"bir dizgi değişmezi.

Kullanmak iyi "a"ama kullanmak iyi değil 'foo'

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.