在C中初始化变量

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

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

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

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

 int a = 0; 

 int a; 

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

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

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

如果你有兴趣详细了解这类事情,我会推荐这个演讲和本书

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

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

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

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

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

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

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

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

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

我可以想到几个理由:

  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 xa value here scanf("%d", &x); 

初始化变量总是很好的做法,但有时并不是绝对必要的。 考虑以下:

 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 

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

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

通常,不需要初始化变量,但有两个明显的例外:

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

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

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

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

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

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

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

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

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

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

以下是坏事:

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

以下是好的:

 int a = 0; // line 40 

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

 int a = 0; a = foo(); 

写它是更好的

 int a = foo();