我知道有时如果你没有初始化int
,你会得到一个随机数,如果你打印整数。
但是将所有内容初始化为零似乎有些愚蠢。
我问,因为我正在评论我的C项目并且我非常直接进行缩进并且它完全编译(90/90谢谢Stackoverflow)但是我希望在样式点上得到10/10。
所以,问题是:何时适合初始化,何时应该声明一个变量:
int a = 0;
VS。
int a;
答案 0 :(得分:33)
在某些情况下,不应初始化变量:
static
关键字或全局变量)并且您希望初始值为零时。如果你明确初始化,大多数编译器实际上会在二进制文件中存储零,这通常只是浪费空间(可能是大型数组的巨大浪费)。除了这些问题之外,我认为在可能的情况下初始化非静态变量通常是一种好习惯。
答案 1 :(得分:24)
尚未提及的规则是:当在函数内声明变量时,它不会被初始化,并且当它在静态或全局范围内声明时,它被设置为0:
int a; // is set to 0
void foo() {
int b; // set to whatever happens to be in memory there
}
然而 - 为了便于阅读,我通常会在申报时初始化所有内容。
如果您有兴趣详细了解此类内容,我建议您this presentation和this book
答案 2 :(得分:5)
静态和全局变量将初始化为零,因此您可以跳过初始化。自动变量(例如函数体中定义的非静态变量)可能包含垃圾,应该总是初始化。
如果初始化时需要非零特定值,则应始终显式初始化。
答案 3 :(得分:5)
如果变量属于函数的范围而不是类的成员,我始终初始化它,否则您将收到警告。即使稍后将使用此变量,我也希望在声明时分配它。
对于成员变量,您应该在类的构造函数中初始化它们。
对于指针,总是将它们初始化为某些默认值,特别是NULL,即使它们稍后要使用,它们在未初始化时也很危险。
此外,建议使用编译器支持的最高警告级别构建代码,这有助于识别不良做法和潜在错误。
答案 4 :(得分:4)
我可以想到几个理由:
稍后您将在代码中初始化它。
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);
答案 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)
通常,没有必要初始化变量,有两个明显的例外:
除此之外,还有关于将变量置于正确的状态,您希望它们用于您要执行的操作。如果你不打算在操作改变它们的值之前读取它们(并且操作不关心它处于什么状态),则不需要初始化它们。
就个人而言,我总是喜欢初始化它们;如果你忘了为它分配一个值,并且它被错误地传递给一个函数(比如剩余的缓冲区长度),那么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();