Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的任何数字除以0,是否属于分段错误?_C_Segmentation Fault_Undefined Behavior_Divide By Zero - Fatal编程技术网

C中的任何数字除以0,是否属于分段错误?

C中的任何数字除以0,是否属于分段错误?,c,segmentation-fault,undefined-behavior,divide-by-zero,C,Segmentation Fault,Undefined Behavior,Divide By Zero,我知道它属于未定义的行为,但它是否意味着分割错误?CPU如何处理除以0的情况 当我运行这个程序时,我会得到浮点异常(内核转储)。一般来说,浮点异常是更一般的异常类的一个例子。具体细节因机器而异 有许多事情会“杀死”您的程序,在这方面,所有这些都可以归类为例外: 访问不存在的内存 对内存的访问不正确(未对齐、写入只读等) 除以0 非法指令 超出资源限制(例如CPU时间) 算术溢出 在类Unix操作系统下,对不存在的内存的访问通常是“分段冲突”,而对内存的不当访问通常是“总线错误”。(在Wind

我知道它属于未定义的行为,但它是否意味着分割错误?CPU如何处理除以0的情况


当我运行这个程序时,我会得到浮点异常(内核转储)。

一般来说,浮点异常是更一般的异常类的一个例子。具体细节因机器而异

有许多事情会“杀死”您的程序,在这方面,所有这些都可以归类为例外:

  • 访问不存在的内存
  • 对内存的访问不正确(未对齐、写入只读等)
  • 除以0
  • 非法指令
  • 超出资源限制(例如CPU时间)
  • 算术溢出
在类Unix操作系统下,对不存在的内存的访问通常是“分段冲突”,而对内存的不当访问通常是“总线错误”。(在Windows下,它们是/曾经是一般性保护违规,和/或a。)

如您所见,虽然除以0是一个例外,但它是分段冲突的同级,而不是子集

(我将算术溢出列为异常是因为它可能是,而不是因为它通常是。当然,今天的大多数系统并不将溢出视为异常。但根据C的规则,它们可以,除了无符号整数上的溢出,C要求定义并表现良好。)

在类Unix操作系统下,大多数/所有这些异常都倾向于映射到信号,您的程序可以捕获这些信号,以便继续(尝试)而不是死亡


(具有讽刺意味的是,在我刚刚尝试过的系统上,整数除以0会给我一个“浮点异常”,而浮点除以0会给我一个IEEE-754
inf
,这根本不是异常。但这是一个。)

如果行为没有定义,就意味着对发生的事情没有定义。因此,提出“这是否意味着分割错误”的问题意味着你没有抓住重点。任何事情都有可能发生

另外,有许多CPU,并且您没有指定一个,所以回答“CPU如何处理除以0”当然也是不可能的


您可以捕获异常,并在代码中处理它们。

浮点异常不是分段错误。如果您要询问对特定系统的影响,请回答您的问题并告诉我们是哪个系统。CPU通过抛出硬件异常来处理它。就是这样,它与C语言或操作系统无关。毫无意义的UB问题,请看未定义的含义。具体发生的情况取决于您的机器和环境。顺便说一句,如果使用IEEE-754格式,浮点类型上可以很好地定义0除。它是UB:“/运算符的结果是第一个操作数除以第二个操作数的商;%运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。”@用户694733谢谢。(你帮我省了一次下楼去拿标准副本的行程。)删除了句子。仅供参考,我还注意到这个答案实际上更像是一个评论,而且有点刺耳。你能改写吗?
int main()
{
    int x = 5, y = 0;
    int z = x / y;
    return 0;
}