当y为0时,模运算符x%y的语义是什么?

时间:2013-11-11 07:50:40

标签: c operators semantics modulus modular-arithmetic

假设我尝试执行以下操作:

y = 0;
z = x % y;

是这个明确定义,依赖于平台还是未定义的语义?我主要是关于C / C ++的问题,但我对各种编程/脚本语言(Java,perl,sh等)的答案很感兴趣。

我问的部分是因为different possible种方式来定义模运算:作为the remainder of a division operation;作为size of a quotient group等等。

3 个答案:

答案 0 :(得分:6)

C的行为未定义。

来自 C11 6.5.5乘法运算符,p5

  

/运算符的结果是来自分区的商   第一个操作数由第二个操作数; %运算符的结果是   剩余。在两个操作中,如果第二个操作数的值是   零,行为未定义。

答案 1 :(得分:1)

JavaScript已明确定义:

  

ECMAScript浮点余数运算的结果是   由IEEE算法规则确定:[...]

     

如果被除数是无穷大,或除数是零,或两者兼而有之,   结果是NaN


现在关于其他语言。常见的方法(JavaC#PythonRuby)是在您尝试评估{{1}时向您抛出某种ZeroDivisionError表达。

对于Perl来说,它更有趣:

somenum % 0

现在,此代码导致use Data::Dumper; print Dumper 0 % 0; print 'Something else'; 错误;但是如果你放了Illegal modulus zero,你会看到0 / 0消息。两者都是错误(停止执行剩余的代码),当然,不是警告。


现在PHP选择了不同的立场:

Illegal division by zero

如您所见,结果会得到var_dump(0 % 0); // it's the same for any numeric dividend // Warning: Division by zero in ... // bool(false) (原文如此),但警告is triggered。但这是可以忽略的;如果您将false级别设置为error_reporting,您甚至不会看到它。

答案 2 :(得分:0)

在Java中

,如果你尝试编译

public static void main(String[] args) {
    int x = 10,y,z;
    y = 0;
    z = x % y;
    System.out.println("Z: " + z);
} 

您将收到以下消息:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at locationConfiguration.LocationConfigurator.main

所以,你将无法做模零。