例如,假设您有以下变量:
int i = 9;
int j = 7;
根据实施情况,(-i)/j
的值可以是–1
或–2
。怎么可能得到这两个不同的结果?
答案 0 :(得分:9)
令人惊讶的是,结果是在C89中定义的实现:
ANSI draft §3.3.5
当整数被分割并且除法不精确时,如果两者都是 操作数是正数,/运算符的结果是最大的 小于代数商的整数和%的结果 运营商是积极的。 如果任一操作数为负数,则是否为 /运算符的结果是小于的最大整数 代数商或大于代数的最小整数 商是实现定义的
然而,这在C99中有所改变
N1256 §6.5.5/ 6
当整数被划分时,/运算符的结果是丢弃任何小数部分的代数商 *
用脚注:
*这通常被称为“截断为零”
澄清一下,“实现定义”意味着实现必须决定哪一个,它并不意味着有时你会得到一个东西,有时你会得到另一个(除非实现定义它做一些非常奇怪的事情,比如说,我想)。
答案 1 :(得分:4)
在C89中,对于负操作数,除法/
的结果可以被截断。 (在C99中,结果将被截断为零。)
历史原因在C99理由中解释:
Rationale for International Standard — Programming Languages — C§6.5.5乘法运算符
在C89中,涉及负操作数的整数划分可以以实现定义的方式向上或向下舍入;目的是避免在运行时代码中产生开销以检查特殊情况并强制执行特定行为。但是,在Fortran中,结果将始终截断为零,并且数字编程社区似乎可以接受开销。因此,C99现在需要类似的行为,这应该有助于将代码从Fortran移植到C.