2013-08-28 69 views
0

我在C中%操作符有问题。我知道%操作符给出了除法的其余部分。但是当遇到像1 % 23 % 2这样的问题时,我感到困惑。 Google搜索后,我找到了不同的解决方案。C语言中%操作符的问题

有人说,作为1/20.5,我们四舍五入下来到0。所以1 % 2为0

也有人说,作为1/20.5,我们反而圆了起来,就像我们会在数学,1因此1 % 2是1.

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

预先感谢您:) :)

+0

对于M%D,无论何时M Jiminion

+0

@Jim我认为你想要“0 <= M chux

+0

@chux,对于上述断言是肯定的,M和D需要大于0. – Jiminion

回答

3

简而言之,两者都是错误的方法。正如你所说%发现其余部门。

因此1/2等于0余1

答案是这样1.

此外,试验自己,你也可以使用此程序:

#include <stdio.h> 

main() 
{ 
    int remainder; 

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

希望这有助于:)

+0

非常感谢,这使事情更清晰 –

1

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

所以,二分之一是0和1%2是1

4

%是余数运算符:

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

这是该部门留下的。例如:

5%3是2。
5%4是1
5%2是1.(由于2可以在5适合2次,1将被左)

当做1%2的结果是1,因为1/2是0,余数是1.

+0

这没有意义。编辑你的第二行。 :) – WozzeC

+1

@WozzeC太多的工作时间..谢谢;) – Maroun

+2

为了迂回,'%'是C中剩下的**操作符。负操作数存在一个重要区别(模数的数学定义)。 –

2

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

While (M >= D){ 
    M = M-D; 
} 
return M; 
0

这里您需要余数的数学定义。

给定两个整数米,d,我们说[Rd如果[R满足两个条件划分的其余

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

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