2013-07-23 25 views
5

Tôi có đoạn mã sau:làm thế nào để loại bỏ cảnh báo lint sau trong C?

#define NUM_DAYS 65 
#define NUM_PERSON 33 

int num = 0; 

if(NUM_DAYS % NUM_PERSON) 
{ 
    num = NUM_DAYS/NUM_PERSON; 
} 
else 
{ 
    uum = NUM_DAY/NUM_PERSON + 1; 
} 

num = num - 1; 

while(num > 0) 
{ 
    //do something here 
} 

nhưng tôi nhận được cảnh báo lint sau:

Warning 681: Loop is not entered 

vấn đề là gì và làm thế nào để sửa chữa nó?

+7

Vấn đề là trước tiên bạn đặt 'num' thành' 65/33', là '1', sau đó trừ một, vì vậy' num' là '0' khi điều kiện vòng lặp được chọn. Lint nói rằng có thể không phải là những gì bạn dự định, vì vậy hãy cảnh báo về nó. –

+3

Đạo đức của câu chuyện: Hãy coi chừng việc cắt ngắn phân chia số nguyên. –

+3

'uum =' trong mệnh đề khác trông giống như lỗi đánh máy –

Trả lời

13

Khi mã của bạn được viết, vòng lặp sẽ không được nhập. NUM_DAYS % NUM_PERSON sẽ đánh giá thành true, vì vậy num sẽ bằng NUM_DAYS/NUM_PERSON. Vì chúng ta đang xử lý ints, 65/33 bằng 1. 1 -10, vì vậy điều kiện trong khi sẽ không thành công.

Nếu mã của bạn được viết như dự định (như trong, các hằng số đó là giá trị bạn mong muốn luôn sử dụng), chỉ cần xóa vòng lặp while. Nó sẽ không bao giờ được sử dụng. Nếu, tuy nhiên, NUM_DAYS hoặc NUM_PERSON sau đó có thể chứa các giá trị khác, bạn có thể không có gì phải lo lắng. Nếu những giá trị cụ thể đó không quan trọng, hãy thử đặt chúng thành các giá trị sao cho phân chia sẽ đánh giá thành giá trị lớn hơn 1.

+0

Ai đó đã nhận xét rằng tôi đã không thực sự trả lời câu hỏi về cách khắc phục nó. Họ đã đúng, vì vậy tôi đã thêm giải thích bổ sung. – patrickvacek

+0

"* Bây giờ, hãy thử cài đặt chúng thành các giá trị sao cho phép chia sẽ đánh giá thành giá trị lớn hơn 1 *" - bạn có gợi ý cố ý phá vỡ logic chương trình để thỏa mãn lint không ?! – SomeWittyUsername

+0

@icepack Chỉ khi các giá trị của các hằng số đó không quan trọng! Tôi bắt đầu với điều đó với một tuyên bố về những gì cần làm nếu mã thực sự được viết như dự định, tức là các hằng số đó chính xác là những gì OP muốn bây giờ và mãi mãi. – patrickvacek

4

Bởi vì giá trị của cả hai biểu hiện trong if-else được biết đến tại thời gian biên dịch như sau:

Trong if (num == 0) trong khác num == 1, Vì vậy, trước khi giá trị lặp num là một trong hai 0 (từ khác), hoặc -1 (từ nếu) không lớn hơn 0 có nghĩa là while điều kiện luôn luôn được biết sai tại thời gian biên dịch. Điều này có nghĩa là trong khi không bao giờ thực hiện được biết đến tại thời gian biên dịch.

Tại sao đầu vào tĩnh trong mã của bạn? bạn đã đưa ra giá trị tại thời gian biên dịch, yêu cầu nó từ người dùng sẽ chính xác.

Di macro và như dưới đây:

int num_days, number_persons; 
scanf("%d", &num_days); 
scanf("%d", &number_persons); 

này sẽ làm việc, lưu ý tĩnh gán những 65, 33 giá trị là vấn đề!

6
#define NUM_DAYS 65 
#define NUM_PERSON 33 

int num = 0; 

if(NUM_DAYS % NUM_PERSON) // we go here, since (NUM_DAYS % NUM_PERSON) > 0 
{ 
    num = NUM_DAYS/NUM_PERSON; // so num = 1 now 
} 
else 
{ 
    uum = NUM_DAY/NUM_PERSON + 1; 
} 

num = num - 1; // num = 0 now 

while(num > 0) // num = 0 ! So we don't go in this loop 
{ 
    //do something here 
} 

Đó là lý do bạn nhận được cảnh báo này. Trình biên dịch đã xác định rằng vòng lặp của bạn là vô ích (với giá trị #define hiện tại của bạn).

0

@patrickvacek là đúng. Tôi sẽ mở rộng lời giải thích của anh ấy.

Trong số học số nguyên, 65 chia cho 33 gần bằng 2 nhưng không hoàn toàn. Thương số là 1 với phần còn lại là 32. C++ cho phép bạn truy cập vào thương hoặc số dư, tùy thích. Đối với thương, 65/33 == 1. Đối với phần còn lại, 65 % 33 == 32. Mã của bạn không yêu cầu phần còn lại, nhưng chỉ cho thương. Do đó, if (NUM_DAYS % NUM_PERSON) theo nghĩa đen nghĩa là if (1), điều này có nghĩa là if (true). Do đó, chi nhánh else của tuyên bố if của bạn không bao giờ được tiếp cận.

Bạn có thể theo dõi phần còn lại. Hơn nữa, vì logic tương đối đơn giản (và vì các lý do khác phải làm với bộ tiền xử lý và đánh giá thời gian biên dịch, mà chúng tôi sẽ không chi tiết ở đây), trình biên dịch có thể làm theo phần còn lại. Vì vậy, cảnh báo.

0

trình biên dịch của bạn tính giá trị của num đã vì giá trị có thể của nó có thể là 65/33 or 34 được giáng chức để 0 vì nó là một loại int hay num = num - 1 đó là -1, và thay thế các giá trị trong while ((0 or -1) > 0). Đó là lý do tại sao trình biên dịch cảnh báo bạn về nó.

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