为何两段代码只因s=0位置的不同就导致一个有输出结果

为何两段代码只因s=0位置的不同就导致一个有输出结果,一个没有。s=0定义在int中时没有结果,定义在第一个for循环中时有结果。

#include<iostream>
using namespace std;
int main()
{
    int a,s,i,j;
    cout<<"please enter the number:"<<endl;
    for(i=1;i<1000;i++)
    {
        s=0;
        for(j=1;j<i;j++)
            if(i%j==0)
            {
                s=s+j;
            }
        if(s==i)
        {
            cout<<s<<"是完数:";
            for(a=1;a<s;a++)
            {
                if(s%a==0)
                    cout<<a<<" "; 
            }cout<<endl;
        }
    }
    return 0;
}


#include<iostream>
using namespace std;
int main()
{
    int a,s=0,i,j;
    cout<<"please enter the number:"<<endl;
    for(i=1;i<1000;i++)
    {
        for(j=1;j<i;j++)
            if(i%j==0)
            {
                s=s+j;
            }
        if(s==i)
        {
            cout<<s<<"是完数:";
            for(a=1;a<s;a++)
            {
                if(s%a==0)
                    cout<<a<<" "; 
            }cout<<endl;
        }
    }
    return 0;
}


在循环中需要对s值进行复位,所以s=0在循环中一定要有
因为每一个循环都是对循环值i进行完数判断,s是i的所有因子之和,因此它是对每个i都要计算出s的值。如果s不复位为0,那么它将是所有i值的因子之和,所以就不对了
============
如果s=0只在循环外面,那么它只是对第一个i值是否完数判断进行了复位,后面的i值就没有复位了

这跟在哪定义没有关系
你如果在循环中不给s清零,它会一直变大的呀
它本来是用来算一个数各个位数之和的
如果执行s+=j之前s不清零,那它就不是一个数的各个位数之和,而是所有数的各个位数之和