div()库函数的目的是什么?

当c使用/运算符来划分两个数时,具有div()库函数的目的是什么?

是否存在/不能使用但div()可以使用的场景?

从C99理由文件:

(7.20.6.2 div,ldiv和lldiv函数)因为当涉及负操作数时,C89具有用于划分有符号整数的实现定义语义,所以发明了C99中的div和ldiv以及lldiv,以便为签名提供明确指定的语义。整数除法和余数运算。 采用的语义与Fortran中的语义相同。 由于这些函数同时返回商和余数,因此它们还可以作为有效建模底层硬件的便捷方式,这些硬件将两个结果作为同一操作的一部分进行计算。 […]既然C99要求除法运算符具有相似的语义,新程序使用div,ldiv或lldiv的主要原因是同时获得商和余数。

div_t是一个结构,包含商成员余数成员。 例如 :

 typedef struct { int quot; int rem; } div_t; 

div函数的一些简单实现使用/%运算符。 您还可以看到此主题 。

div()返回除法的result remainder 。 因此,您不必使用%运算符来查找remainder

正如其他人提到的那样, div()会给你商和余数。 这是因为大多数C运行时使用的(软件)整数除法算法同时计算两者。

如果目标计算机没有硬件分隔符,则/运算符通常会变为对div()的调用,其余部分将被丢弃。 %运算符也会发生同样的事情,除了它是被抛出的商。 所以,如果你正在做这样的事情:

 quot = a / b; rem = a % b; 

你正在调用除法程序两次(如果你的计算机没有在硬件中执行,则除法很慢)。 因此使用div()来获取两者都会更快。

(当然,它的可读性也较低,你是否真正获得任何性能优势取决于你的特定平台和编译器。如果你确定它是性能瓶颈,你应该只切换到div() 。记住Knuth所说的过早性优化。)