3

Is it better to declare and initialize the variable or just declare it? What's the best and the most efficient way?

For example, I have this code:

#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;
}

If I don't initialize number, the code works fine, but I want to know, is it faster, better, more efficient? Is it good to initialize the variable?

4

6 回答 6

10

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

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

于 2013-03-04T12:14:49.327 回答
3

假设如果你没有初始化一个变量并且你的代码是错误的。(例如你忘了读数字)。那么未初始化的数字值就是垃圾,不同的运行将输出(或表现)不同的结果。

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

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

因此,始终使用初始化是一个好习惯

于 2013-03-04T12:14:58.687 回答
3

不要将速度归因于语言;该属性属于语言的实现。有快速实现和慢实现。有与快速实现相关的优化;如果编译器可以推断出它不需要初始化,则生成优化好的机器代码的编译器将优化初始化。

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

  1. 如果存在读取错误或 EOF(可以以实现定义的方式触发,通常是 Windows 上的 CTRL+Z 和 Linux 上的 CTRL+d),则值小于零,
  2. 当发生转换失败时(例如,当您告诉 scanf 时在标准输入上输入 'a'将 '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 段说:

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

于 2013-03-04T12:26:19.580 回答
1

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

1)这个函数调用了多少次?如果您调用 10.000.000 次,那么最好是最好的。

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

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

确保你做了所有的控制,因为如果你有一个未初始化的变量,你的程序可能是错误的。

于 2013-03-04T12:18:35.517 回答
1

我无法告诉你我见过多少次简单的错误,因为程序员没有初始化变量。就在两天前,还有一个关于 SO的问题,其中面临的问题的最终结果只是 OP 没有初始化变量,因此存在问题。

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

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

于 2013-03-04T12:21:39.460 回答
1

使用现代编译器,效率不会有任何差异。编码风格是主要考虑因素。一般来说,如果您在声明所有变量时对其进行初始化,您的代码将更加不言自明,并且不太可能出现错误。但是,在您给出的情况下,由于该变量已由 scanf 有效地初始化,因此我认为最好不要进行冗余初始化。

于 2013-03-04T12:15:30.937 回答