2012-02-09 29 views
5

Tôi có câu hỏi này sau khi đọc thread Print an int in binary representation using CHiểu được điều kiện xuất cảnh của một vòng lặp for

này Trong một người dùng bình luận, họ đăng tải này cho vòng lặp, mà gán 1 hoặc một từ 0 đến vị trí bit để chuyển đổi từ một số thập phân int sang char * binary.

for(; bits--; u >>= 1) 
    str[bits] = u & 1 ? '1' : '0'; 

Tôi hiểu tại sao không cần phải là giá trị được khởi tạo. Đây là cú pháp cho vòng lặp for mà tôi đã luôn biết:

for (variable initialization; condition; variable update) 

Điều tôi không hiểu là cách 'bit--' có thể là điều kiện thoát. Xin hãy giúp tôi hiểu cách mã này hoạt động (tôi đã thử nghiệm nó, và nó hợp lệ).

Cảm ơn bạn.

+1

Đây là những gì các lập trình viên C bị nguyền rủa !! Sản xuất mã làm điều gì đó nhưng không ai hiểu nó nữa. Đừng cố viết mã như thế !! bit - decrements biến bit, khi nó bằng 0, nó trả về false – guitarflow

+1

@guitarflow Những người hiểu C và thành ngữ của nó hiểu mã như vậy là tốt vì điều này rất phổ biến trong mã C (bao gồm cả sách K & R), và tôi sẽ nói rằng thành ngữ này phải được học để hiểu mã C nói chung. Vậy tại sao mã mới (bằng bất kỳ ngôn ngữ nào) được viết cho những người làm _không hiểu ngôn ngữ? Hình thức “dễ hiểu hơn” thậm chí có thể làm phức tạp mọi thứ cho người đọc thành thạo ngôn ngữ, tức là “tại sao anh ấy không dùng [thành ngữ phổ biến], có cái gì tôi đang thiếu?” – Arkku

+0

@Arkku Tôi cũng hiểu mã , nhưng bạn phải đồng ý nó không phải là phong cách mã hóa tốt. Viết for-loop theo cách "chuẩn" giúp mọi người dễ đọc hơn, không chỉ là các vết nứt. Tên biến như "u" cũng không phải là tên mô tả;) – guitarflow

Trả lời

8

Trong C, giá trị bằng 0 sẽ đánh giá là "sai" trong ngữ cảnh boolean. Vì vậy, khi bits-- đánh giá là 0, trong ngữ cảnh của vòng lặp nó đánh giá là "sai" và kết thúc vòng lặp.

Nếu bạn nói, ví dụ:

int x = 1; 
if (--x) 
{ 
    printf("True!\n"); 
} 
else 
{ 
    printf("False!\n"); 
} 

Nó sẽ ra "False", bởi vì --x đánh giá 0, đó là "false" trong bối cảnh boolean.

+0

Ok, tôi đã nghi ngờ rằng đó là trường hợp. Cảm ơn bạn. –

+4

Charles, bạn nói đúng, nhưng --x không giống như x--. Nếu bạn thay đổi mã ở trên thành x--, mã sẽ in "True!". – Diego

+0

@ dfmx123, sự khác biệt giữa tăng sau và tăng trước là một vấn đề khác và không thực sự nằm trong phạm vi của câu hỏi ở đây. Vấn đề là chỉ đơn giản là để chứng minh rằng các biểu thức đánh giá bằng không được coi là "sai" trong ngữ cảnh có điều kiện. –

1

Tất cả các điều kiện về cơ bản đều được kiểm tra xem có phải là 0 hay không. 0 có nghĩa là false, mọi thứ khác có nghĩa là true. Vì vậy, vòng lặp đó sẽ phá vỡ khi bits là 0.

Bạn đôi khi sẽ thấy while hoặc if điều kiện bằng văn bản

if (variable) // or while(variable) 

Đó chỉ là viết tắt cho

if (variable != 0) // or while (variable != 0) 

Vì vậy

for (; bits--; u >>= 1) 

viết tắt của

for (; bits-- != 0; u >>= 1) 
+0

Thực ra, trong mọi thứ C được coi là đúng trừ phi tôi nghĩ. – guitarflow

+0

@guitarflow bạn đúng, tôi đã sửa câu trả lời của mình –

0

bits-- là biểu thức gán của loại int (vì nó sẽ trả về giá trị b, là int). Để khớp với cú pháp vòng lặp for, nó được chuyển thành biểu thức boolean, có nghĩa là nó đúng nếu bit! = 0. Thực tế, điều kiện giống hệt bit! = 0, nhưng bằng cách sử dụng bit--, nó thay đổi giá trị của các bit cùng một lúc, làm cho mã nhỏ gọn hơn, đó là tất cả.

0

Như đã nói, trong C, bạn có thể sử dụng số nguyên làm điều kiện - 0 hoặc false, bất kỳ thứ gì khác cho true. (Trên thực tế, bạn hầu như luôn luôn làm điều đó - thậm chí là một biểu hiện như a<b là một int)

Vì vậy, vòng lặp sẽ kết thúc khi bits-- sẽ là 0.

Khi các nhà điều hành -- đưa ra sau khi thay đổi, nó làm giảm biến và nhận giá trị trước đó của nó. ví dụ: nếu bạn có int a=3,b; b=a--;, thì b sẽ là 3 và số sẽ là 2.

Vì vậy, vòng lặp sẽ thoát sau khi các bit đó sẽ bị giảm từ 0 đến -1. Điều đó có nghĩa rằng, nếu ở đầu, bits==8 (ví dụ), vòng lặp sẽ lặp lại 8 lần, khi ở đầu tiên, bit sẽ là 7 (vì điều kiện đã được kiểm tra) và cuối cùng, bit sẽ là 0. Cách tốt nhất để lặp qua một mảng (Kể từ trong c, mảng của các biến số bits được lập chỉ mục từ 0 đến bits-1).

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