int m(int a) {
int res[] = {0, 1, 2};
int i; /* = 0; */
if (a < 0) {
/* do some complicated stuff */
i = 0;
} else if (a == 0) {
/* do some other stuff, we just want to return res[2], but
* forgot to set i to the appropriate value...
*/
} else {
i = 1;
}
return res[i];
}
5条答案
按热度按时间iszxjhcz1#
这是好的:
字符串
其中
someFunc()
定义为:型
这不好
型
但是作为一个良好的编程习惯 (可维护性,可读性,主动bug预防),只初始化总是一个好主意:
型
vdgimpew2#
从程序的Angular 来看,不立即初始化变量是完全没有问题的。因此:
字符串
完全没问题
但是发生的事情是,人们(包括我自己)会在
10001
行之前开始使用这个变量,忘记他们没有初始化它,得到垃圾,然后认为代码有问题。你知道恐慌发作,* 为什么这东西不工作?* 你会这样做:型
哦,该死的,我的
use(a)
函数不工作,而不是花一两个小时调试完美工作的代码。一些编译器会给你给予警告,但有些不会。这有点像汽车里的安全带,你不太可能发生事故,但你还是戴上了它,你不应该等到看到警察才戴上它,因为在你到达警察之前,你发生事故的机会很小。
t9aqgxwy3#
如果变量在初始化之前从未被读取,并且变量在被读取之前总是被初始化(在每个代码路径中),那么是的,这很好。在所有其他情况下,你应该初始化你的变量。
cgfeq70w4#
在C语言中,从一个被初始化的变量中阅读是一种未定义的行为,所以这是错误的。但是没有理由用它的定义来初始化一个变量。
虽然许多C开发人员习惯于使用其定义初始化自动(局部)变量,但我反对这种做法,并指导我工作的团队不要默认使用其定义初始化自动变量。虽然使用定义初始化变量的目的是避免错误阅读未初始化的数据,但实际上它经常隐藏逻辑错误。
使用现代编译器和代码检查工具(像Sonar,Polyspace,.)你会得到警告和错误,如果你有一个代码路径,它可以读取一个unitialized变量.如果你初始化变量,你会沉默这个有价值的警告.我更喜欢在每一个可能的代码路径和初始化变量,当我真的知道它的预期值,而不是使用一些默认值,这在大多数情况下都是错误的。
考虑一下这样的代码,其中
else if
分支是通过稍后对函数的编辑添加的:字符串
此代码(没有初始化)将产生一些未定义的行为,这真的很糟糕。* 然而 *,使用现代的编译器或正常的代码检查器,您将在此处获得有关逻辑错误的有价值的警告。通过使用其定义将
i
初始化为0来消除此警告(这是一种常见的做法)将使此警告静音,您将不得不进行长时间的调试以找到错误;也许在你写了实际代码的几个月后。编译器警告会在你完成这些垃圾操作后几分钟跳出来。kgqe7b3p5#
如果你有一个被单位化的变量,并且不要试图从它们中读取有意义的值,那么现在不会发生任何不好的事情(你可以读取它们,也不会发生任何不好的事情,但是它们的内容是垃圾)。
但是,初始化尽可能多的变量是一个很好的做法,因为即使你的代码现在可能很好,如果你以后改变它,如果你留下一些变量没有初始化,你可能会引入更难找到错误。
特别是当有很多不同的可能执行路径时,比如多线程/进程/中断。