C 为什么同一个程序在表意文字和代码块中的行为不同?

C 为什么同一个程序在表意文字和代码块中的行为不同?,c,C,此代码用于查找100!的数字之和!。我在ideone中得到了正确的输出,但在代码块中得到了错误的输出。请帮忙 #include <stdio.h> #include <stdlib.h> #define size_of_number 160 #define question 100 //Function Prototypes void initialise(int[]); int sum_of_digits(int[]); void factorial(int[],in

此代码用于查找100!的数字之和!。我在ideone中得到了正确的输出,但在代码块中得到了错误的输出。请帮忙

#include <stdio.h>
#include <stdlib.h>
#define size_of_number 160
#define question 100

//Function Prototypes
void initialise(int[]);
int sum_of_digits(int[]);
void factorial(int[],int);

int main()
{
    int number[size_of_number];
    int sum;

    initialise(number);

    factorial(number, question);
    //Getting the sum of the digits of the number
    sum = sum_of_digits(number);
    printf("The sum of the digits of %d! is %d.\n",question, sum);

    return 0;
}

//Initially, the number is 0 so all it's digits are set to zero.
void initialise(int number[])
{
    int i;
    for(i = 0; i < size_of_number; i++)
    {
        number[i] = 0;
    }
}

//Finding the factorial by multiplying the digits
void factorial(int number[], int num)
{
    int i, first_digit;
    int carry, replace, product;

    first_digit = 0;
    number[first_digit] = 1;

    while(num != 1)
    {
        carry = 0;
        for(i = 0; i <= first_digit; i++)
        {
            product = num*number[i] + carry;
            replace = product%10;
            carry = product/10;
            number[i] = replace;

            if( (i == first_digit) && (carry > 0) )
            {
                first_digit++;
            }
        }

        num--;
    }
}

//Finding the sum of all digits
int sum_of_digits(int number[])
{
    int i, sum;

    for(i = 0; i < size_of_number; i++)
    {
        sum = sum + number[i];
    }
    return sum;
}
#包括
#包括
#定义\u编号160的大小\u
#定义问题100
//功能原型
无效初始化(int[]);
整数位数之和(整数[]);
无效阶乘(int[],int);
int main()
{
整数[整数的大小];
整数和;
初始化(数字);
阶乘(数,问题);
//获取数字的位数之和
sum=数字的总和(数字);
printf(“第%d!个数字的和是第%d个。\n”,问题,和);
返回0;
}
//最初,数字是0,所以它的所有数字都设置为零。
无效初始化(整数[])
{
int i;
对于(i=0;i<数量的大小;i++)
{
数字[i]=0;
}
}
//用数字相乘求阶乘
无效阶乘(整数[],整数)
{
int i,第一位数字;
国际运输,更换,产品;
第一位数字=0;
数字[第一位]=1;
while(num!=1)
{
进位=0;
对于(i=0;i=0))
{
第一位数字++;
}
}
num--;
}
}
//求所有数字的和
整数位数之和(整数编号[])
{
int i,总和;
对于(i=0;i<数量的大小;i++)
{
总和=总和+数字[i];
}
回报金额;
}

我也有一些其他程序的问题。为什么s代码块没有给出正确的输出,即648?

在函数
sum\u of
中不初始化
sum
。正常的局部变量在C中不会自动获得起始值,因此您的程序具有C标准所称的未定义行为。任何事情都可能发生,但通常会发生的是,变量从内存中变量恰好位于的位置的任何数据开始。

在函数
sum\u of digits
中,您不会初始化
sum
。正常的局部变量在C中不会自动获得起始值,因此您的程序具有C标准所称的未定义行为。任何事情都有可能发生,但通常情况下,变量是从内存中变量所在位置的任何数据开始的。

TL;DR.如果包含未定义或实现定义的behavior.TL,则其行为可能会有所不同;如果包含未定义或实现定义的行为,它的行为可能会有所不同。未初始化的局部变量在Java中不会获得默认值,它们会导致编译器错误。向上投票,因为净效果是一样的,但你仍然应该修正措辞。我还不能接受答案。应用程序告诉我等九分钟。谢谢你的帮助!顺便说一句,你读了程序,很快就理解了错误@用户230452。这就是长时间读写代码时发生的情况。继续说。你可能在问@ThomasPadron McCarthy,但我觉得不错。事实上,这么快就发现了错误,这是一个很好的迹象。我同意。您可能希望在代码审阅时发布程序以获得更完整的答案。未初始化的局部变量在Java中不会获得默认值,它们会导致编译器错误。向上投票,因为净效果是一样的,但你仍然应该修正措辞。我还不能接受答案。应用程序告诉我等九分钟。谢谢你的帮助!顺便说一句,你读了程序,很快就理解了错误@用户230452。这就是长时间读写代码时发生的情况。继续说。你可能在问@ThomasPadron McCarthy,但我觉得不错。事实上,这么快就发现了错误,这是一个很好的迹象。我同意。您可能希望在代码评审中发布您的程序,以获得更完整的答案。