2009-07-10 47 views
6

Trước hết, trước khi bắt đầu, tôi đang sử dụng chuyên nghiệp VC++ 2008, chạy Intel core2 trên hệ điều hành windows. Tôi cũng biết rằng mã này sẽ KHÔNG BAO GIỜ được thực hiện trên bất cứ điều gì khác hơn là một core2/corei7 chạy Windows.Thứ tự điều kiện trong khi vòng

Tôi có một vòng lặp while với 2 điều kiện trông giống như sau: lưu ý: đây là phiên bản được đơn giản hóa nhiều.

while((a != b) && (array[a] < c)) 

Nếu điều kiện đầu tiên (a != b) tạo sai, điều kiện thứ hai có được đánh giá không? hoặc vòng lặp sẽ kết thúc ngay tại đó?

Tôi đã thực hiện một vài thử nghiệm và có vẻ như đó thực sự là sự thật.

Tuy nhiên, đây là sự bắt giữ. Khi nào và nếu điều kiện đầu tiên đánh giá sai, điều kiện thứ hai S generate tạo ra một sự vi phạm truy cập nếu nó được đánh giá. Tuy nhiên, từ những gì tôi có thể thấy, một khi điều kiện đầu tiên được đánh giá là sai, chương trình không bận tâm để đánh giá điều kiện thứ hai và thoát khỏi vòng lặp, do đó tiết kiệm cho tôi.

Vấn đề là tôi không thể loại bỏ được vấn đề vi phạm truy cập mà không làm cho mã rất đẹp và gọn gàng của tôi đột nhiên nổ tung lên tôi. Tuy nhiên, do ít "lỗi" (tôi biết đó là một trình biên dịch tối ưu hóa, không phải là một lỗi), tôi dường như có thể thoát khỏi nó. Tôi cũng biết điều này có lẽ không phải là thực hành lập trình tốt để làm, nhưng phải trung thực, trong tình huống của tôi, nếu nó hoạt động, tôi đã đi trước trò chơi.

Câu hỏi của tôi là, "lỗi" này hoặc sơ suất chương trình có thể trở lại và cắn tôi một ngày không? Ngay cả khi xem xét rằng tôi đã thử nghiệm địa ngục ra khỏi phần này và S W CHỈ BAO GIỜ SỬ DỤNG NÀY MỘT NÀY?

+0

Bạn đã có rất nhiều câu hỏi phải không! Bạn chỉ cần thêm messenger của tôi haha ​​ –

+0

Bạn một lần nữa! Ill tin nhắn bạn trên MM và cung cấp cho bạn messenger của tôi. Dude, nó giống như 3AM trên bạn đang ở đâu! bạn không ngủ à Bạn có thích ... sống ở đây không? (Tôi chỉ đến muộn này vì nó là lần duy nhất mọi người khác ngủ và không làm phiền tôi vì vậy tôi có thể hoàn thành công việc của mình). – Faken

+0

Tôi kiểm tra vài trang web của mình theo định kỳ và câu hỏi của bạn luôn là câu hỏi thu hút sự chú ý của tôi và ở gần đầu trang. Nó nhận được một chút đáng sợ. Tôi thực sự dậy sớm - phòng tập thể dục trong 2 giờ. –

Trả lời

22

Điều kiện thứ hai sẽ không được đánh giá trừ khi điều kiện đầu tiên được đánh giá là đúng. Bạn có thể tin vào điều này. Hàng triệu dòng mã hoạt động vì đây là cách C và C++ thực hiện đánh giá biểu thức logic ngắn.

Bạn có thể sử dụng và đếm nó. Nếu biểu thức đầu tiên ước tính sai thì giây thứ hai sẽ không ngay cả bắt đầu đánh giá.

+3

Nhưng điều này có được sử dụng ngay cả khi điều kiện thứ hai có khả năng sẽ khiến chương trình bị lỗi nếu bao giờ được đánh giá ở trạng thái khiến điều kiện đầu tiên trả về false? – Faken

+0

Có, mọi triển khai C++ phù hợp tiêu chuẩn sẽ đảm bảo điều này. – sharptooth

+1

@Faken - Vâng, được rồi. Đừng lo lắng! –

2

Nó sẽ không được đánh giá. Tuy nhiên, nếu bạn lo lắng-tất cả - rằng một thói quen bạn mã sẽ quay trở lại để cắn bạn, bạn nên đánh giá lại những gì bạn đang viết. Bạn đã thừa nhận rằng đó là thực hành lập trình kém. Bạn đã biết nó sẽ là một vấn đề. Khi những điều kiện được đáp ứng, chỉ cần sửa chữa điều. Bạn sẽ ghét bản thân mình ít hơn vào buổi sáng.

+0

Tôi hiểu, nhưng tôi nhỏ và gọn gàng 13 dòng mã tôi đã viết phụ thuộc vào điều này để làm việc đúng ... tôi có rất nhiều để mất một tốc độ interms LOT và hiệu quả nếu tôi sửa chữa nó. Khi tôi có nghĩa là một LOT tôi có nghĩa là thực hiện mã sẽ được trên thứ tự của 2-3 lần chậm hơn. – Faken

+0

Đừng lo lắng. Chúng tôi viết mã tùy thuộc vào đánh giá ngắn curcuit quá. Bạn không mong đợi vòng lặp while bắt đầu nếu điều kiện vòng lặp là sai ngay từ đầu, phải không? Cũng vậy thôi. – sharptooth

+0

Tôi quan tâm, tại sao bạn đồng ý rằng đó là một thực hành lập trình kém? –

4

Đây không phải là lỗi. C++ sử dụng đánh giá ngắn mạch, vì vậy điều kiện thứ hai sẽ không bao giờ được đánh giá khi điều kiện đầu tiên là sai.

1

Ngôn ngữ đảm bảo hành vi ngắn mạch này, do đó bạn không nên lo lắng chút nào khi sử dụng nó. Nó cũng hoạt động với || - nếu điều kiện đầu tiên là đúng, điều kiện thứ hai không được đánh giá.

1

Dựa vào ngắn, hành vi đoản mạch của các toán tử logic AND và OR của C++ không được coi là thực hành không tốt. Nó hoàn toàn thành ngữ và thường dẫn đến mã rõ ràng hơn và ngắn gọn hơn.

Ví dụ:

std::auto_ptr<SomeObject> data; 

Với ngắn circuiting &&:

// Clear expired data, if present 
if(data.get() && data->expired) 
    data.reset(); 

Nếu không sử dụng ngắn mạch của && bạn cần một cấp thêm if dẫn đến mã dài hơn.

// Clear expired data, if present 
if(data.get()) 
{ 
    if (data->expired) 
     data.reset(); 
} 
1

Điều kiện thứ hai sẽ không được đánh giá khi điều kiện đầu tiên không đúng. Như bạn đã nói, tối ưu hóa này được theo sau bởi tất cả các trình biên dịch C++.

Nếu bạn vẫn không thể truy cập, hãy thêm câu lệnh if đơn giản trong thời gian đó.

while (a != b) { 
    if (array[a] < c) 
    { 
     // your code goes here. 
    } 
    else 
    { 
     break; 
    } 
} 
Các vấn đề liên quan