初始化变量

时间:2013-03-04 12:10:14

标签: c++ c variables

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

例如,我有这段代码:

#include <stdio.h>

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,代码工作正常,但我想知道,它更快,更好,更有效吗?初始化变量是否合适?

7 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

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

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

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

因此,始终使用初始化是一种很好的做法

答案 2 :(得分:3)

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

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

  1. 如果存在读取错误或EOF(可以通过实现定义的方式触发,通常在Windows上为CTRL + Z,在Linux上为CTRL + d),则小于零的值,
  2. 当转换失败时(例如,当你'在stdin上输入'a'时,小于提供给scanf的对象数量(因为你只提供了一个对象,这个失败返回值将为0)) ve告诉scanf将'0'...'9'的序列转换为整数),
  3. scanf设法分配给的对象数。在您的情况下,这是1。
  4. 由于您没有检查任何这些返回值(特别是#3),因此您的编译器无法推断出初始化是必要的,因此无法对其进行优化。当变量未初始化时,无法检查这些返回值会导致未定义的行为。一只鸡可能看起来像是活着,即使它缺少它的头部。最好检查scanf的返回值。这样,当您的变量未初始化时,您可以避免使用未初始化的值,并且当它不是您的编译器时可以优化掉初始化,假设您通过生成错误消息而不是使用变量来处理错误的返回值。

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

    if(number < 0)
        number= -number;
    

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

    第6.5节第5段说:

      

    如果在评估过程中出现异常情况   表达式(即,如果结果未在数学上定义或   不在其类型的可表示值的范围内),行为   未定义。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

之前,你需要回答这个问题:

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

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

之后,int inizialization在你的代码中没有太大的变化,但字符串inizialization是。

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

答案 5 :(得分:1)

我无法告诉你有多少次我看过简单错误,因为程序员没有初始化变量。就在两天前,有another question on SO问题的最终结果是OP没有初始化变量,因此存在问题。

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

另请注意,我的经验是,在为大型公司编码时,他们将通过coverityklocwork等工具运行您的代码,这些工具会导致未初始化的变量,因为它们会带来安全风险。

答案 6 :(得分:-1)

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