2013-08-24 71 views
10

Nếu Tôi tuyên bố này:ký tự chữ trong C: có phải là int hay char không?

int i = 0 + 'A'; 

được 'A' coi char hoặc int?

một số người có thể sử dụng:

int i = 0 + (int)'A'; 

nhưng điều này thực sự cần thiết?

+6

Sau này không cần thiết. ký tự chữ cái thuộc loại 'int'. – WhozCraig

+2

Ngay cả khi ''A'' thuộc loại' char', thì dàn diễn viên sẽ không có tác dụng trên tất cả trừ các nền tảng kỳ lạ nhất. Để chính xác, nếu ''A'' là một kiểu char đã ký (hoặc' signed char' hoặc 'char' khi nó được ký), thì không bao giờ có bất kỳ sự khác biệt nào, và nếu' A' là một kiểu 'char' chưa ký (hoặc 'unsigned char' hoặc' char' khi nó được unsigned), sau đó 'int' và' char' sẽ có cùng kích thước cho một sự khác biệt để được hiển thị. –

+0

'0 +' là gì? Ngay cả trong '0 + 'A'' nó phục vụ không có mục đích và thậm chí ít hơn :) trong' 0 + (int)' A''. –

Trả lời

13

Trong C, các hằng số ký tự như 'A' thuộc loại int. Trong C++, chúng thuộc loại char.

Trong C, loại hằng số ký tự hiếm khi quan trọng. Nó được đảm bảo là int, nhưng nếu ngôn ngữ đã được thay đổi để làm cho nó char, hầu hết mã hiện tại sẽ tiếp tục hoạt động bình thường. (Mã rõ ràng đề cập đến sizeof 'A' sẽ thay đổi hành vi, nhưng không có nhiều điểm bằng văn bản trừ khi bạn đang cố gắng phân biệt giữa C và C++ và có những cách tốt hơn và đáng tin cậy hơn để thực hiện điều đó. có thể là hợp lý, tôi sẽ không đi vào chi tiết tại đây)

trong mẫu mã của bạn:

int i = 0 + 'A'; 

0 là loại int, và cả hai toán hạng của + được thúc đẩy, nếu cần thiết, để a. loại thông thường, vì vậy hành vi cũng giống hệt nhau. Ngay cả điều này:

char A = 'A'; 
int i = 0 + A; 

làm điều tương tự, với A (mà loại char) được thăng int. Biểu thức của loại char thường, nhưng không phải lúc nào, được quảng bá hoàn toàn đến int.

Trong C++, các hằng số ký tự thuộc loại char - nhưng áp dụng cùng một quy tắc quảng cáo. Khi Stroustrup thiết kế C++, ông đã thay đổi kiểu hằng số ký tự cho sự nhất quán (nó được thừa nhận một chút đáng ngạc nhiên là A là loại int), và để cho phép quá tải nhất quán (mà C không hỗ trợ). Ví dụ, nếu C++ nhân vật hằng là loại int, thì đây:

std::cout << 'A'; 

sẽ in 65, giá trị ASCII của 'A' (trừ khi hệ thống sử dụng EBCDIC); nó có ý nghĩa hơn cho nó để in A.

int i = 0 + (int)'A'; 

Không cần thiết trong cả C và C++. Trong C, 'A' đã thuộc loại int, do đó chuyển đổi không có hiệu lực. Trong C++, nó thuộc loại char, nhưng không có diễn viên, nó sẽ được chuyển đổi hoàn toàn thành int.

Trong cả C và C++, phôi phải được xem với sự nghi ngờ. Cả hai ngôn ngữ đều cung cấp chuyển đổi tiềm ẩn trong nhiều ngữ cảnh và các chuyển đổi đó thường là làm điều đúng. Một diễn viên rõ ràng ghi đè chuyển đổi tiềm ẩn hoặc tạo một chuyển đổi sẽ không diễn ra. Trong nhiều trường hợp (nhưng không có nghĩa là tất cả), một diễn viên cho biết một vấn đề được giải quyết tốt hơn bằng cách sử dụng chuyển đổi ngầm được cung cấp bởi ngôn ngữ hoặc bằng cách thay đổi một khai báo để điều được chuyển đổi là đúng loại ngay từ đầu.

(Như Pascal Cuoq nhắc nhở tôi trong ý kiến, nếu đồng bằng char là unsigned rộng như int, sau đó là một biểu hiện của loại char sẽ được thăng unsigned int, không int. Điều này có thể xảy ra chỉ khi CHAR_BIT >= 16, tức là , nếu thực hiện có 16-bit hoặc byte lớn hơn, nếu sizeof (int) == 1, nếu đồng bằng char là unsigned. tôi không chắc chắn rằng bất kỳ hiện thực như vậy thực sự tồn tại, mặc dù tôi hiểu rằng trình biên dịch C cho một số DSPs làm có CHAR_BIT > 8.)

+1

Tham chiếu của bạn là gì? Vì vậy, câu trả lời chính xác và đẹp! Bạn có phải là giáo viên? –

+0

"Trong C++, nó thuộc loại char, nhưng không có diễn viên, nó sẽ được chuyển đổi hoàn toàn thành int" Bạn biết tôi sẽ nói gì, phải không? Được rồi, tôi sẽ không nói. –

+1

Ủy ban MISRA C đặt chân tập thể của họ xuống thay vì có __no chuyển đổi tiềm ẩn__ và nhiều ngành hiện đang sử dụng MISRA C để kiểm tra chất lượng. –

10

Trong C, 'A' loại là int (không phải char). Tôi nghĩ rằng một số người làm int i = 0 + (int)'A'; trong C++ (hoặc làm cho mã hữu ích trong cả C++/C).

+1

cảm ơn rất nhiều vì đã trả lời. – carlos

+0

trong C++ là như nhau? – carlos

+3

Trong C++ ''A'' là' char' (không phải 'int'): ** Thử **' sizeof (' A '), sizeof (int), sizeof (char) 'trong C++ và trong C cả hai. –

0

Theo tiêu chuẩn ISO C99, loại ký tự chữ cái trong C là int.

Tuy nhiên, các ký tự chữ, như 'c', có phạm vi phù hợp với số char.
Vì vậy, bạn có thể gán một ký tự chữ cho một biến số char mà không làm mất thông tin.

char c = 'c'; /* 'c' is int, but (c == 'c') is true */ 
+0

Bạn đang nhầm lẫn câu hỏi ở đây với câu hỏi khác “Tại sao một số hàm thư viện chuẩn trả lại một' int' trong C? ”. Hai câu hỏi này hoàn toàn khác nhau. Câu trả lời cho câu hỏi “Tại sao một số hàm thư viện chuẩn trả lại một' int' trong C? ”Liên quan đến kiểu' unsigned char'. Câu trả lời của bạn không có ý nghĩa cho một trong hai câu hỏi. –

+0

Tôi đã bỏ đoạn EOF. Tôi nghĩ rằng phần còn lại là tốt. – pablo1977