7

Chúng ta đều biết mạch về ngắn trong các biểu thức logic, tức là khiCó một điều như phép nhân ngắn mạch không?

if (False AND myFunc(a)) then 
... 

không bận tâm thực hiện myFunc() vì không có cách nào điều kiện if có thể là sự thật.

tôi rất tò mò về việc liệu có một tương đương cho phương trình đại số hàng ngày của bạn, nói

result = C*x/y + z 

Nếu C=0 không có điểm trong việc đánh giá các nhiệm kỳ đầu tiên. Nó sẽ không quan trọng nhiều hiệu suất khôn ngoan nếu xy là vô hướng, nhưng nếu chúng ta giả vờ chúng là ma trận lớn và các hoạt động là tốn kém (và áp dụng cho ma trận) thì chắc chắn nó sẽ tạo sự khác biệt. Tất nhiên bạn có thể tránh trường hợp cực đoan như vậy bằng cách ném vào tuyên bố if C!=0.

Vì vậy, câu hỏi của tôi là liệu tính năng đó có tồn tại hay không và liệu nó có hữu ích hay không. Tôi không phải là một lập trình viên vì vậy nó có thể làm theo một cái tên mà tôi đã không đi qua; Nếu vậy xin vui lòng khai sáng cho tôi :)

+1

Viết tắt mạch logic là một khái niệm quan trọng từ quan điểm chức năng trong khi "rút ngắn số học" là chỉ đơn thuần là một tối ưu hóa ở cấp độ trình biên dịch mà không có sự khác biệt về chức năng. Ngôn ngữ lựa chọn của bạn có thể đã làm nó đằng sau hậu trường mà bạn không nhận thấy. – deceze

+2

Người nào đó biết nhiều hơn tôi nên trả lời, nhưng tôi tưởng tượng bạn sẽ gặp rắc rối nếu bạn rút ngắn bộ phận. Điều gì sẽ xảy ra, ví dụ, nếu y = 0? Nếu ngắn mạch, nó sẽ trả về 0 khi câu trả lời thực sự là một lỗi. – Nate

+0

@deceze Số học ngắn mạch thực sự sẽ có sự khác biệt về chức năng ngoài tối ưu hóa, cũng giống như mạch ngắn logic. Hãy xem xét 'result = C * myfunction()'. Nếu 'C == 0', gây ra biểu thức số học để đoản mạch, thì' myfunction' sẽ không bao giờ được gọi, và bất kỳ tác dụng phụ nào có thể xảy ra (cũng giống như với đoản mạch logic). –

Trả lời

6

Khái niệm bạn đang nói về đi dưới tên gọi khác nhau: lười biếng đánh giá, không nghiêm ngặt đánh giá, cuộc gọi bằng cách cần, đến tên một vài và thực sự là mạnh hơn rất nhiều so với chỉ tránh một phép nhân ở đây và đó.

Có các ngôn ngữ lập trình như Haskell hoặc Frege có mô hình đánh giá không nghiêm ngặt. Ở đó, bạn sẽ dễ dàng viết toán tử phép nhân "ngắn mạch" của mình, ví dụ: bạn có thể viết một cái gì đó như:

infixl 7 `*?`  -- tell compiler that ?* is a left associative infix operator 
        -- with precedence 7 (like the normal *) 

0 *? x = 0   -- do not evaluate x 
y *? x = y * x  -- fall back to standard multiplication 
+0

Cảm ơn! Được chấp nhận để trả lời một số câu hỏi tiếp theo. – Verge

1

Nếu dữ liệu lớn và/hoặc phức tạp và hoạt động tốn kém, thì việc thực hiện thao tác sẽ thực hiện kiểm tra lối tắt thích hợp trước khi cam kết hoạt động tốn kém. Đó là một chi tiết nội bộ về việc thực thi toán tử (nói, ma trận *) nhưng thực sự không liên quan gì đến khái niệm ngôn ngữ "nhân lên" và sẽ có ít tác động đến cách bạn viết phép tính.