2011-12-23 36 views
6

Tôi đã nhận thấy một số thay đổi từ ngữ cho mục 5.6 cho C++ 11. (Tôi đang xem dự thảo tiêu chuẩn C++ N3242, ngày 2011-02-28.) Tiêu chuẩn (dự thảo) mới bao gồm câu:Phân số nguyên trong C++ 11

"Đối với toán hạng tích phân, toán tử tạo ra thương số đại số với bất kỳ phần phân số nào bị loại bỏ ; "

Tuyên bố này không nằm trong 5,6 của tiêu chuẩn 03 (ISO-IEC-14882-2003), nhưng tôi không nghĩ đây là một thay đổi, phải không? Đây là cách C và C++ đã làm việc trong nhiều năm, trừ khi tôi đã mất trí (có thể đã xảy ra).

Trả lời

9

Bạn sẽ không phát điên.

Một chú thích để 5.6/4 nói:

[C++03 footnote 74]: Theo để làm việc được tiến hành đối với việc sửa đổi ISO C, thuật toán thuận lợi nhất để phân chia số nguyên theo quy tắc quy định tại tiêu chuẩn ISO Fortran, ISO/IEC 1539 : 1991, trong đó thương số luôn được làm tròn về 0.

Trong C++ 11 hành vi này được yêu cầu rõ ràng hơn là "ưa thích"; thay đổi được liệt kê trong phần khả năng tương thích:

[C++11: C.2.2]:
Thay đổi: định làm tròn cho kết quả số nguyên /%
Lý do: Tăng tính di động, khả năng tương thích C99.
Ảnh hưởng đến tính năng ban đầu: hợp lệ C++ 2003 mã có sử dụng phân chia số nguyên vòng kết quả hướng tới 0 hoặc về phía vô cực tiêu cực, trong khi tiêu chuẩn quốc tế này luôn làm tròn kết quả hướng tới 0.

1

Hầu. Trong C++ 03, dấu hiệu của phần còn lại cho % (trong đó cả hai thuật ngữ đã được chỉ định) không được chỉ định, vì làm tròn như vậy có thể biến mất từ ​​0 trong một số tình huống nhất định. Hãy so sánh với C++ 03 chú thích:

Theo để làm việc được tiến hành đối với việc rà soát các tiêu chuẩn ISO C, ưa thích thuật toán cho phép chia số nguyên theo quy định trong tiêu chuẩn ISO Fortran , ISO/IEC 1539: 1991 , trong đó thương số luôn là được làm tròn về 0.

Tuy nhiên, thực tế, điều này gần như không bao giờ tạo ra bất kỳ sự khác biệt nào.

+0

Điều này sẽ tạo sự khác biệt lớn trong mã của tôi. Điều này có nghĩa là dấu hiệu của kết quả '%' cũng được định nghĩa bây giờ không? – ThomasMcLeod

+1

@ThomasMcLeod: Vâng, toàn bộ '/'/'%' điều bây giờ được định nghĩa để hành xử giống nhau ở mọi nơi. Bạn có chắc chắn nó tạo sự khác biệt trong mã của bạn không? Việc triển khai của bạn có phải là một trong số ít người không cắt xén không? – PlasmaHH

+1

Có ít nhất hai cách giải thích toán tử mô-đun. Cách phổ biến hơn chỉ đơn giản là phần còn lại của bộ phận. Trong trường hợp này, dấu hiệu của kết quả giống như dấu hiệu của thương. Ví dụ: '-5% -4 == 1 && -5% 4 == -1'. Một cách khác là cách đại số, trong đó toán tử mod trả về lớp đồng dư của toán hạng.Trong trường hợp này, 'a% m == b' nếu và chỉ khi' m' chia '(b - a)' và được xác định trong đó 'm' là số dương. Đây. 'b' là một số không âm nhỏ hơn' m', và vì vậy '-5% 4 == 3'. – ThomasMcLeod

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