在C中初始化变量

时间:2011-11-02 01:57:38

标签: c initialization

我知道有时如果你没有初始化int,你会得到一个随机数,如果你打印整数。

但是将所有内容初始化为零似乎有些愚蠢。

我问,因为我正在评论我的C项目并且我非常直接进行缩进并且它完全编译(90/90谢谢Stackoverflow)但是我希望在样式点上得到10/10。

所以,问题是:何时适合初始化,何时应该声明一个变量:

int a = 0;

VS。

int a;

10 个答案:

答案 0 :(得分:33)

在某些情况下,不应初始化变量:

  1. 当它具有静态存储持续时间(static关键字或全局变量)并且您希望初始值为零时。如果你明确初始化,大多数编译器实际上会在二进制文件中存储零,这通常只是浪费空间(可能是大型数组的巨大浪费)。
  2. 当您立即将变量的地址传递给另一个填充其值的函数时。在这里,初始化只是浪费时间,可能会让代码的读者感到困惑,他们想知道为什么要将某些东西存储在一个即将被覆盖的变量中。
  3. 在后续代码完成执行之前,无法确定变量的有意义值。在这种情况下,使用虚拟值(如零/ NULL)初始化变量会非常有害,因为如果您有一些从未分配有意义值的代码路径,会阻止编译器发出警告。编译器善于警告您访问未初始化的变量,但不能警告您“仍然包含虚拟值”变量。
  4. 除了这些问题之外,我认为在可能的情况下初始化非静态变量通常是一种好习惯。

答案 1 :(得分:24)

尚未提及的规则是:当在函数内声明变量时,它不会被初始化,并且当它在静态或全局范围内声明时,它被设置为0:

int a; // is set to 0

void foo() {
  int b;  // set to whatever happens to be in memory there
}

然而 - 为了便于阅读,我通常会在申报时初始化所有内容。

如果您有兴趣详细了解此类内容,我建议您this presentationthis book

答案 2 :(得分:5)

静态和全局变量将初始化为零,因此您可以跳过初始化。自动变量(例如函数体中定义的非静态变量)可能包含垃圾,应该总是初始化。

如果初始化时需要非零特定值,则应始终显式初始化。

答案 3 :(得分:5)

如果变量属于函数的范围而不是类的成员,我始终初始化它,否则您将收到警告。即使稍后将使用此变量,我也希望在声明时分配它。

对于成员变量,您应该在类的构造函数中初始化它们。

对于指针,总是将它们初始化为某些默认值,特别是NULL,即使它们稍后要使用,它们在未初始化时也很危险。

此外,建议使用编译器支持的最高警告级别构建代码,这有助于识别不良做法和潜在错误。

答案 4 :(得分:4)

我可以想到几个理由:

  1. 稍后您将在代码中初始化它。

    int x;
    
    if(condition)
    {
        func();
        x = 2;
    }
    else
    {
       x = 3;
    }
    anotherFunc(x); // x will have been set a value no matter what
    
  2. 当您需要一些内存来存储由函数或另一段代码设置的值时:

    int x;  // Would be pointless to give x a value here
    scanf("%d", &x);
    

答案 5 :(得分:3)

初始化变量总是很好的做法,但有时候严格是必要的。请考虑以下事项:

int a;
for (a = 0; a < 10; a++) { } // a is initialized later

void myfunc(int& num) {
  num = 10;
}

int a;
myfunc(&a); // myfunc sets, but does not read, the value in a

char a;
cin >> a; // perhaps the most common example in code of where
          // initialization isn't strictly necessary

这些只是几个例子,其中不一定要初始化变量,因为它稍后设置(但不能在声明和初始化之间访问)。

总的来说,总是在声明时初始化变量并没有什么坏处(事实上,这可能是最好的做法)。

答案 6 :(得分:2)

通常,没有必要初始化变量,有两个明显的例外:

  1. 你正在声明一个指针(而不是立即指定它) - 你 应始终将这些设置为NULL作为良好的风格和防御 节目。
  2. 如果,当您声明变量时,您已经知道了     什么价值将分配给它。进一步的任务用完了     更多CPU周期。
  3. 除此之外,还有关于将变量置于正确的状态,您希望它们用于您要执行的操作。如果你不打算在操作改变它们的值之前读取它们(并且操作不关心它处于什么状态),则不需要初始化它们。

    就个人而言,我总是喜欢初始化它们;如果你忘了为它分配一个值,并且它被错误地传递给一个函数(比如剩余的缓冲区长度),那么0通常是干净利落的 - 32532556不会。

答案 7 :(得分:2)

绝对没有理由不应该初始化变量,如果变量被分配两次,编译器就足够聪明地忽略第一个赋值。代码的大小很容易增加,你认为理所当然的东西(例如在使用之前分配变量)不再是真的。考虑:

int MyVariable;
void Simplistic(int aArg){
    MyVariable=aArg;
}

//Months later:

int MyVariable;
void Simplistic(int aArg){
    MyVariable+=aArg; // Unsafe, since MyVariable was never initialized.
}

一个人没事,另一个人陷入困境。有时您会遇到应用程序在调试模式下运行的问题,但是发布模式会引发异常,其中一个原因是使用了未初始化的变量。

答案 8 :(得分:1)

只要我在写入变量之前没有从变量中读取,我就不必费心去初始化它。

在写作之前阅读会导致严重且难以捕捉到错误。我认为这类错误足以在流行的SICP讲座视频中获得提及。

答案 9 :(得分:0)

初始化变量,即使不是严格要求,也始终是一个好习惯。在开发过程中键入的少量额外字符(如“= 0”)可能会节省数小时的调试时间,特别是在忘记某些变量未初始化时。

顺便说一句,我认为声明一个接近其使用的变量是好的。

以下是不好的:

int a;    // line 30
...
a = 0;    // line 40

以下是好的:

int a = 0;  // line 40

此外,如果要在初始化后立即覆盖变量,例如

int a = 0;
a = foo();

最好将其写为

int a = foo();