我遇到了C中%运算符的问题。我知道%运算符给出了除法的余数。但是,当遇到像1 % 2
或3 % 2
这样的问题时,我会感到困惑。谷歌搜索后,我找到了不同的解决方案。
有人说,当1 / 2
为0.5
时,我们将其舍入为0.所以1 % 2
为0。
其他人说,当1 / 2
为0.5
时,我们会像在数学中一样将它四舍五入为1.所以1 % 2
为1。
因此,我现在很困惑。我的问题是:什么是1%2?
提前谢谢:):))
答案 0 :(得分:4)
%
是余数运算符:
%运算符在除去第一个操作数后计算余数 第二次。
这是该师留下的。例如:
5%3是2.
5%4是1.
5%2是1.(因为2可以在5中适合2次,1将被留下)
当你做1%2时,结果是1,因为1/2是0,余数是.. 1。
答案 1 :(得分:3)
简单地说,两者都是错误的方法。如你所说%
找到除法的剩余部分。
因此1/2等于0余数1。
答案是1。
另外,为了体验自己,你可以使用这个程序:
#include <stdio.h>
main()
{
int remainder;
remainder = 1 % 2;
printf("1 %% 2 is %d", remainder);
return(0);
}
希望这会有所帮助:)
答案 2 :(得分:2)
想到M%D的简单方法(如果M和D都是正数)是:
While ( M >= D){
M = M-D;
}
return M;
答案 3 :(得分:1)
没有舍入,小数部分只是被截断。
因此, 1/2 为0而 1%2 为1。
答案 4 :(得分:0)
这里你需要对余数进行数学定义。
给定两个整数 m,d ,我们说 r 是 m 余数 >和 d 如果 r 满足两个条件:
m == k * d + r
和0 <= r < d
。在C中我们只有m % d == r
和m / d == k
,只需遵循上面的定义即可
正如你所看到的,根本就没有结合(我的意思是:“截断”是定义的结果)。
从定义中可以得出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。您必须小心编译器版本,并进行一些测试。