2012-02-17 14 views
7

Dưới đây là some code in C++. Nếu bạn thử một cái gì đó như -2%5 trong python kết quả là dương 3 trong khi nhiều ngôn ngữ khác như C++ C# (code) và flash cho -2Modulus hoạt động như thế nào và tại sao nó lại khác với Python so với hầu hết các ngôn ngữ?

Tại sao chúng cho -2 và là một phiên bản chính xác hơn?

#include <cstdio> 
int main(){ 
printf("%d\n", 2%5); 
printf("%d\n", -2%5); 
printf("%d\n", -2%77); 
printf("%d\n", 2%-77); 
printf("%d\n", -2%-77); 
} 

Output:

2 
-2 
-2 
2 
-2 

Trả lời

-1

Tôi nghĩ bạn nên nhìn vào bên dưới. Ngoài việc sử dụng các thuật toán hơi khác nhau, các toán tử ưu tiên quan trọng. Hãy thử nó với dấu ngoặc:

In [170]: 2%5 
Out[170]: 2 

In [171]: -2%5 
Out[171]: 3 

In [172]: (-2)%5 
Out[172]: 3 

In [173]: -(2%5) 
Out[173]: -2 
2

Theo C++ documentation:

Đối với các giá trị âm, kết quả có thể khác nhau tùy thuộc vào việc thực hiện thư viện.

Điều này có vẻ lạ. Python documentation chỉ nói điều này:

Toán tử modulo luôn mang lại kết quả với cùng ký hiệu với toán hạng thứ hai (hoặc 0); giá trị tuyệt đối của kết quả là nhỏ hơn giá trị tuyệt đối của toán hạng thứ hai.

dường như với tôi rằng cách Python hợp lý hơn, nhưng đó chỉ là cảm giác ruột.

+1

Nó thực hiện theo quy định tại C++ 98 (và C-90). Nó được xác định rõ trong C++ 11 (và C-99): Dấu hiệu của kết quả của toán tử modulus giống như dấu hiệu của cổ tức. Trong Python, kết quả có cùng dấu hiệu với ước số. Cách nào để giải thích mọi thứ là một chút của một đồng xu quăng.Điều có ý nghĩa nhất đối với tôi là các ngôn ngữ cung cấp cả hai cách triển khai, do đó tôi là lập trình viên có thể chọn một ngôn ngữ có ý nghĩa hơn trong một số ngữ cảnh cụ thể. –

7

Nếu r = a % n, sau đó a = n * q + r cho một số q. Điều đó có nghĩa là bạn có nhiều lựa chọn cho giá trị của r, tùy thuộc vào giá trị của q được chọn.

Tôi khuyên bạn nên đọc http://en.wikipedia.org/wiki/Modulo_operation, nói rằng hầu hết các ngôn ngữ lập trình chọn r với -n < r < n. Điều đó có nghĩa là, trừ khi r bằng không, bạn có hai lựa chọn cho giá trị r - một số dương, một âm. Các ngôn ngữ lập trình khác nhau đưa ra các quyết định khác nhau về việc liệu có nên đưa ra quyết định tích cực hay tiêu cực. Bạn sẽ tìm thấy một bảng trên trang đó tóm tắt những gì ngôn ngữ khác nhau làm:

  • Python chọn r với dấu hiệu tương tự như n (đó là những gì bạn nhìn thấy ở trên).
  • C++ 2011 chọn r có cùng ký hiệu là a (và trước tiêu chuẩn năm 2011, nó được thực hiện được xác định).

Nếu bạn muốn chắc chắn rằng bạn sẽ có được một dương bằng Python, sử dụng này:

r = a % n 
if r < 0: 
    r += n