在C中初始化变量

Art*_*llé 21 c initialization

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

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

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

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

int a = 0;
Run Code Online (Sandbox Code Playgroud)

int a;
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 35

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

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

除了这些问题之外,我认为在可能的情况下初始化非静态变量通常是一种好习惯.


Tim*_*nes 26

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

int a; // is set to 0

void foo() {
  int b;  // set to whatever happens to be in memory there
}
Run Code Online (Sandbox Code Playgroud)

但是 - 为了便于阅读,我通常会在申报时初始化所有内容.

如果你有兴趣详细了解这类东西,我会推荐这个演示文稿本书


Tim*_*per 5

我能想到几个原因:

  1. 当您稍后在代码中对其进行初始化时。

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

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

  • 该代码将在 g++ 中生成警告,因为 x 在未初始化的情况下使用。 (2认同)

Ada*_*man 5

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

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


ani*_*nio 5

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

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

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

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