2009-01-25 7 views
7
int n = 5; 
for(int i = 0;i!=n;i++)//condition != 
{ 
//executing 5times 
} 

int n = 5; 
for(int i = 0;i<n;i++)//condition < 
{ 
//executing 5times 

} 

Bạn thích cái nào hơn?Điều kiện ưu tiên trong vòng lặp là gì?

Đây là ví dụ từ "Accelerated C++ : lập trình thực tế theo ví dụ/ Andrew Koenig, Barbara E. Moo". Chỉ cần muốn biết lý do tại sao tác giả thích đầu tiên một

+0

giảm giá mạnh! có vẻ như một câu hỏi hoàn toàn hợp pháp! –

+0

Đây là ví dụ từ "Accelerated C++: lập trình thực tế bằng ví dụ/Andrew Koenig, Barbara E. Moo." Chỉ muốn biết tại sao Tác giả thích câu hỏi đầu tiên – yesraaj

+0

@raj - Có thể đề cập đến trong câu hỏi của bạn nơi bạn tìm thấy sự cố và nói rằng bạn đang tìm kiếm giải thích về lý do tại sao người này lại tốt hơn người khác. Nó có thể ngăn chặn bỏ phiếu xuống nhanh. – Dana

Trả lời

14

Thứ hai. Vì hai lý do

  1. Càng ít hơn (hoặc đôi khi < =) là cách thông thường mà hầu hết các coder viết này, và nó tốt hơn để dính vào ước nếu có thể - các = lẽ sẽ làm cho hầu hết các lập trình viên nhìn hai lần để kiểm tra xem có gì lạ trong vòng lặp trong khi < sẽ được hiểu ngay lập tức không.

  2. The! = Phụ thuộc vào điều kiện chính xác. Nếu nội thất của vòng lặp được sửa đổi trong khi bảo trì và tôi vô tình tăng lên bên trong vòng lặp thì bạn sẽ kết thúc với một vòng lặp vô hạn. Nói chung nó luôn luôn tốt hơn để làm cho tình trạng chấm dứt của bạn càng rộng càng tốt - nó chỉ đơn giản là mạnh mẽ hơn.

2 của khóa học là lý do tại sao 1.

1

<n là sử dụng nhiều nhất (quan điểm của tôi)

+0

benlumley, xin vui lòng loại bỏ nó, nó không phải là sản phẩm nào, đó là một lỗi. nếu bạn viết karlis

+0

+1 để khắc phục sự bất công -1 –

0

tôi không thể thấy rằng nó quan trọng, không có việc quan trọng hơn phải lo lắng trong khoảng?

Tôi luôn sử dụng cái sau và đó là những gì tôi đã thấy nhiều nhất.

Có người chắc chắn sẽ bắn tôi ngã qua nó mặc dù ....

+0

Chính xác, bạn đã thấy nó nhiều nhất. Nói chung nó luôn tốt hơn để mã hóa như các lập trình viên khác sẽ mong đợi - nó làm cho bảo trì dễ dàng hơn và phổ biến lịch sự với các đồng nghiệp của bạn – Cruachan

3

tôi sẽ nói < như nó chụp một bộ rộng lớn hơn của điều kiện. Giả sử rằng n không phải là hằng số nhưng được trả về từ một hàm mà trong những dịp hiếm hoi trả về -1. Trong trường hợp đó, bạn sẽ có một vòng lặp dài hơn nhiều (cho đến khi int kết thúc tốt đẹp với giá trị -ve!) Bằng phiên bản! = Của vòng lặp.

3

Sử dụng condition < là tốt hơn nhiều vì nó làm giảm khả năng bước qua giá trị trọng điểm của bạn và rơi vào một vòng lặp vô hạn.

1

Tôi thường làm theo cách thứ hai bằng cách sử dụng <. Nhưng suy nghĩ của việc sử dụng! = Kể từ khi stl iterators trong c + + hoạt động theo cách này.

1

Thứ hai. Nó sẽ luôn luôn hoàn thành tại một số điểm (giả sử bạn không làm bất cứ điều gì buồn cười như chơi với giá trị của truy cập bên trong vòng lặp).

Tôi chưa bao giờ thấy lần đầu tiên được sử dụng, ít nhất, không theo cách đó.

2

Như được đưa ra trong câu hỏi, cả hai vòng lặp tương đương nhau. Tuy nhiên, trong mã thực tế, điều điển hình là mọi thứ phức tạp hơn một chút, và trong trường hợp đó, điều kiện "i < n" có xu hướng an toàn hơn một chút. Nếu, ví dụ, tôi có thể tăng nhiều hơn một, nó có thể đi qua n và sau đó phiên bản "i! = N" sẽ dẫn đến một vòng lặp vĩnh cửu.

Đây là trường hợp lập trình phòng thủ.Nó không được chấp nhận rộng rãi: một số người thích đảm bảo mọi thứ thất bại một cách ngoạn mục nhất có thể để các lỗi được tìm thấy sớm. Phong cách phòng thủ có thể che giấu những vấn đề nhỏ như thế. Tuy nhiên, nếu bạn muốn bắt tất cả các lỗi, bạn cũng có thể đi tất cả các cách:

int n = 5; 
int i = 0; 
while (i != n) { 
    int old_i = i; 
    // the real stuff of the loop here 
    ++i; 
    assert(i == old_i + 1); 
} 

(Hoặc, thậm chí tốt hơn, sử dụng một langauge hỗ trợ synxtax để xác định trước và sau điều kiện và bất biến vòng lặp natively .)

Cuốn sách "Cạm bẫy và cạm bẫy" của Andrew Koenig (xem http://en.wikipedia.org/wiki/C_Traps_and_Pitfalls cho người mới bắt đầu) có lẽ thú vị với bạn nếu bạn muốn suy ngẫm về loại câu hỏi này.

0

"i < n" thì tốt hơn. Bởi vì nếu bạn sử dụng "i! = N" và trong một số trường hợp i ban đầu của bạn lớn hơn n, bạn sẽ nhập một vòng lặp vô hạn.

+0

Không có vòng lặp vô hạn, nhưng lỗi ovrflow ;-) –

0

Tôi tin rằng đây là một lựa chọn tốt hơn nếu bạn đang tối ưu hóa cho tốc độ :

int n = 5; 
for(int i = n;i > 0;i--) 
{ 
//executing 5times 
} 

Lý do cho điều đó là so sánh với 0 là nhanh hơn.

+1

Không -1, nhưng có thể bạn sẽ truy cập mảng được lập chỉ mục bởi i bên trong vòng lặp đó và các CPU làm tốt hơn việc tìm nạp trước bộ nhớ vào bộ đệm khi nó được truy cập theo thứ tự tăng dần. Các 1ns bạn mua so sánh với 0 sẽ bị chết đuối bởi 70ns chờ RAM. –

+0

Thực ra, sẽ nhanh hơn nếu bạn sử dụng "i" thay vì "i> 0" cho điều kiện xuất cảnh của bạn và "--i" thay vì "i--" (mặc dù điều cuối cùng có thể được tối ưu hóa bởi trình biên dịch). – strager

+1

@j_random_hacker, Một lựa chọn tốt hơn là: int i = n; trong khi (i -> 0) {}. Tôi sử dụng thành ngữ này vào những lúc mà thứ tự lặp lại không quan trọng. (0 có thể là bất kỳ số nào để chấm dứt tại.) – strager

1

Tôi muốn sử dụng <, vì chỉ cần nhìn vào mã bạn có thể biết vòng lặp tăng của nó, nó sao lưu thực tế là bạn đang sử dụng i + +.

Nếu bạn đang sử dụng i + + và < và vì lý do nào đó (mã khác, lỗi đánh máy, lỗi của con người), mã của bạn sẽ thay đổi giá trị thành i-- bạn sẽ biết ngay rằng vòng lặp không được đánh giá. = nó sẽ hoạt động theo cách làm cho nó ít tầm thường hơn để gỡ lỗi.

+0

Quan sát tốt; điều này đã bắt gặp tôi một vài lần, và may mắn thay tôi đã sử dụng strager

0

Tôi nói điều đó phụ thuộc vào loại biến lặp. Nếu bạn biết đó là một số nguyên, tôi sẽ sử dụng thứ hai, bởi vì bạn có thể nói

Loop, miễn là tôi là nhỏ hơn hơn n

Mà tôi nghĩ là dễ dàng hơn để đọc cho hầu hết các lập trình viên, kể cả bản thân tôi. Nếu bạn không biết loại biến lặp, bạn nên đưa ra ít nhất các giả định về khả năng của nó càng tốt. operator< có thể không khả dụng cho i: Nếu đó là bất kỳ trình lặp nào khác ngoài trình lặp truy cập ngẫu nhiên, operator< không được đảm bảo khả dụng. Trong trường hợp này tôi sẽ sử dụng operator!=.

Tôi sẽ tránh tùy chọn ưa thích < chỉ vì bạn vô tình "vượt qua" giá trị kết thúc. Tôi nghĩ rằng lập luận là thiếu sót. Bởi vì nếu bạn vô tình bước qua, thì đó là một lỗi và cần được chú ý càng sớm càng tốt (Fail-fast).