0

我对 C 中的 % 运算符有疑问。我知道 % 运算符给出了除法的余数。但是,当遇到类似1 % 2or的问题时3 % 2,我会感到困惑。谷歌搜索后,我找到了不同的解决方案。

有人说按原样1 / 20.5我们将其向下舍入为 0。0 也是如此1 % 2

其他人说按原样1 / 20.5我们改为将其四舍五入,就像我们在数学中那样,到 1。所以1 % 2是 1。

因此,我现在很困惑。我的问题是: 什么是 1 % 2?

先感谢您 :):)

4

5 回答 5

4

%是余数运算符:

% 运算符计算第一个操作数除以第二个后的余数

这是分部留下的。例如:

5 % 3 是2。5
% 4 是
1。5 % 2 是 1。(因为 2 可以在 5 中放 2 次,所以会留下 1)

当您执行 1 % 2 时,结果为 1,因为 1/2 为 0,余数为.. 1。

于 2013-08-28T14:35:59.470 回答
3

简单地说,两者都是错误的方法。正如你所说%,找到除法的其余部分。

因此 1/2 等于 0 余数 1。

因此答案是 1。

另外,为了自己试验,你可以使用这个程序:

#include <stdio.h>

main()
{
    int remainder;

    remainder = 1 % 2;
    printf("1 %% 2 is %d", remainder);
    return(0);
}

希望这可以帮助 :)

于 2013-08-28T14:36:42.067 回答
2

考虑 M % D 的简单方法(如果 M 和 D 都是正数)是:

While ( M >= D){
    M = M-D;
}
return M;
于 2013-08-28T14:46:31.067 回答
1

没有四舍五入,小数部分被简单地截断。

因此,1 / 2为 0,1 % 2为 1。

于 2013-08-28T14:35:08.863 回答
0

在这里,您需要关于余数的数学定义。

给定两个整数m, d ,如果r满足两个条件 ,我们说rmd相除的余数:

  • 存在另一个整数k使得m == k * d + r, 和
  • 0 <= r < d.

在 C 中,我们有m % d == rm / 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。你必须小心你的编译器版本,并做一些测试。

于 2013-08-28T23:06:09.557 回答