2012-03-13 36 views
6

Chúng ta đều biết rằng các toán tử logic ngắn && nếu toán hạng bên trái là false, bởi vì chúng ta biết rằng nếu một toán hạng là false, thì kết quả cũng là false.Tại sao không có mạch điều khiển bitwise & ngắn mạch?

Tại sao nhà điều hành bitwise & cũng không đoản mạch? Nếu toán hạng bên trái là 0, thì chúng tôi biết rằng kết quả cũng là 0. Mỗi ngôn ngữ tôi đã thử nghiệm này trong (C, Javascript, C#) đánh giá cả hai toán hạng thay vì dừng sau lần đầu tiên.

Có bất kỳ lý do nào tại sao lại là một ý tưởng tồi khi cho phép ngắn mạch của nhà điều hành &? Nếu không, tại sao không phải hầu hết các ngôn ngữ làm cho nó ngắn cicuit? Nó có vẻ như một sự tối ưu hóa rõ ràng.

+1

Một lý do sẽ là cho phép tác dụng phụ của các cuộc gọi chức năng. –

+3

Vì các toán tử bitwise thường được sử dụng cho các toán tử số nguyên (và các toán tử thường tương ứng với các hướng dẫn máy đơn), nó sẽ là bất cứ điều gì khác ngoài việc tối ưu hóa để bổ sung điều kiện để kiểm tra các trường hợp hiếm hoi. Tại sao phép nhân không ngắn mạch trên 0? Vâng, bởi vì nó là một phép tính số học đơn giản tương ứng với một lệnh máy đơn lẻ và việc kiểm tra không ai sẽ kiểm tra mọi phép nhân cho toán hạng 0. –

+0

Toán tử bit '|' có thể đoản mạch nếu toán hạng bên trái là '0xFFFFFFFF'. –

Trả lời

9

Tôi đoán là bởi vì một bitwise and trong ngôn ngữ nguồn thường được dịch khá trực tiếp sang hướng dẫn bitwise and sẽ được thực thi bởi bộ xử lý. Điều đó, đến lượt nó, được thực hiện như một nhóm số lượng thích hợp của các cổng and trong phần cứng.

Tôi không thấy điều này là tối ưu hóa nhiều thứ trong hầu hết các trường hợp. Đánh giá toán hạng thứ hai thông thường sẽ tốn ít hơn kiểm tra để xem liệu bạn có nên đánh giá nó hay không.

+1

Sẽ có lợi nếu toán hạng thứ hai liên quan đến tính toán tốn kém. –

+3

@PeterOlson Có, và chỉ trong trường hợp hiếm hoi toán hạng bên trái là 0. Hãy nhớ rằng chúng ta đang nói về các số nguyên ở đây và một giá trị số nguyên của 0 là hiếm hơn nhiều so với giá trị boolean của 'false' (thậm chí nếu có thể thường xuyên hơn các số khác). –

2

Hoạt động bitwise thường rẻ đến nỗi việc kiểm tra sẽ làm cho hoạt động hai lần trở lên, trong khi lợi ích từ việc đoản mạch một toán tử lôgic có khả năng rất lớn.

2

Nếu trình biên dịch phát ra séc cho cả hai toán hạng &, tôi đoán bạn sẽ chậm hơn nhiều trong bất kỳ điều kiện NORMAL nào.

7

Ngắn mạch không phải là thiết bị tối ưu hóa. Nó là một thiết bị dòng điều khiển. Nếu bạn không đoản mạch p != NULL && *p != 0, bạn sẽ không nhận được chương trình có tốc độ chậm hơn, bạn sẽ nhận được chương trình bị lỗi.

Loại ngắn mạch này hầu như không bao giờ có ý nghĩa đối với các toán tử bitwise, là đắt hơn so với toán tử không mạch ngắn thông thường.

+1

Lập luận này có vẻ ngược với tôi. Có thể sử dụng đoản mạch làm thiết bị điều khiển luồng * vì * nó tồn tại dưới dạng tối ưu hóa. Nếu '&&' không ngắn mạch, mã như thế này sẽ không bao giờ hợp lệ để viết; nó sẽ phải là hai thử nghiệm riêng biệt. Tuy nhiên, tôi đồng ý rằng ngắn mạch bitwise sẽ là đủ hiếm trong thực tế rằng nó có lẽ sẽ đắt hơn trong thời gian dài. Tất cả phụ thuộc vào khả năng giá trị 0 cho toán hạng bên trái trong ngữ cảnh của mã gọi. –

+0

@QuinnTaylor Tối ưu hóa, theo định nghĩa, chỉ ảnh hưởng đến hiệu suất và không có ý nghĩa. Mã như vậy được viết bởi vì nó là tự nhiên để viết mã như thế này, và lựa chọn thay thế là khó xử. Nếu && không ngắn mạch, thì ngôn ngữ có thể sẽ chết và được thay thế bằng thứ gì đó không hề khó sử dụng. –

1

Vì lý do tương tự mà * không đoản mạch nếu toán hạng đầu tiên là 0 - nó sẽ là trường hợp đặc biệt tối nghĩa và thêm kiểm tra thời gian chạy đặc biệt để làm chậm tất cả nhân.

Khi toán hạng không phải là hằng số, ngắn mạch là tốn kém hơn không ngắn mạch, vì vậy bạn không muốn làm điều đó trừ khi các lập trình viên yêu cầu nó một cách rõ ràng. Vì vậy, bạn thực sự muốn có các quy tắc rõ ràng và đơn giản như khi nó xảy ra.

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