作为一名数学家,我最讨厌的C语言之一是

(-1) % 8 // comes out as -1, and not 7

fmodf(-1,8) // fails similarly

最好的解决方案是什么?

C++允许模板和操作符重载的可能性,但这两者对我来说都是浑水摸鱼.我们非常感激地收到了这些例子.

推荐答案

首先,我想指出的是,你甚至不能相信(-1) % 8 == -1.你唯一能依靠的就是(x / y) * y + ( x % y) == x.然而,余数是否为负值则为implementation-defined.

编号:C++03第5.6段第4条:

二元/运算符产生商,而二元%运算符产生第一个表达式除以第二个表达式的余数.如果/或%的第二个操作数为零,则行为未定义;否则(a/b)*b+a%b等于a.如果两个操作数均为非负,则其余操作数为非负;100.

这里,它遵循处理两个负操作数的版本,以便可以从dividend中减go divisor中的remainder的结果,因此它将是实际除法的floor.mod(-1,8)等于7,而mod(13, -8)是-3.

int mod(int a, int b)
{
   if(b < 0) //you can check for b == 0 separately and do what you want
     return -mod(-a, -b);   
   int ret = a % b;
   if(ret < 0)
     ret+=b;
   return ret;
}

C++相关问答推荐

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

VS代码C/C++扩展intellisense无法检测环境特定函数'

堆栈帧和值指针

为什么在此程序中必须使用Volatile关键字?

为什么可以在typedef之前使用typedef d struct 体?

如何知道我是否从非阻塞套接字读取所有内容

如何将常量char*复制到char数组

插座打开MacOS组件

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

覆盖读取函数,但当文件描述符为3或4时,我有问题

链接器脚本和C程序使用相同的头文件,这可能吗?

如何使这个While循环在新行上结束

如何在C宏定义中包含双引号?

unions 的原子成员是个好主意吗?

C程序printf在getchar while循环后不工作

程序打印一些随机空行

中位数和众数不正确

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

在C中定义函数指针?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?