函数的输出将是4,但我无法理解为什么会这样。如果你可以推断x%y时的情况,当y>时,我们非常感激。 X
int main()
{
int x=4%5;
printf("x=%d\n",x);
return 0;
}
答案 0 :(得分:3)
4 / 5 = 0
和0 * 5 + 4 = 4
,其余为4
。
C将余数运算符%
定义为(在c11中,6.5.5p6):
(a/b)*b + a%b shall equal a.
答案 1 :(得分:0)
模数运算将为x%y,如果x> y且y> x,则存在两个条件。如果x> y,则操作后的余数x / y将是答案。如果y> x,x将是答案,因为如果4%5它将首先计算4/5并且它将是0.因此0 * 5 + 4将是等式而4是余数。因此,如果在x%y中,如果y> x,则输出将为x。
答案 2 :(得分:0)
FWIW,这里a%b
对于消极,零和正a
做了什么,其中b
是+3和-3:
a = -6: b=+3 a/b = -2 a%b = +0 : b=-3 a/b = +2 a%b = +0
a = -5: b=+3 a/b = -1 a%b = -2 : b=-3 a/b = +1 a%b = -2
a = -4: b=+3 a/b = -1 a%b = -1 : b=-3 a/b = +1 a%b = -1
a = -3: b=+3 a/b = -1 a%b = +0 : b=-3 a/b = +1 a%b = +0
a = -2: b=+3 a/b = +0 a%b = -2 : b=-3 a/b = +0 a%b = -2
a = -1: b=+3 a/b = +0 a%b = -1 : b=-3 a/b = +0 a%b = -1
a = +0: b=+3 a/b = +0 a%b = +0 : b=-3 a/b = +0 a%b = +0
a = +1: b=+3 a/b = +0 a%b = +1 : b=-3 a/b = +0 a%b = +1
a = +2: b=+3 a/b = +0 a%b = +2 : b=-3 a/b = +0 a%b = +2
a = +3: b=+3 a/b = +1 a%b = +0 : b=-3 a/b = -1 a%b = +0
a = +4: b=+3 a/b = +1 a%b = +1 : b=-3 a/b = -1 a%b = +1
a = +5: b=+3 a/b = +1 a%b = +2 : b=-3 a/b = -1 a%b = +2
a = +6: b=+3 a/b = +2 a%b = +0 : b=-3 a/b = -2 a%b = +0
表示:a == ((a / b) * b) + (a % b)
正如所宣传的那样。你会发现b
的符号并不重要,结果与a
的符号相同。
另外,((-a) % b) == -(a % b)
- 也就是说,您可以计算a % b
将采用两者的绝对值进行的操作,并将结果赋予a
的符号。< / p>
注意a / b
(对于整数)被定义为&#34;截断(朝向零)&#34; (C99 6.5.5),因此对于-2 / +3
,答案是0
。这对%
的定义很重要。正是这种截断导致上面的图案关于零对称。
进一步注意, 与常规算术余数(每欧几里德除法)相同,其余值始终为正(或零) - 与任一参数的符号无关。欧几里德分部说:q = a / b, where a = q * b + r, and 0 <= r < abs(b)
,其中r
是余数。这给出了不同的模式:
a = -6: b=+3 q=-2 r=0 : b=-3 q=+2 r=0
a = -5: b=+3 q=-2 r=1 : b=-3 q=+2 r=1
a = -4: b=+3 q=-2 r=2 : b=-3 q=+2 r=2
a = -3: b=+3 q=-1 r=0 : b=-3 q=+1 r=0
a = -2: b=+3 q=-1 r=1 : b=-3 q=+1 r=1
a = -1: b=+3 q=-1 r=2 : b=-3 q=+1 r=2
a = +0: b=+3 q=+0 r=0 : b=-3 q=+0 r=0
a = +1: b=+3 q=+0 r=1 : b=-3 q=+0 r=1
a = +2: b=+3 q=+0 r=2 : b=-3 q=+0 r=2
a = +3: b=+3 q=+1 r=0 : b=-3 q=-1 r=0
a = +4: b=+3 q=+1 r=1 : b=-3 q=-1 r=1
a = +5: b=+3 q=+1 r=2 : b=-3 q=-1 r=2
a = +6: b=+3 q=+2 r=0 : b=-3 q=-2 r=0
这显然不再是关于零的对称。但是q
和r
的模式在无穷大处开始,并且从零到达+无限(以及超越)继续前进。