当 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


现在关于其他语言。常见的方法(JavaC#PythonRuby)是在您尝试评估 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 的语义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

matlab mod 函数

PHP中的运算符

c 整数运算

数字类型及操作

[python]运算符与表达式

php运算符