当 y 为 0 时,模运算符 x % y 的语义是啥?
Posted
技术标签:
【中文标题】当 y 为 0 时,模运算符 x % y 的语义是啥?【英文标题】:What is the semantic for the modulo operator x % y, when y is 0?当 y 为 0 时,模运算符 x % y 的语义是什么? 【发布时间】:2013-11-22 22:57:33 【问题描述】:假设我尝试执行以下操作:
y = 0;
z = x % y;
这个语义是定义明确的、平台相关的还是未定义的?我主要询问 C/C++,但对各种编程/脚本语言(Java、perl、sh 等)的答案很感兴趣
我之所以这样问,部分原因是有 different possible 定义模运算的方法: As the remainder of a division operation;如size of a quotient group等
【问题讨论】:
你在 Python 中得到一个ZeroDivisionError
。
现在(编辑后)这是一个不同的问题,我想更适合 Math.SE。事实上,one 已经有了。
@raina77ow:我只是在解释为什么语义与除以零相同并非完全微不足道。我真的只是想知道不同的语言规范是怎么说的。
【参考方案1】:
JavaScript 的定义很好:
ECMAScript 浮点余数运算的结果是 由 IEEE 算术规则确定:[...]
如果被除数为无穷大,或除数为零,或两者兼有,则 结果是
NaN
。
现在关于其他语言。常见的方法(Java、C#、Python、Ruby)是在您尝试评估 somenum % 0
表达式时向您抛出某种 ZeroDivisionError
。
对于 Perl,它更有趣一点:
use Data::Dumper;
print Dumper 0 % 0;
print 'Something else';
现在,此代码导致Illegal modulus zero
错误;但是如果你把0 / 0
改为,你会看到Illegal division by zero
消息。两者都是错误(停止执行剩余代码),当然不是警告。
现在 php 在这方面选择了一些不同的立场:
var_dump(0 % 0); // it's the same for any numeric dividend
// Warning: Division by zero in ...
// bool(false)
如您所见,您得到false
(原文如此),但警告is triggered。不过,这是可以忽略的;你有没有把error_reporting
级别设置为E_ERROR
,你甚至都不会看到它。
【讨论】:
那么,即使操作数是整数,它也是 NaN? (是的,我知道 javascript 是鸭子类型的)? 啊,我明白你的意思了。是的,Number % Number
给你NaN
- 但你猜怎么着,typeof NaN
给你'number'
。 )【参考方案2】:
在 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
所以,你不能做模零。
【讨论】:
public static void main(String[] args) int x = 10,y,z; y = 0; z = x % y; System.out.println("Z:" + z);我将其用作代码并收到了该错误消息 'try to compile' 用词有点不正确。代码编译得很好;当一个运行程序时会抛出异常。 对不起raina77ow。这个网站还是有点新的。我正在努力改进我的描述 =)!【参考方案3】:行为对于 C 来说是未定义的。
来自C11 6.5.5 乘法运算符,p5
/ 运算符的结果是除法的商 第二个操作数的第一个操作数; % 运算符的结果是 余。在这两个操作中,如果第二个操作数的值是 零,行为未定义。
【讨论】:
+1,也许应该补充一点,它只在 C11 中明确说明,在 C99 中这只是隐含的。 请注意同一部分中的另一个相关段落(有点改写)-When integers are divided, if the quotient a/b is not representable, the behavior of both a/b and a%b is undefined.
以上是关于当 y 为 0 时,模运算符 x % y 的语义是啥?的主要内容,如果未能解决你的问题,请参考以下文章