繁体   English   中英

初始化变量

Initialize a variable

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

例如,我有这个代码:

#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 个回复

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

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

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

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

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

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

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

在这种情况下,它确实需要初始化。 考虑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段说:

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

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

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

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

2)如果我不对我的变量进行inizialize,我确信我的代码是安全的,不会抛出任何异常?

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

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

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

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

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

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

1 多次初始化变量

我有一个静态功能,用于序列化特定输入类型的Xml文档。 以下是方法: 从各个页面调用此方法,因此类型可能不同。 考虑到内存的最小使用量,我应该使用哪一个。 同样,正如我的架构师所说的那样,XmlSerializer不会被GC收集,它会保留在那里。 只能使用此假设。 Q. ...

2 变量必须被初始化

我有一个类型别名,如: typealias FetchCompletionHandler = (FetchResponse?, FetchError?) -&gt; 我必须将其作为参数传递给函数的单元,但我收到“必须初始化变量”的错误。 我已将变量声明如下: val fetchCompletionH ...

3 变量初始化

如果我在函数可能未初始化变量操作码上遇到错误,应该在此方法内部还是在类的开头进行此操作。 非常感激任何的帮助。 ...

4 变量初始化

在下面的代码中,变量x,y,z是在运行时在分配内存时还是在编译时初始化的? ...

2017-12-17 05:40:48 3 120   c
5 初始化变量

是否可以在C中执行类似的操作? 注意foo是一个void函数,否则通过返回新的bar可以很容易地解决问题。 此外,即使bar是一个指针,还是指向一个指针的指针,例如typedef int ** bar ,我也没有看到foo如何初始化a 我提出了我的问题,因为我相信GMP会做类似的 ...

6 变量初始化

我想将seq编号存储在firebase中,每次当我尝试将seq编号添加到firebase中时,它必须隐蔽并添加。 例如:1,2,3 .. 我的问题是因为将seqno初始化为0,每次将其初始化并添加为1,1,1 ... Firebase数据 我只需要从子树中检索路径字段。 ...

2016-02-17 08:14:10 2 79   java
7 如何初始化变量?

我正在为我的课程编写一个程序,其中必须使用for循环从键盘上获取两个数字。 然后,程序应将第一个数字提高到第二个数字的幂。 使用for循环进行计算。 我收到错误消息inum3尚未初始化(我理解是因为循环可能永远不会进入),但我无法弄清楚如何使它工作。 第25和28行是具体的。 ...

8 如何初始化变量

你好我想构建一个程序,从给定的两个数字中找到偶数和奇数。 当我构建它时,它说成功,但它仍然说警告 C4700:使用了未初始化的局部变量“编号” 当我调试它时出现调试错误如何解决这个问题? 谁能告诉我它发生的原因? 太感谢了 下面是代码 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM