我在C中%操作符有问题。我知道%操作符给出了除法的其余部分。但是当遇到像1 % 2
或3 % 2
这样的问题时,我感到困惑。 Google搜索后,我找到了不同的解决方案。C语言中%操作符的问题
有人说,作为1/2
是0.5
,我们四舍五入下来到0。所以1 % 2
为0
也有人说,作为1/2
是0.5
,我们反而圆了起来,就像我们会在数学,1因此1 % 2
是1.
因此,我现在感到困惑。我的问题是:什么是1%2?
预先感谢您:) :)
我在C中%操作符有问题。我知道%操作符给出了除法的其余部分。但是当遇到像1 % 2
或3 % 2
这样的问题时,我感到困惑。 Google搜索后,我找到了不同的解决方案。C语言中%操作符的问题
有人说,作为1/2
是0.5
,我们四舍五入下来到0。所以1 % 2
为0
也有人说,作为1/2
是0.5
,我们反而圆了起来,就像我们会在数学,1因此1 % 2
是1.
因此,我现在感到困惑。我的问题是:什么是1%2?
预先感谢您:) :)
简而言之,两者都是错误的方法。正如你所说%
发现其余部门。
因此1/2等于0余1
答案是这样1.
此外,试验自己,你也可以使用此程序:
#include <stdio.h>
main()
{
int remainder;
remainder = 1 % 2;
printf("1 %% 2 is %d", remainder);
return(0);
}
希望这有助于:)
非常感谢,这使事情更清晰 –
没有四舍五入,小数部分被简单地截取。
所以,二分之一是0和1%2是1
想想M%D(如果M和D都是正数)的简单方法是:
While (M >= D){
M = M-D;
}
return M;
这里您需要余数的数学定义。
给定两个整数米,d,我们说[R是米和d如果[R满足两个条件划分的其余:
m == k * d + r
和0 <= r < d
。在C中,我们有m % d == r
和m/d == k
,只是按照上面的定义。
正如你所看到的那样,根本没有任何拘泥(我的意思是:“截断”是定义的结果)。
从定义,可以obtainded即3%2 == 1和3/2 == 1
其它实例:
4/3 == 1和5/3 == 1,尽管5.0/3.0 == 1.6666(其中 将舍入为2.0)。
4%3 == 1个5%3 == 2.
您也可以相信式r = m - k * d
,其在C被写为:
m % d == m - (m/d) * d
然而在标准C中,整数除法遵循以下规则:round to 0
。
因此,负数的操作数C提供了不同的结果,即数学的结果。
我们将有:
(-4)/ 3 == -1,(-4)%3 == -1(在C),但在普通的数学:(-4)/ 3 = -2,(-4)%3 = 2.
在普通数学中,其余总是非负的,并且小于abs(d)
。
在标准C中,其余部分总是具有第一个运算符的符号。
备注:此说明(否定的情况下)仅适用于标准C99/C11。你必须小心你的编译器版本,并做一些测试。
对于M%D,无论何时M
Jiminion
@Jim我认为你想要“0 <= M
chux
@chux,对于上述断言是肯定的,M和D需要大于0. – Jiminion