【发布时间】:2012-10-17 12:47:14
【问题描述】:
在 c++ 98/03 中
5.6-4
二元 / 运算符产生商,二元 % 运算符 产生第一个表达式除以的余数 第二。如果 / 或 % 的第二个操作数为零,则行为是 不明确的;否则 (a/b)*b + a%b 等于 a。 如果两个操作数 是非负的,那么余数是非负的;如果没有,标志 其余部分由实现定义。
在 c++ 11 中:
5.6 -4
二元 / 运算符产生商,二元 % 运算符 产生第一个表达式除以的余数 第二。如果 / 或 % 的第二个操作数为零,则行为是 不明确的。对于整数操作数 / 运算符产生代数 丢弃任何小数部分的商;81 如果商 a/b 是 可以用结果的类型来表示,(a/b)*b + a%b 等于 a。
正如您所见,符号位的实现定义丢失了,它会发生什么?
【问题讨论】:
-
你想做什么?而这又是如何成为障碍的呢?
-
@AnandVeeramani:有些人只是想避免未定义的(或者,在这种情况下,实现定义的)行为。我很高兴他问这个,当值可能为负时,我避免了模数。
-
C++ 98/03 也有这个脚注:“根据 ISO C 的修订工作,整数除法的首选算法遵循 ISO Fortran 标准 ISO/IEC 1539 中定义的规则: 1991 年,其中商总是向零舍入” C++11 只是将其作为标准的要求(就像 C99 对 C 所做的那样)。删除
%运算符的实现定义部分就是这样做的结果。 -
@moswald:在这些情况下,您也必须避免使用
/运算符,因为它的实现定义类似。
标签: c++ c++11 language-lawyer modulo c++03