Dấu ngoặc đơn so với dấu ngoặc kép trong C hoặc C ++


Câu trả lời:


282

Trong C và trong C ++, các trích dẫn đơn xác định một ký tự đơn, trong khi các trích dẫn kép tạo ra một chuỗi ký tự. 'a'là một ký tự đơn, trong khi đó "a"là một chuỗi ký tự chứa một 'a'và một bộ kết thúc null (đó là một mảng 2 char).

Trong C ++ loại một chữ nhân vật là char, nhưng lưu ý rằng trong C, loại một chữ nhân vật là int, đó là sizeof 'a'là 4 trong một kiến trúc nơi ints là 32bit (và CHAR_BIT là 8), trong khi sizeof(char)là 1 ở khắp mọi nơi.


47

Một số trình biên dịch cũng thực hiện một phần mở rộng, cho phép các hằng số nhiều ký tự. Tiêu chuẩn C99 cho biết:

6.4.4.4p10: "Giá trị của hằng số ký tự nguyên chứa nhiều hơn một ký tự (ví dụ: 'ab') hoặc chứa một ký tự hoặc chuỗi thoát không ánh xạ tới ký tự thực thi một byte, được xác định theo thực thi. "

Điều này có thể trông như thế này, ví dụ:

const uint32_t png_ihdr = 'IHDR';

Hằng số kết quả (trong GCC, thực hiện điều này) có giá trị bạn nhận được bằng cách lấy từng ký tự và dịch chuyển nó lên, sao cho 'I' kết thúc bằng các bit quan trọng nhất của giá trị 32 bit. Rõ ràng, bạn không nên dựa vào điều này nếu bạn đang viết mã độc lập với nền tảng.


7
Cảm ơn, tôi chỉ thấy điều này trong một số mã và phản hồi của tôi chỉ có thể được mô tả là "WTF". Tôi đã sử dụng GCC trong 15 năm và chưa bao giờ gặp phải vấn đề này cho đến bây giờ.
eeeeaaii

+1 bên cạnh các tiêu đề ma thuật, thường được sử dụng để đánh giá dòng lệnh.
Sói

28

Dấu ngoặc đơn là ký tự ( char), dấu ngoặc kép là chuỗi kết thúc null ( char *).

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

8
"xin chào thế giới" là một const char *.
OldSchool 12/2/2015

@Eiko khi nào bạn đặt * trước một biến, ví dụ * s như trên?
CodeGuru

@CodeGuru Bạn sử dụng dấu * khi biến là loại con trỏ. Trong trường hợp này, 's' trỏ đến một mảng các ký tự.
Eiko

16
  • 'x' là một số nguyên, biểu thị giá trị số của chữ x trong bộ ký tự của máy
  • "x"là một mảng các ký tự, dài hai ký tự, bao gồm ‘x’theo sau bởi‘\0’

2
Khá muộn;) điều gì thực sự mới trong câu trả lời của bạn - so với những câu đã được đưa ra?
Sói

10

Dấu ngoặc đơn là cho một ký tự duy nhất. Dấu ngoặc kép là cho một chuỗi (mảng ký tự). Bạn có thể sử dụng dấu ngoặc đơn để xây dựng một chuỗi ký tự một lần, nếu bạn muốn.

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

10

Tôi đã chọc vào những thứ như: int cc = 'cc'; Nó xảy ra rằng về cơ bản nó là một bản sao byte khôn ngoan thành một số nguyên. Do đó, cách để xem xét đó là 'cc', về cơ bản là 2 c được sao chép xuống 2 byte của số nguyên cc. Nếu bạn đang tìm kiếm một câu đố, sau đó

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

99 25443

đó là vì 25443 = 99 + 256 * 99

Vì vậy, 'cc' là hằng số đa ký tự và không phải là một chuỗi.

Chúc mừng



6

Dấu ngoặc kép dành cho chuỗi ký tự, ví dụ:

char str[] = "Hello world";

Dấu ngoặc đơn là dành cho các ký tự đơn, ví dụ:

char c = 'x';

EDIT Như David đã nói trong một câu trả lời khác, loại chữ của một nhân vật là int.


cảm ơn . có nghĩa là ký tự là 1 byte không có ký tự null '/ 0' ở cuối .. chuỗi chứa ký tự null ở cuối.
Vishwanath Dalvi

2
@mr_eclair: Một chuỗi ký tự luôn chứa một dấu kết thúc null ẩn, nhưng hãy cẩn thận. Bạn có thể viết một cái gì đó như char str[] = {'H','e','l','l','o'};, và strsẽ không có một terminator null.
Oliver Charlesworth

trong tình huống đó, strkhông phải là một chuỗi (ít nhất, không phải là chuỗi kiểu C, được xác định là NTBS).
Steve Jessop

@Steve: Đã hiểu. Quan điểm của tôi đối với @mr_eclair là không phải mọi thứ mà char[](mọi người thường gọi là "chuỗi") đều bị chấm dứt.
Oliver Charlesworth

1
@OliCharlesworth đây là - may mắn thay - không phải sự thật đầy đủ: đây là hai chuỗi ký tự được phân tách bằng một nhận xét : "hello" /*seamlessly connected to*/ "world". Và điều này có thể có ý nghĩa cho các tin nhắn nhiều dòng nhận xét.
Sói

6

Trong C, các dấu ngoặc đơn như 'a' chỉ ra các hằng ký tự trong khi "a" là một mảng các ký tự, luôn được kết thúc bằng 0 ký tự


4

Trích dẫn đơn được sử dụng cho ký tự, trong khi trích dẫn kép được sử dụng cho chuỗi.

Ví dụ..

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

Đầu ra

một thế giới xin chào

Nếu bạn đã sử dụng chúng trong trường hợp ngược lại và sử dụng trích dẫn đơn cho chuỗi và trích dẫn kép cho ký tự. Ở đây, đây sẽ là kết quả;

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

đầu ra:

cho dòng đầu tiên. Bạn sẽ có giá trị rác hoặc bất ngờ. Hoặc bạn có thể có đầu ra như thế này ..

trong khi cho tuyên bố thứ hai. Bạn sẽ không thấy gì cả. Một điều nữa. Nếu bạn có thêm tuyên bố sau này. Họ cũng sẽ không cho bạn kết quả.

Lưu ý: Ngôn ngữ PHP cho phép bạn linh hoạt sử dụng trích dẫn đơn và kép một cách dễ dàng.


3

Dấu ngoặc đơn là biểu thị một char, gấp đôi biểu thị một chuỗi.

Trong Java, nó cũng giống nhau.


2
Điều này thực sự không thêm bất kỳ giá trị nào cho câu hỏi, vì thông tin này đã được bao gồm trong các câu trả lời khác.
Mike Precup

2

Sử dụng trích dẫn đơn với char duy nhất là:

char ch = 'a';

đây 'a'là hằng số char và bằngASCII giá trị của char a.

Sử dụng trích dẫn kép với chuỗi như:

char str[] = "foo";

đây "foo" là một chuỗi chữ.

Nó ổn để sử dụng "a"nhưng nó không ổn để sử dụng 'foo'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.