得到一个太少的除数

kyl*_*e k 0 c math counter division divider

这是一个计算数字除数的数量的程序,但它实际上比该数字的除数少一个.

#include <stdio.h>

int i = 20;
int divisor;
int total;

int main()
{
    for (divisor = 1; divisor <= i; divisor++)
    {
        if ((i % divisor == 0) && (i != divisor))
        {
            total = total++;
        }
    }
    printf("%d %d\n", i, total);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

数字20有6个除数,但程序说有5个除数.

pax*_*blo 5

&& (i != divisor)
Run Code Online (Sandbox Code Playgroud)

意味着20不会被视为除数.如果你想要它被考虑,抛弃那些代码,你将获得整套,{1, 2, 4, 5, 10, 20}.

即使您希望将该数字视为除数,您仍然可以放弃该代码,而只是使用<而不是<=for语句中.

和:

total = total++;
Run Code Online (Sandbox Code Playgroud)

完全没必要.它甚至可能是未定义的,我现在只是懒得检查它并不重要,因为没有人长时间写这样的代码:-)

使用:

total = total + 1;
Run Code Online (Sandbox Code Playgroud)

或更好):

total++;
Run Code Online (Sandbox Code Playgroud)

  • 每个标签都是C,所以`total = total ++;`是完全未定义的行为.6.5(2):"如果对标量对象的副作用相对于对同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义." (2认同)