2011-09-28 90 views

Trả lời

22

Ký hiệu dấu chéo ngược trong ký tự chữ cho phép bạn chỉ định giá trị số của ký tự thay vì sử dụng ký tự. Vì vậy, '\1' [*] có nghĩa là "ký tự có giá trị số là 1", '\2' có nghĩa là "ký tự có giá trị số là 2", v.v. Do một dấu ngoặc kép của C, các ký tự chữ số thực tế có loại int và thực sự là int được sử dụng để xử lý các ký tự trong các ngữ cảnh khác, chẳng hạn như giá trị trả lại là fgetc. Vì vậy, '\1' có nghĩa là "giá trị số dưới dạng int, của ký tự có giá trị số là 1", v.v.

Kể từ khi nhân vật giá trị số trong C, "nhân vật có số giá trị là 1" thực sự (char)1, và trang trí thêm trong '\1' không ảnh hưởng đến trình biên dịch - '\1' có cùng loại và giá trị như 1 trong C. Vì vậy, các ký hiệu dấu chéo ngược là cần thiết hơn trong chuỗi ký tự hơn là trong các ký tự chữ, để chèn các ký tự không thể in mà không có mã thoát riêng của chúng.

Cá nhân, tôi thích viết 0 khi tôi muốn nói 0 và cho phép chuyển đổi ngầm thực hiện công việc của họ. Một số người thấy rằng rất khó hiểu. Khi làm việc với những người đó, bạn nên viết '\0' khi bạn ngụ ý một ký tự có giá trị 0, nghĩa là trong trường hợp bạn mong đợi 0 sẽ sớm chuyển đổi hoàn toàn thành loại char. Tương tự, nó có thể giúp viết NULL khi bạn có nghĩa là hằng số con trỏ null, 0.0 khi bạn muốn nói giá trị gấp đôi có giá trị 0, v.v.

Cho dù nó có tạo ra sự khác biệt nào cho trình biên dịch hay không và liệu nó có cần dàn diễn viên hay không, phụ thuộc vào ngữ cảnh. Vì '\0' có cùng loại và giá trị giống như 0, cần phải được đúc thành char trong cùng một trường hợp.Vì vậy, '\0'(char)0 khác nhau về loại, cho các biểu thức chính xác tương đương, bạn có thể xem xét (char)'\0' so với (char)0 hoặc '\0' so với 0. NULL có kiểu thực hiện được xác định - đôi khi nó cần phải được đúc thành kiểu con trỏ, vì nó có thể có kiểu số nguyên. 0.0 có loại double, vì vậy chắc chắn khác với 0. Tuy nhiên, float f = 1.0; giống hệt với float f = 1;float f = 1.0f, trong khi 1.0/i, trong đó i là một int, thường có giá trị khác nhau từ 1/i.

Vì vậy, bất kỳ quy tắc chung nào có sử dụng '\0' hoặc 0 hoàn toàn là sự tiện lợi của người đọc mã của bạn - tất cả đều giống với trình biên dịch. Chọn bất cứ điều gì bạn (và các đồng nghiệp của bạn) thích giao diện, hoặc có lẽ xác định một macro ASCII_NUL.

[*] hoặc '\01' - kể từ khi xuyệc ngược giới thiệu một số bát phân, không thập phân, đôi khi khôn ngoan để làm cho điều này rõ ràng hơn một chút bằng cách đảm bảo nó bắt đầu với một 0. Làm cho có sự khác biệt cho 0, 1, 2 tất nhiên. Tôi nói "đôi khi", bởi vì dấu gạch chéo ngược chỉ có thể được theo sau bởi 3 chữ số bát phân, do đó bạn không thể viết \0101 thay vì \101, để nhắc người đọc biết rằng đó là giá trị bát phân. Đó là tất cả khá khó xử, và dẫn đến trang trí nhiều hơn: \x41 cho một vốn A, và do đó bạn có thể viết '\x0' cho 0 nếu bạn muốn.

25

Cả hai đều là 0, nhưng (char) 0 là một char, trong khi '\0' là (vô tình) là int. Sự khác biệt loại này thường không ảnh hưởng đến chương trình của bạn nếu giá trị là 0.

Tôi thích '\0', vì đó là hằng số dành cho điều đó.

+0

Tôi phóng to - khi bạn sử dụng để truyền, tôi nghĩ bạn nên có ít nhất một suy nghĩ khác về vấn đề này. Tại sao so sánh Apple với Orange? –

+7

Anh ấy không cần phải bỏ. Tôi tin rằng 'char c = 0;' là hợp pháp, và nó biên dịch trên gcc với '-Wextra -pedantic'. Tôi chỉ nghĩ rằng '' \ 0'' thể hiện rõ hơn ý định. –

+0

Tôi đã cắt xén chuỗi như một phần của mã của tôi. Vì vậy, trong khi thêm nhân vật null ở phần mà tôi phải kết thúc nó tôi đã có một sự nhầm lẫn như là đại diện tốt hơn. – Sathya

2

Zero có thể có nghĩa là rất nhiều thứ khác nhau trong C. Bạn nên sử dụng ký tự null '\ 0', bởi vì sau đó không có sự nhầm lẫn nào về ý định của bạn là chấm dứt chuỗi.

Nếu bạn đặt char thành 0, điều đó có nghĩa là chấm dứt null, nhưng điều đó cũng có nghĩa là bạn chỉ sử dụng char làm số nguyên 8 bit để tính toán, thay vì là một phần của chuỗi. Điều này có thể bị nhầm lẫn hơn nếu bạn cũng đang sử dụng con trỏ trong cùng một mã và so sánh chúng với số không, mà sau đó là một con trỏ null.

+0

Ok cảm ơn !! tôi sẽ sử dụng '\ 0' rồi! – Sathya

+0

Rất tiếc, tôi đã vô tình bỏ qua điều này (vấp ngã bằng ngón tay). Quá muộn để sửa chữa nó, nhưng nếu bạn thực hiện một chỉnh sửa tôi có thể loại bỏ các downvote. –

+0

Umm ok ... chỉnh sửa ngẫu nhiên được thực hiện. – Lundin

-1

Character mảng có nghĩa là Bạn đang dùng Chuỗi vì vậy tôi khuyên bạn nên sử dụng '\0' ở phần cuối của nhân vật Mảng sau khi đọc tất cả các nhân vật từ người dùng vì 0 là nhân vật đơn giản nhưng '\0'NULL mà chỉ kết thúc chuỗi.

+0

'(char) 0' và' '\ 0'' có cùng giá trị, nhưng '' \ 0'' được sử dụng nhiều nhất, vì đây là' char' dành cho ký tự null. – chema989

Các vấn đề liên quan