在C中初始化变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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
}
但是 - 为了便于阅读,我通常会在申报时初始化所有内容。
如果你有兴趣详细了解这类事情,我会推荐this presentation和this book
初始化变量,即使不是严格要求,也始终是一个好习惯。在开发过程中输入的少数额外字符(如“= 0
”)可能会节省数小时的调试时间,特别是在忘记某些变量未初始化时。
顺便说一句,我觉得声明一个接近其用途的变量是好的。
以下是坏事:
int a; // line 30
...
a = 0; // line 40
以下是好的:
int a = 0; // line 40
此外,如果要在初始化之后立即覆盖变量,例如
int a = 0;
a = foo();
写它是更好的
int a = foo();
在某些情况下,您不应该初始化变量:
- 当它具有静态存储持续时间(
static
关键字或全局变量)并且您希望初始值为零时。如果你明确初始化,大多数编译器实际上会在二进制文件中存储零,这通常只是浪费空间(对于大型数组可能是一个巨大的浪费)。 - 当您将立即将变量的地址传递给另一个填充其值的函数时。在这里,初始化只是浪费时间,并且可能会让代码的读者感到困惑,他们想知道为什么要将某些内容存储在即将被覆盖的变量中。
- 在后续代码完成执行之前,无法确定变量的有意义值。在这种情况下,使用虚拟值(如零/ NULL)初始化变量会非常有害,因为如果您有一些从未分配有意义值的代码路径,这会阻止编译器发出警告。编译器善于警告您访问未初始化的变量,但不能警告您“仍然包含虚拟值”变量。
除了这些问题之外,我认为在可能的情况下初始化非静态变量通常是一种好习惯。
如果变量在函数的范围内而不是类的成员,我总是初始化它,否则你将收到警告。即使稍后将使用此变量,我也希望在声明时分配它。
对于成员变量,您应该在类的构造函数中初始化它们。
对于指针,总是将它们初始化为某些默认值,特别是NULL,即使它们稍后要使用,它们在未初始化时也很危险。
此外,建议使用编译器支持的最高级别的警告来构建代码,这有助于识别不良做法和潜在错误。
静态和全局变量将初始化为零,因此您可以跳过初始化。自动变量(例如在函数体中定义的非静态变量)可能包含垃圾,应该总是初始化。
如果初始化时需要非零特定值,则应始终显式初始化。
我可以想到几个理由:
- 当您稍后在代码中初始化它时。
int x; if(condition) { func(); x = 2; } else { x = 3; } anotherFunc(x); // x will have been set a value no matter what
- 当您需要一些内存来存储由函数或另一段代码设置的值时:
int x; // Would be pointless to give x a 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
这些只是几个例子,其中不一定要初始化变量,因为它稍后设置(但在声明和初始化之间不能访问)。
一般来说,总是在声明时初始化变量并没有什么坏处(事实上,这可能是最好的做法)。
通常,没有必要初始化变量,有两个明显的例外:
- 你正在声明一个指针(而不是立即指定它) - 你应该总是把它们设置为NULL作为好的风格和防御性编程。
- 如果在声明变量时,您已经知道要为其分配什么值。进一步的分配占用更多的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.
}
一个是好的,另一个让你陷入困境。有时您会遇到应用程序在调试模式下运行的问题,但是发布模式会抛出异常,其中一个原因是使用了未初始化的变量。
只要我在写入之前没有从变量中读取,我就不必费心去初始化它。
在写作之前阅读会导致严重且难以捕捉到错误。我认为这类错误足以在流行的SICP讲座视频中获得提及。
以上是关于在C中初始化变量的主要内容,如果未能解决你的问题,请参考以下文章
vscode 用户代码片段 vue初始化模板 Snippet #新加入开头注释 自动生成文件名 开发日期时间等内容