我知道有时候如果你不初始化一个int
类型的变量,在打印这个整数时你会得到一个随机数。
但是把所有东西都初始化为零好像有点儿愚蠢。
我问这个问题是因为我正在注释我的C项目,我的缩进非常直观而且它能够完全编译(谢谢Stackoverflow,90/90),但我想在样式分上得到10/10。
所以,问题来了:何时适当进行初始化,何时应该只声明一个变量:
int a = 0;
vs.
int a;
我知道有时候如果你不初始化一个int
类型的变量,在打印这个整数时你会得到一个随机数。
但是把所有东西都初始化为零好像有点儿愚蠢。
我问这个问题是因为我正在注释我的C项目,我的缩进非常直观而且它能够完全编译(谢谢Stackoverflow,90/90),但我想在样式分上得到10/10。
所以,问题来了:何时适当进行初始化,何时应该只声明一个变量:
int a = 0;
vs.
int a;
有几种情况下,您不应该初始化变量:
static
关键字或全局变量),且您希望初始值为零时。如果您明确初始化,大多数编译器实际上会在二进制文件中存储零,这通常只是一种浪费空间(对于大型数组可能是巨大的浪费)。除了这些问题之外,我认为在可能的情况下初始化非静态变量通常是一个好习惯。
When you're going to be initializing it later on in your code.
int x;
if(condition)
{
func();
x = 2;
}
else
{
x = 3;
}
anotherFunc(x); // x will have been set a value no matter what
When you need some memory to store a value set by a function or another piece of code:
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
这些只是几个例子,其中初始化变量并不是严格必要的,因为它稍后会被设置(但不会在声明和初始化之间访问)。
总的来说,在声明时始终初始化您的变量不会有任何损失(事实上,这可能是最佳实践)。
变量初始化没有任何理由不做,编译器足够聪明,如果一个变量被赋值两次,它会忽略第一次赋值。代码很容易变得庞大,你曾经认为的事情(例如在使用前赋值变量)现在已经不再成立。请考虑:
int MyVariable;
void Simplistic(int aArg){
MyVariable=aArg;
}
//Months later:
int MyVariable;
void Simplistic(int aArg){
MyVariable+=aArg; // Unsafe, since MyVariable was never initialized.
}
一个没问题,另一个会让你陷入麻烦。有时你的应用程序在调试模式下可以运行,但在发布模式下会抛出异常,其中一个原因是使用未初始化的变量。
MyVariable
具有静态存储期,因此不可能未初始化。如果没有明确初始化,则其初始值为零。 - R.. GitHub STOP HELPING ICE通常情况下,没有必要初始化变量,但有两个例外:
除此之外,就是确保变量处于你希望执行操作的正确状态。如果你不会在操作改变变量值之前读取它们(并且操作不在乎它们的状态),那么就没有必要初始化它们。
个人而言,我总是喜欢初始化它们;如果你忘记给它赋值,并且错误地把它传递给函数(例如剩余缓冲区长度),0通常可以被清晰处理,而32532556则不能。
初始化变量,即使不是严格要求,也总是一个好习惯。在开发过程中多输入一些额外字符(如“= 0
”)可能会节省后续数小时的调试时间,特别是当忘记对某些变量进行初始化时。
顺便说一下,我认为将变量声明靠近其使用位置是一个好习惯。
以下是不好的:
int a; // line 30
...
a = 0; // line 40
以下是好的:
int a = 0; // line 40
另外,如果变量在初始化后就要被覆盖,例如
int a = 0;
a = foo();
最好将其写成
int a = foo();
echo'char foo [0x88888]; int main(void){return 0;}'| gcc-x c-&& readelf-a a.out | grep bss
给出... .bss NOBITS ... 0888a8 ...
。 - Joseph QuinseyType** pObject
并将指针重置为新对象。在我看来,在这种情况下,要求*pObject == NULL
是很自然的,这将更明确地表明我们使用参数作为纯“out”的意图。从理论上讲,这可能有助于找到内存泄漏(当函数被调用时,指向现有对象的指针被传递给它)。但归根结底,我不得不承认,这个讨论可能只是一种“圣战”,答案大多取决于程序员的偏好。 - Dmitrii Semikin