在C中初始化变量

问题描述 投票:20回答:10

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

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

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

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

int a = 0;

int a;
c initialization
10个回答
24
投票

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

int a; // is set to 0

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

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

如果你有兴趣详细了解这类事情,我会推荐this presentationthis book


0
投票

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

顺便说一句,我觉得声明一个接近其用途的变量是好的。

以下是坏事:

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

以下是好的:

int a = 0;  // line 40

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

int a = 0;
a = foo();

写它是更好的

int a = foo();

33
投票

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

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

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


5
投票

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

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

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

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


5
投票

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

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


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);

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

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

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


2
投票

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

  1. 你正在声明一个指针(而不是立即指定它) - 你应该总是把它们设置为NULL作为好的风格和防御性编程。
  2. 如果在声明变量时,您已经知道要为其分配什么值。进一步的分配占用更多的CPU周期。

除此之外,它是关于将变量置于正确的状态,您希望它们用于您将要执行的操作。如果您在操作更改其值之前不打算读取它们(并且操作不关心它处于什么状态),则无需初始化它们。

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


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.
}

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.