假设我尝试执行以下操作:
y = 0;
z = x % y;
是这个明确定义,依赖于平台还是未定义的语义?我主要是关于C / C ++的问题,但我对各种编程/脚本语言(Java,perl,sh等)的答案很感兴趣。
我问的部分是因为different possible种方式来定义模运算:作为the remainder of a division operation;作为size of a quotient group等等。
答案 0 :(得分:6)
C的行为未定义。
来自 C11 6.5.5乘法运算符,p5
/运算符的结果是来自分区的商 第一个操作数由第二个操作数; %运算符的结果是 剩余。在两个操作中,如果第二个操作数的值是 零,行为未定义。
答案 1 :(得分:1)
JavaScript已明确定义:
ECMAScript浮点余数运算的结果是 由IEEE算法规则确定:[...]
如果被除数是无穷大,或除数是零,或两者兼而有之, 结果是
NaN
。
现在关于其他语言。常见的方法(Java,C#,Python,Ruby)是在您尝试评估{{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)
,如果你尝试编译
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
所以,你将无法做模零。