初始化变量

声明和初始化变量或仅声明它更好吗? 什么是最好和最有效的方式?

例如,我有这个代码:

#include  int main() { int number = 0; printf("Enter with a number: "); scanf("%d", &number); if(number < 0) number= -number; printf("The modulo is: %d\n", number); return 0; } 

如果我没有初始化number ,代码工作正常,但我想知道,它更快,更好,更有效吗? 初始化变量是否合适?

scanf可能会失败,在这种情况下,没有任何内容写入number 。 因此,如果您希望代码正确 ,则需要对其进行初始化(或检查scanf的返回值)。

错误代码的速度通常是无关紧要的,但对于你的示例代码,如果速度有差异,那么我怀疑你是否能够测量它。 将int设置为0比I / O快得多。

不要将速度归因于语言; 该属性属于语言的实现。 有快速实现和慢速实现。 有快速实施的优化; 如果能够推断出它不需要初始化,那么生成优化良好的机器代码的编译器将优化初始化。

在这种情况下,它实际上确实需要初始化。 考虑scanf是否失败。 当scanf失败时,它的返回值反映了这种失败。 它要么返回:

  1. 如果存在读取错误或EOF(可以通过实现定义的方式触发,通常在Windows上为CTRL + Z,在Linux上为CTRL + d),则值小于零,
  2. 当转换失败时(例如,当您告诉scanf时在stdin上输入’a’),一个小于scanf提供的对象数(因为您只提供了一个对象,此失败返回值将为0)将’0’…’9’的序列转换为整数),
  3. scanf设法分配给的对象数。 在你的情况下,这是1。

由于您没有检查任何这些返回值(特别是#3),因此您的编译器无法推断出初始化是必要的,因此无法对其进行优化。 当变量未初始化时,无法检查这些返回值会导致未定义的行为。 一只鸡可能看起来像是活着,即使它缺少它的头部。 最好检查scanf的返回值。 这样,当您的变量未初始化时,您可以避免使用未初始化的值,并且当它不是您的编译器时可以优化掉初始化,假设您通过生成错误消息而不是使用变量来处理错误的返回值。

编辑:关于未定义行为的主题,请考虑此代码中发生的情况:

 if(number < 0) number= -number; 

如果number是-32768,并且INT_MAX是32767,那么C标准的第6.5节第5段适用,因为 - ( - 32768)不能表示为int。

第6.5节第5段说:

如果在计算表达式期间发生exception情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义。

假设您没有初始化变量并且您的代码有问题(例如,您忘了读取数字)。 然后未初始化的数值是垃圾,不同的运行将输出(或表现)不同的结果。

但是如果初始化所有变量,那么它将产生恒定的结果。 容易追踪的错误。

是的,初始化步骤将在低级别的代码中添加额外的步骤。 例如,低级别代码中的mov $0, 28(%esp) 。 但它的一次性任务。 不会破坏您的代码效率。

所以,总是使用初始化是一个很好的做法

使用现代编译器,效率不会有任何差别。 编码风格是主要考虑因素。 通常,如果在声明所有变量时初始化所有变量,则代码更加不言自明,并且不太可能出错。 但是,在你给出的情况下,由于变量是由scanf有效初始化的,我认为最好不要进行冗余初始化。

在此之前,您需要回答以下问题:

1)这个function被称为多少时间? 如果你拨打10.000.000次,那么,拥有最好的是个好主意。

2)如果我没有对我的变量进行初始化,我确信我的代码是安全的并且不会抛出任何exception?

之后,int inizialization在您的代码中不会发生太大变化,但是字符串inizialization是。

确保你执行所有控件,因为如果你有一个非inimialized变量,你的程序可能会出错。

我不能告诉你有多少次我看到了简单的错误,因为程序员没有初始化变量。 就在两天前,还有另外一个问题 ,即问题的最终结果是OP没有初始化变量,因此存在问题。

当你谈到“速度”和“效率”时,不要只考虑代码编译或运行的速度有多快(在这种情况下,它几乎无关紧要)但考虑到代码中出现简单错误时的调试时间事实上你没有初始化一个非常容易的变量。

另请注意,我的经验是,在为大型公司编码时,他们将通过覆盖率或klocwork等工具运行您的代码,这将使您获得未初始化的变量,因为它们存在安全风险。

当变量已经有值时,你正在使用scanf。 这可能不适用于所有类型的编译器。 因此,如果您想从用户获取值,请不要初始化它。