C变量已经有值了吗?

C变量已经有值了吗?,c,C,对于C语言来说是个新手,所以请原谅我,如果这是基本的,但我无法在谷歌上找到一个成功的搜索词 当我开始学习一门新语言时,我喜欢在ProjectEuler上做一些问题,所以我从问题一开始就遇到了这个问题 我的代码 #include <stdio.h> int main() { int x; int sum; for (x = 0; x < 10; x++) { if ( x % 3 == 0 || x % 5 == 0 ) {

对于C语言来说是个新手,所以请原谅我,如果这是基本的,但我无法在谷歌上找到一个成功的搜索词

当我开始学习一门新语言时,我喜欢在ProjectEuler上做一些问题,所以我从问题一开始就遇到了这个问题

我的代码

#include <stdio.h>

int main()
{
    int x;
    int sum;

    for (x = 0; x < 10; x++) {
            if ( x % 3 == 0 || x % 5 == 0 ) {
                    sum = sum + x;
                    printf( "number is %d. sum is %d\n", x, sum );
            }
    }
    printf( "The sum of the multiples of 3 and 5 below 1000 is %d\n", sum );
}
嗯……我可以看到它在正确地增加,但为什么这个数字从32767开始?它就这样存在于我的记忆中吗?是否有其他程序设置了一个sum变量,它现在被这个函数调用

如果是这样的话,为什么当我运行两次程序时结果仍然是一样的呢?它似乎总是从32767开始

我通过将其设置为
int sum=0来很明显地解决它


但我想了解在我的原始代码中发生了什么

与C#和Java等其他编程语言不同,C不会自动初始化其变量,这意味着在创建变量时,您将看到分配给变量的内存位置上有任何随机数据


因此,在使用变量之前,必须始终将变量设置为某个初始值(数字变量通常为零)。

与C#和Java等其他编程语言不同,C不会自动初始化其变量,这意味着您将在创建变量时看到分配给该变量的内存位置上的任意随机数据


因此,在使用变量之前,必须始终将变量设置为某个初始值(数值变量通常为零)。

函数中声明的局部变量不会由运行时初始化。它们是在堆栈上分配的,并且具有未定义的值(无论发生在该堆栈位置的是什么)


全局范围中定义的变量将自动初始化为0。

函数中声明的局部变量不会由运行时初始化。它们是在堆栈上分配的,并且具有未定义的值(无论发生在该堆栈位置的是什么)


全局范围中定义的变量将自动初始化为0。

未初始化的变量可以包含任何值(在您的情况下为32767),甚至可以包含陷阱表示。事实上,尝试访问未初始化的调用未定义的行为,这使得从按预期工作到运行时崩溃的一切都成为可能

由于
sum
预计从
0
开始,请按以下步骤初始化它:

int sum = 0;

未初始化的变量可以包含任何值(本例中为32767),甚至可以包含陷阱表示。事实上,尝试访问未初始化的调用未定义的行为,这使得从按预期工作到运行时崩溃的一切都成为可能

由于
sum
预计从
0
开始,请按以下步骤初始化它:

int sum = 0;


你期望会发生什么?就像我说的,我是C语言的新手,所以我以前从未处理过这些问题。我知道这与内存有关,而不是设置变量,但我想问的是场景背后发生了什么。您应该对代码的功能有所期待。我希望它从0开始工作。看到结果,我可以看到我需要将它设置为0,我怎么能期望32797出来呢?顺便说一句,IDKIt不会总是32797。你期望会发生什么?就像我说的,我是C新手,所以我以前从未处理过这些问题。我知道这与内存有关,而不是设置变量,但我想问的是场景背后发生了什么。您应该对代码的功能有所期待。我希望它从0开始工作。看到结果,我可以看到我需要将它设置为0,我怎么能期望32797出来呢?顺便说一句,IDKIt不会总是32797。这正是我想要的。谢谢,自动存储并没有初始化,但静态存储是。@teppic:OP在更仔细地研究C规范时,应该很容易明白这一事实。最好养成手动初始化每个变量的习惯。32767是最大的16位有符号整数(除符号位外,所有位都设置为1)。一些编译器为未初始化的变量设置sentinel值,以便您可以清楚地看到它们在调试器中未初始化。未初始化内存通常设置为,这正是我要查找的。谢谢,自动存储并没有初始化,但静态存储是。@teppic:OP在更仔细地研究C规范时,应该很容易明白这一事实。最好养成手动初始化每个变量的习惯。32767是最大的16位有符号整数(除符号位外,所有位都设置为1)。一些编译器为未初始化的变量设置sentinel值,以便您可以清楚地看到它们在调试器中未初始化