2015-03-26 27 views
6

Với Ví dụ này:Modulo điều hành (%) cho kết quả khác nhau

std::vector<int> numbers = {5,6,7}; //size is 3 
int i = -1; 
std::cout << i % 3 <<"\n";     // output: -1 
std::cout << i % numbers.size() << "\n"; // output: 0 

cơ bản trong cả hai câu lệnh im chế biến -1% 3 nhưng kết quả đầu ra trình biên dịch số khác nhau. Tôi không hiểu kết quả này, có lẽ ai đó có thể giải thích cho tôi.

chỉnh sửa: như @ Chris, @ Keith Thompson @AnT đề nghị đoạn

std::cout << std::numeric_limits<std::size_t>::max() % 3 <<"\n";  //output: 0 
std::cout << i % numbers.size() << "\n";       // output: 0 

in sản lượng dự kiến. Cảm ơn lời khuyên hữu ích dành cho tất cả mọi người!

+0

Xem tại đây: http://stackoverflow.com/questions/7594508/modulo-operator-with-negative-values ​​ –

+2

@ RollenD'Souza: Điều đó thực sự không liên quan. – Deduplicator

+2

Vấn đề là "numbers.size()" xảy ra là "unsigned int"; và "-1" được chuyển thành "0xffffffff" (hoặc bất kỳ giá trị nào cho kiến ​​trúc của bạn) sau lưng bạn: ( – FoggyDay

Trả lời

8

i % 3 là những gì bạn mong đợi và, vì C++ 11, đã xác định ngữ nghĩa thay vì có kết quả được xác định thực hiện (nếu tôi nhớ chính xác).

numbers.size() có loại không dấu (std::size_t). Giả sử size_t lớn bằng int hoặc lớn hơn, i được chuyển đổi thành cùng một loại chưa ký trước khi thao tác được thực hiện. Giá trị i sẽ là giá trị tối đa cho loại đó, có vẻ chia hết cho 3 cho bạn.

+3

Như một lưu ý phụ, việc tăng mức cảnh báo trên trình biên dịch nên đã bắt được dấu hiệu không phù hợp – Deduplicator

+0

@Deduplicator, Thú vị, tôi không biết điều đó Rõ ràng [Clang không] (http://coliru.stacked-crooked.com/a/e425e23f148a1f03), [cũng như GCC] (http: // coliru. stacked-crooked.com/a/7353cc43b82d22c3), hoặc ít nhất là các phiên bản này – chris

+0

Thử '-Weverything' và xem cảnh báo nào họ đã ném ra khỏi' -Wextra'. – Deduplicator

0

Vấn đề là% số âm không được xác định rõ trong C++.

+0

Ngoại trừ từ C++ 11 trở đi. – EJP

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