ANSI C或ISO C是否指定-5%10应该是什么?
我似乎记得,当模运算符的操作数是负数(只是它应该是一致的)时,ANSI C没有指定应该返回什么值。 它是后来指定,还是总是指定,我记得不正确?
C89,不完全(§3.3.5/ 6)。 它可以是-5或5,因为-5 / 10可以返回0或-1( %
由线性方程定义,涉及/
, *
和+
):
当整数被分割且分割不精确时,如果两个操作数都是正的,则
/
运算符的结果是小于代数商的最大整数,并且%
运算符的结果是正的。 如果任一操作数是负数 ,那么/
运算符的结果是小于代数商的最大整数,还是大于代数商的最小整数是实现定义的 ,就像%
运算符的结果的符号一样。 如果商a/b
是可表示的,则expression式(a/b)*b + a%b
将等于a
。
C99,是(§6.5.5/ 6),结果必须是-5:
当整数被分割时,
/
运算符的结果是丢弃任何小数部分的代数商。 88)如果商a/b
可表示,则expression式(a/b)*b + a%b
应等于a
。88)这通常被称为“截至零”。
类似地,在C ++ 98中,结果是遵循C89定义的实现定义(§5.6/ 4),但是提到了优先selectround-to-zero规则,
…如果两个操作数都是非负的,那么余数是非负的; 如果没有,剩余的符号是实现定义的74) 。
74)根据正在进行ISO C修订的工作,整数除法的首选algorithm遵循ISO Fortran标准ISO / IEC 1539:1991中定义的规则,其中商总是向零取整。
实际上它成为C ++ 0x(§5.6/ 4)中的标准规则:
…对于整型操作数,运算符产生的代数商与任何小数部分丢弃; 82 …
82)这通常被称为零截断。
为KennyTM的答案增加一点细节:如果C标准调用了某个实现的定义,那么这个实现需要logging它所做的select。 通常这将在编译器或库文档(手册页,帮助手册,打印的文档,CD小册子:-)任何声称符合C89或更高版本的实现必须提供此地方。 尝试寻找这样的文件。 以gcc
为例,这是在gcc-info中:
4 C实现定义的行为
ISO C的一致性实现需要在每个被指定为“实现定义”的区域中logging它的行为select。 以下列出了所有这些领域,以及ISO / IEC 9899:1990和ISO / IEC 9899:1999标准的章节编号。 有些地区只能在一个版本的标准中定义。
一些select取决于GCC所遵循的平台的外部确定的ABI(包括标准字符编码) 这些在下面被列为“由ABI确定”。 *注意二进制兼容性:兼容性和“http://gcc.gnu.org/readings.html”。; 预处理器手册中logging了一些select。 *注意实现定义的行为:(cpp)实现定义的行为。 图书馆和操作系统(或编译为独立环境时的其他环境)做出了一些select; 有关详细信息,请参阅其文档。
菜单:
翻译实施::
- 环境执行::
- 标识符实现::
- 字符执行::
- 整数实现::
- 浮点执行::
- 数组和指针的实现::
- 提示实现::
- 结构联合枚举和位域实现::
- 限定符执行::
- 声明符的实现::
- 报表执行::
- 预处理指令的执行::
- 库函数实现::
- 架构实现::
- 特定于区域的行为实施::