คำพูดเดี่ยวเทียบกับเครื่องหมายคำพูดคู่ใน C หรือ C ++


208

เมื่อใดที่ฉันควรใช้เครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่ในการเขียนโปรแกรม C หรือ C ++

คำตอบ:


282

ใน C และในเครื่องหมายอัญประกาศเดี่ยว C ++ ระบุอักขระเดียวในขณะที่อัญประกาศคู่สร้างตัวอักษรสตริง 'a'เป็นตัวอักษรตัวเดียวในขณะที่"a"เป็นตัวอักษรสตริงที่มี'a'และตัวสิ้นสุดโมฆะ (นั่นคือ 2 อาร์เรย์ถ่าน)

ใน C ++ ประเภทของตัวอักษรตัวอักษรคือcharแต่โปรดทราบว่าใน C ประเภทของตัวอักษรตัวอักษรคือintว่าsizeof 'a'เป็น 4 ในสถาปัตยกรรมที่ ints เป็น 32 บิต (และ CHAR_BIT เป็น 8) ในขณะที่sizeof(char)1 ทุกที่


47

คอมไพเลอร์บางตัวยังใช้ส่วนขยายที่อนุญาตค่าคงที่แบบหลายอักขระ มาตรฐาน C99 พูดว่า:

6.4.4.4p10: "ค่าของค่าคงที่จำนวนเต็มประกอบด้วยอักขระมากกว่าหนึ่งตัว (เช่น 'ab') หรือมีลำดับอักขระหรือลำดับการหลีกเลี่ยงที่ไม่ได้จับคู่กับอักขระการดำเนินการไบต์เดียวจะถูกกำหนดใช้งาน "

สิ่งนี้อาจมีลักษณะเช่นนี้ตัวอย่างเช่น:

const uint32_t png_ihdr = 'IHDR';

ค่าคงที่ที่เกิดขึ้น (ใน GCC ซึ่งใช้งานนี้) มีค่าที่คุณได้รับจากการใช้อักขระแต่ละตัวและเลื่อนขึ้นเพื่อให้ 'ฉัน' สิ้นสุดลงในบิตที่สำคัญที่สุดของค่า 32 บิต เห็นได้ชัดว่าคุณไม่ควรเชื่อถือสิ่งนี้หากคุณกำลังเขียนโค้ดอิสระของแพลตฟอร์ม


7
ขอบคุณฉันเพิ่งเห็นสิ่งนี้ในโค้ดบางส่วนและคำตอบของฉันสามารถอธิบายได้ว่า "WTF" เท่านั้น ฉันใช้ GCC เปิดและปิดเป็นเวลา 15 ปีและไม่เคยพบปัญหานี้มาก่อนจนกระทั่งตอนนี้
eeeeaaii

+1 นอกเหนือจากส่วนหัวเวทย์มักใช้สำหรับการประเมินบรรทัดคำสั่ง
Wolf

28

เครื่องหมายคำพูดเดี่ยวคืออักขระ ( char) เครื่องหมายคำพูดคู่เป็นสตริงที่สิ้นสุดด้วยค่า null ( char *)

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

8
"Hello World" const char *เป็น
OldSchool

@Eiko คุณใส่ * หน้าของตัวแปรเช่น * s ข้างต้นหรือไม่
CodeGuru

@CodeGuru คุณใช้ * เมื่อตัวแปรเป็นประเภทตัวชี้ ในกรณีนี้ให้ชี้ไปที่อาร์เรย์ของอักขระ
Eiko

16
  • 'x' เป็นจำนวนเต็มแทนค่าตัวเลขของตัวอักษร x ในชุดอักขระของเครื่อง
  • "x"คืออาร์เรย์ของอักขระยาวสองอักขระประกอบด้วย‘x’ตามด้วย‘\0’

2
ค่อนข้างช้า;) มีอะไรใหม่ในคำตอบของคุณ - เปรียบเทียบกับคำตอบที่ได้รับไปแล้ว?
Wolf

10

เครื่องหมายคำพูดเดี่ยวใช้สำหรับอักขระเดี่ยว เครื่องหมายคำพูดคู่ใช้สำหรับสตริง (อาเรย์ของอักขระ) คุณสามารถใช้อัญประกาศเดียวเพื่อสร้างสตริงหนึ่งตัวอักษรในแต่ละครั้งหากคุณต้องการ

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

10

ฉันแหย่สิ่งต่าง ๆ เช่น: int cc = 'cc'; มันเกิดขึ้นว่าโดยทั่วไปแล้วมันเป็นสำเนาแบบไบต์ไปยังจำนวนเต็ม ดังนั้นวิธีที่จะดูคือ 'ซีซี' ซึ่งโดยทั่วไปแล้ว 2 ซีจะถูกคัดลอกไปที่ 2 ไบต์ล่างของซีซีจำนวนเต็ม หากคุณกำลังมองหาเรื่องไม่สำคัญแล้ว

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

99 25443

นั่นเป็นเพราะ 25443 = 99 + 256 * 99

ดังนั้น 'cc' คือค่าคงที่แบบหลายตัวละครไม่ใช่สตริง

ไชโย



6

เครื่องหมายคำพูดคู่ใช้สำหรับตัวอักษรสตริงเช่น:

char str[] = "Hello world";

เครื่องหมายคำพูดเดี่ยวสำหรับตัวอักษรตัวเดียวเช่น:

char c = 'x';

แก้ไขintขณะที่เดวิดที่ระบุไว้ในคำตอบอื่นประเภทของตัวอักษรตัวอักษรเป็น


ขอบคุณ หมายถึงตัวละครคือ 1 ไบต์ไม่มีตัวอักษร null '/ 0'at ที่สิ้นสุด .. สตริงที่มีตัวละคร null ที่สิ้นสุด
Vishwanath Dalvi

2
@mr_eclair: ตัวอักษรสตริงจะมี terminator null โดยนัยเสมอ แต่ต้องระวัง คุณสามารถเขียนสิ่งที่ชอบchar str[] = {'H','e','l','l','o'};และstrจะไม่มีตัวสิ้นสุด null
Oliver Charlesworth

ในสถานการณ์strนั้นไม่ใช่สตริง (อย่างน้อยไม่ใช่สตริง C-style ซึ่งถูกกำหนดให้เป็น NTBS)
Steve Jessop

@Steve: เข้าใจ จุดของฉันไปที่ @mr_eclair คือไม่ใช่ทุกอย่างที่char[](ซึ่งคนมักจะเป็น "สตริง") ถูกยกเลิกด้วยค่า null
Oliver Charlesworth

1
@OliCharlesworth นี่คือ - โชคดี - ไม่จริงทั้งหมดเหล่านี้เป็นสอง"hello" /*seamlessly connected to*/ "world"สายอักขระตัวอักษรแยกจากกันโดยไม่มีความคิดเห็น: และสิ่งนี้สมเหตุสมผลสำหรับข้อความหลายบรรทัดที่ถูกคอมเม้นต์
Wolf

6

ในเครื่องหมายอัญประกาศเดี่ยว C เช่น 'a' แสดงถึงค่าคงที่ของอักขระในขณะที่ "a" เป็นอาร์เรย์ของอักขระสิ้นสุดด้วยอักขระ 0 เสมอ


4

ใช้เครื่องหมายคำพูดเดี่ยวสำหรับอักขระในขณะที่เครื่องหมายคำพูดคู่ใช้สำหรับสตริง

ตัวอย่างเช่น..

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

เอาท์พุต

สวัสดีชาวโลก

หากคุณใช้สิ่งเหล่านี้ในทางกลับกันและใช้เครื่องหมายคำพูดเดี่ยวสำหรับสตริงและเครื่องหมายคำพูดคู่สำหรับอักขระ นี่จะเป็นผลลัพธ์

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

ผลลัพธ์:

สำหรับบรรทัดแรกคุณจะมีค่าขยะหรือไม่คาดคิดหรือคุณอาจมีผลลัพธ์เช่นนี้ ..

ในขณะที่คำสั่งที่สอง คุณจะไม่เห็นอะไรเลย อีกอย่างหนึ่ง หากคุณมีคำสั่งเพิ่มเติมหลังจากนี้ พวกเขาจะไม่ให้ผลลัพธ์กับคุณ

หมายเหตุ: ภาษา PHP ให้ความยืดหยุ่นในการใช้เครื่องหมายคำพูดเดี่ยวและคู่ได้อย่างง่ายดาย


3

เครื่องหมายคำพูดเดี่ยวหมายถึงถ่าน, แสดงว่าเป็นสตริง

ในจาวาก็มีเหมือนกัน


2
สิ่งนี้ไม่ได้เพิ่มคุณค่าใด ๆ ให้กับคำถามเนื่องจากข้อมูลนี้ได้ถูกรวมไว้ในคำตอบอื่น ๆ แล้ว
Mike Precup

2

ใช้เครื่องหมายคำพูดเดี่ยวกับอักขระเดี่ยวเป็น:

char ch = 'a';

นี่'a'คือค่าคงที่ถ่านและเท่ากับASCIIมูลค่าของถ่าน a

ใช้เครื่องหมายคำพูดคู่กับสตริงเป็น:

char str[] = "foo";

นี่"foo"คือตัวอักษรสตริง

มันใช้ได้ดี"a"แต่ก็ไม่โอเคที่จะใช้ 'foo'

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