我对 C 中的 % 运算符有疑问。我知道 % 运算符给出了除法的余数。但是,当遇到类似1 % 2
or的问题时3 % 2
,我会感到困惑。谷歌搜索后,我找到了不同的解决方案。
有人说按原样1 / 2
,0.5
我们将其向下舍入为 0。0 也是如此1 % 2
。
其他人说按原样1 / 2
,0.5
我们改为将其四舍五入,就像我们在数学中那样,到 1。所以1 % 2
是 1。
因此,我现在很困惑。我的问题是: 什么是 1 % 2?
先感谢您 :):)
我对 C 中的 % 运算符有疑问。我知道 % 运算符给出了除法的余数。但是,当遇到类似1 % 2
or的问题时3 % 2
,我会感到困惑。谷歌搜索后,我找到了不同的解决方案。
有人说按原样1 / 2
,0.5
我们将其向下舍入为 0。0 也是如此1 % 2
。
其他人说按原样1 / 2
,0.5
我们改为将其四舍五入,就像我们在数学中那样,到 1。所以1 % 2
是 1。
因此,我现在很困惑。我的问题是: 什么是 1 % 2?
先感谢您 :):)
%
是余数运算符:
% 运算符计算第一个操作数除以第二个后的余数。
这是分部留下的。例如:
5 % 3 是2。5
% 4 是
1。5 % 2 是 1。(因为 2 可以在 5 中放 2 次,所以会留下 1)
当您执行 1 % 2 时,结果为 1,因为 1/2 为 0,余数为.. 1。
简单地说,两者都是错误的方法。正如你所说%
,找到除法的其余部分。
因此 1/2 等于 0 余数 1。
因此答案是 1。
另外,为了自己试验,你可以使用这个程序:
#include <stdio.h>
main()
{
int remainder;
remainder = 1 % 2;
printf("1 %% 2 is %d", remainder);
return(0);
}
希望这可以帮助 :)
考虑 M % D 的简单方法(如果 M 和 D 都是正数)是:
While ( M >= D){
M = M-D;
}
return M;
没有四舍五入,小数部分被简单地截断。
因此,1 / 2为 0,1 % 2为 1。
在这里,您需要关于余数的数学定义。
给定两个整数m, d ,如果r满足两个条件 ,我们说r是m和d相除的余数:
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。你必须小心你的编译器版本,并做一些测试。