2015-01-28 19 views
5

Tôi vừa thử nghiệm mã trong lập trình C. và đã biết một hành vi kỳ lạ. Vâng ... Vì tôi không phải là một chuyên gia về C, vì vậy tôi không biết liệu nó lạ hay bình thường.tại sao vòng lặp này đang chạy vô hạn lần trong c?

Về cơ bản câu hỏi của tôi là tất cả về sự khác biệt giữa hai dòng mã sau đây: -

char a = 'h'; // here variable a is not an array of "char" 

char a = 'hi'; //here variable a is not an array of "char" as well (i don't know if compiler assumes it as an array or not but , at least i didn't declared it that way) 

tôi đã sử dụng mã sau

đầu tiên: -

char a =0; 
for(;a<'hi';a++) 
{ 
    printf("%d= hello world \n",a); 
} 

thứ hai: -

char a; 
for(a='h';a<'hi';a++) 
{ 
    printf("%d= hello world \n",a); 
} 

cả hai vòng nêu trên tiếp tục chạy mãi mãi,

Có thể ai đó cho tôi biết tại sao như vậy?

Tôi có thể thiếu khái niệm lập trình rất cơ bản. hãy giúp tôi guys

+0

Xem ví dụ http://stackoverflow.com/q/3960954/440558 –

+6

Giải thích cách bạn đợi trong một thời gian dài vô hạn :-) –

+0

@BasileStarynkevitch: - ha ha .. lần đầu tiên là 3000 và tiếp theo tôi đợi khá lâu. (22854) –

Trả lời

10

Đó là vì 'hi' có loại int không phải là char. Nó cũng giải quyết giá trị 26729. Nhưng biến vòng lặp nhiều khả năng nhất (giả sử char là loại 1 byte và byte có 8 bit) bị giới hạn bởi 127 và sau đó tràn.

Lưu ý rằng đây:

char a =0; 
char m = 'hi'; 
for(; a < m; a++) 
{ 
    printf("%d= hello world \n",a); 
} 

sẽ làm việc vì 'hi' được sẽ bị cưỡng chế để char (105).

'hi' là ký tự nhiều chữ. Nó không phải là thực tế phổ biến trong lập trình, nó là "ít được biết đến" C tính năng mà đã trở thành một phần của tiêu chuẩn C99. Thông tin thêm về họ: http://zipcon.net/~swhite/docs/computers/languages/c_multi-char_const.html

+2

Có thể là tốt để đề cập đến rằng điều này thậm chí có một tên thích hợp - một * đa nhân vật chữ * – Mints97

+0

làm thế nào tôi có thể tìm thấy giá trị của 'hi'. hoặc theo Mints97 bất kỳ "đa ký tự chữ" –

+2

Giá trị số nguyên của một chữ nhiều ký tự trông tinh nghịch với tôi, mặc dù: C99 => §6.4.4.4.10: _ "Giá trị của hằng số ký tự nguyên có chứa nhiều hơn một ký tự (ví dụ, 'ab'), [...] được định nghĩa thực hiện. "_, do đó, có một số hành vi không xác định có thể được phát tại đây –

1

Trong C (trái ngược với C++, như được trích dẫn trong một số nhận xét), ký tự chữ cái, luôn là có loại int. Nó không quan trọng nếu nó là một ký tự bình thường một chữ, chẳng hạn như 'c', hoặc một chữ nhiều nhân vật, chẳng hạn như 'hi'. Nó luôn có loại int, được yêu cầu giữ ít nhất 16 bit. A char giữ chính xác một byte.

Khi so sánh các giá trị số nguyên của các loại khác nhau, các quy tắc quảng bá số nguyên bắt đầu và giá trị nguyên của kích thước nhỏ hơn được đẩy lên kích thước lớn hơn. Đó là lý do tại sao a < 'hi' chỉ có thể là 1 ("true"). Ngay cả khi được thăng cấp thành loại int, biến số a không bao giờ có thể giữ bất kỳ thứ gì lớn hơn MAX_CHAR. Nhưng ký tự nhiều ký tự 'hi' là một số int có giá trị lớn hơn số trong việc thực hiện của người biên tập.

Lý do mà a < m có thể thành công là khi tuyên bố m, bạn khởi nó với 'hi' mà được chuyển đổi sang loại char, mà thực sự có cơ hội để so sánh không ít hơn một char khác.

+0

nội dung sau đoạn 1 .. đã biến mất hoàn toàn trên đầu của tôi. :) Tôi có nghĩa là không thể hiểu quy tắc khuyến mãi số nguyên. Không xúc phạm. –

+2

@DemonSOCKET sau đó bạn nên đọc thêm về nó. Hoặc nó sẽ bị tổn thương sau đó. – keltar

+0

vâng tôi nghĩ tôi thực sự nên –

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