如果/或%运算符的一个或两个操作数是负数,结果是否会实现定义?

时间:2015-05-15 08:47:45

标签: c divide ansi-c

e.g。这些表达的价值是什么?他们依赖于编译器吗?

-7/3   -7%3
7/-3   7%-3
-7/-3  -7%-3

3 个答案:

答案 0 :(得分:6)

在C89中,对于负操作数,除法/的结果可以被截断。

在C99或更高版本中,结果将被截断为零。

%运算符取决于所有标准中/的行为。

参考文献:

  

C89§3.3.5

     

如果任一操作数为负,则/运算符的结果是小于或等于代数商的最大整数还是大于或等于代数商的最小整数是实现定义的,如是%运算符结果的符号。如果商a/b是可表示的。表达式(a/b) * b + a%b应等于a

并且

  

C11§6.5.5

     

当整数被分割时,/运算符的结果是代数商,丢弃了任何小数部分

脚注:

  

这通常被称为“截断为零”

答案 1 :(得分:0)

由于%取决于/(它们实际上是相同的操作,/返回商,而%返回余数。)然后你得到的是基于提供的操作数。 C遵循代数规则,因此以下是正确的:

  • 操作顺序遵循PEMDAS:括号,指数,乘/除,加/减。
  • 对于乘法/除法,两个正数或负数导致正数。一个正数和一个负数导致否定答案。

答案 2 :(得分:0)

结果取决于编译器遵循的语言规范。运营商/%通过以下关系相互关联

(a / b) * b + (a % b) == a

标准C89 / 90表示除法的结果是实现定义的:允许编译器实现欧几里德除法(向负无穷大截断,非负余数)或Fortran式除法(截断为零,可能是负面的余数)。

欧几里德分部

-7/3 = -3  -7%3 = 2
7/-3 = -2  7%-3 = 1
-7/-3 = 3 -7%-3 = 2

在Fortran风格的部门

-7/3 = -2  -7%3 = -1
7/-3 = -2  7%-3 = 1
-7/-3 = 2 -7%-3 = -1

标准C99(及更高版本)要求所有C编译器实现Fortran风格的划分。

旁注:C ++贯穿于C ++ 03,一直坚持实现定义的规范。 C ++ 11要求Fortran风格的部门。