Kutipan tunggal vs kutipan ganda dalam C atau C ++

208

Kapan saya harus menggunakan tanda kutip tunggal dan tanda kutip ganda dalam pemrograman C atau C ++?

Vishwanath Dalvi
sumber

Jawaban:

282

Di C dan di C ++ tanda kutip tunggal mengidentifikasi karakter tunggal, sedangkan tanda kutip ganda membuat string literal. 'a'adalah sebuah karakter literal tunggal, sedangkan "a"string literal berisi sebuah 'a'dan terminator nol (yaitu array 2 char).

Dalam C ++ tipe karakter literal adalah char, tetapi perhatikan bahwa dalam C, tipe karakter literal adalah int, yaitu sizeof 'a'4 dalam arsitektur di mana ints adalah 32bit (dan CHAR_BIT adalah 8), sedangkan sizeof(char)1 di mana-mana.

David Rodríguez - dribeas
sumber
47

Beberapa kompiler juga mengimplementasikan ekstensi, yang memungkinkan konstanta multi-karakter. Standar C99 mengatakan:

6.4.4.4p10: "Nilai konstanta karakter integer yang mengandung lebih dari satu karakter (misalnya, 'ab'), atau mengandung karakter atau urutan pelarian yang tidak memetakan ke karakter eksekusi byte tunggal, ditentukan oleh implementasi. "

Ini bisa terlihat seperti ini, misalnya:

const uint32_t png_ihdr = 'IHDR';

Konstanta yang dihasilkan (dalam GCC, yang mengimplementasikan ini) memiliki nilai yang Anda dapatkan dengan mengambil setiap karakter dan menggesernya, sehingga 'I' berakhir di bit paling signifikan dari nilai 32-bit. Jelas, Anda tidak harus bergantung pada ini jika Anda menulis kode independen platform.

beristirahat
sumber
7
Terima kasih, saya baru saja melihat ini dalam beberapa kode dan respons saya hanya dapat digambarkan sebagai "WTF". Saya telah menggunakan dan mematikan GCC selama 15 tahun dan tidak pernah mengalami hal ini sampai sekarang.
eeeeaaii
+1 selain tajuk ajaib, sering digunakan untuk evaluasi baris perintah.
Wolf
28

Kutipan tunggal adalah karakter ( char), kutipan ganda adalah string yang diakhiri dengan null ( char *).

char c = 'x';
char *s = "Hello World";
Eiko
sumber
8
"Halo dunia" adalah a const char *.
OldSchool
@ Eiko kapan Anda meletakkan * infront dari variabel misalnya * s seperti di atas?
CodeGuru
@ KodeGuru Anda menggunakan * ketika variabel adalah tipe pointer. Dalam hal ini, 's' menunjuk ke array karakter.
Eiko
16
  • 'x' adalah bilangan bulat, mewakili nilai numerik huruf x dalam rangkaian karakter mesin
  • "x"adalah array karakter, panjang dua karakter, terdiri dari ‘x’diikuti oleh‘\0’
martynas
sumber
2
Cukup terlambat;) apa yang benar-benar baru dalam jawaban Anda - dibandingkan dengan yang sudah diberikan?
Wolf
10

Kutipan tunggal adalah untuk satu karakter. Kutipan ganda untuk string (array karakter). Anda dapat menggunakan tanda kutip tunggal untuk membangun karakter string satu per satu, jika Anda mau.

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

Saya mencari-cari hal-hal seperti: int cc = 'cc'; Itu terjadi pada dasarnya salinan byte-bijaksana untuk integer. Maka cara untuk melihatnya adalah bahwa 'cc' yang pada dasarnya adalah 2 c disalin ke 2 byte lebih rendah dari integer cc. Jika Anda mencari hal-hal sepele, maka

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

99 25443

itu karena 25443 = 99 + 256 * 99

Jadi 'cc' adalah konstanta multi-karakter dan bukan string.

Bersulang

sanket
sumber
8
  1. single quoteadalah untuk character;
  2. double quoteadalah untuk string.
bygreencn
sumber
6

Kutipan ganda untuk string literal, misalnya:

char str[] = "Hello world";

Kutipan tunggal untuk literal karakter tunggal, misalnya:

char c = 'x';

Sunting Seperti yang dinyatakan David dalam jawaban lain, tipe karakter literal adalah int.

Oliver Charlesworth
sumber
terima kasih. berarti karakter adalah 1 byte tanpa karakter nol '/ 0' di akhir .. string berisi karakter nol di akhir.
Vishwanath Dalvi
2
@ mr_eclair: String literal selalu berisi terminator null implisit, tapi hati-hati. Anda dapat menulis sesuatu seperti char str[] = {'H','e','l','l','o'};, dan tidakstr akan memiliki terminator nol.
Oliver Charlesworth
dalam situasi itu, strbukan string (setidaknya, bukan string gaya-C, yang didefinisikan sebagai NTBS).
Steve Jessop
@Steve: Dipahami. Maksud saya ke @mr_eclair adalah bahwa tidak semua yang merupakan char[](yang orang sering anggap sebagai "string") diakhiri dengan null.
Oliver Charlesworth
1
@OliCharlesworth ini - untungnya - tidak kebenaran penuh: ini adalah dua string literal dipisahkan oleh komentar: "hello" /*seamlessly connected to*/ "world". Dan ini masuk akal untuk pesan multi-line yang dikomentari.
Wolf
6

Dalam C tanda kutip tunggal seperti 'a' menunjukkan konstanta karakter sedangkan "a" adalah array karakter, selalu diakhiri dengan 0 karakter

Jens Gustedt
sumber
4

Kutipan tunggal digunakan untuk karakter, sedangkan kutipan ganda digunakan untuk string.

Sebagai contoh..

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

Keluaran

Hello World

Jika Anda menggunakan ini dalam kasus sebaliknya dan menggunakan kutipan tunggal untuk string dan kutipan ganda untuk karakter. Di sini, ini akan menjadi hasil;

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

keluaran:

untuk baris pertama. Anda akan memiliki nilai sampah atau tidak terduga. Atau Anda mungkin memiliki output seperti ini ..

sedangkan untuk pernyataan kedua. Anda tidak akan melihat apa pun. Satu hal lagi. Jika Anda memiliki lebih banyak pernyataan setelah ini. Mereka juga tidak akan memberi Anda hasil.

Catatan: Bahasa PHP memberi Anda fleksibilitas untuk menggunakan penawaran tunggal dan ganda dengan mudah.

Hafiz Shehbaz Ali
sumber
3

Kutipan tunggal menunjukkan char, double menunjukkan string.

Di Jawa juga sama.

adiggo
sumber
2
Ini tidak benar-benar menambah nilai pada pertanyaan, karena informasi ini telah dicakup dalam jawaban lain.
Mike Precup
2

Gunakan kutipan tunggal dengan char tunggal sebagai:

char ch = 'a';

di sini 'a'adalah konstanta char dan sama dengan ASCIInilai char a.

Gunakan penawaran ganda dengan string sebagai:

char str[] = "foo";

di sini "foo"adalah string literal.

Tidak apa-apa untuk digunakan "a"tetapi tidak apa-apa untuk digunakan 'foo'

codaddict
sumber