下面给出的代码的输出是否取决于编译器,或者保证所有编译器都相同?
int main()
{
int i=5;
i=i/3;
printf("%d\n",i);
return 0;
}
是的,您的示例的行为是明确定义的。
但是,在负值的情况下,就不太清楚了。在 C99 之前,整数除法是朝零舍入还是朝负无穷大舍入,由实现定义:
如果任一操作数为负数,则
/
运算符的结果是小于代数商的最大整数还是大于代数商的最小整数是实现定义的
C99 要求四舍五入到零:
当整数被除法时,
/
运算符的结果是代数商,其中任何小数部分被丢弃。
C99 标准,第 6.5.5 节,第 6 段:
当整数被除法时, / 运算符的结果是代数商,其中任何小数部分被丢弃。如果商 a/b 是可表示的,则表达式 (a/b)*b + a%b 应等于 a。
该标准还指出,这通常称为“向零截断”。
所以是的,它是明确定义的。