当前位置: 首页 > 知识库问答 >
问题:

变量的声明、定义和初始化有什么区别?

廖招
2023-03-14

看了问题,知道了声明和定义的区别,那么是不是说定义等于声明加初始化呢?

共有3个答案

邢嘉祯
2023-03-14

对于 C,至少根据 C11 6.7.5:

声明指定一组标识符的解释和属性。标识符的定义是该标识符的声明,该标识符:

> < li>

对于对象,导致为该对象保留存储。

对于函数,包括函数体;

对于枚举常量,是标识符的(唯一)声明;

对于 typedef 名称,是标识符的第一个(或唯一一个)声明。

根据C11 6.7.9.8-10:

初始化器指定存储在对象中的初始值……如果具有自动存储的对象未显式初始化,则其值不确定。

因此,从广义上讲,声明引入了一个标识符并提供了有关它的信息。对于变量,定义是为该变量分配存储的声明。

初始化是要存储在对象中的初始值的规范,它不一定与第一次显式为其赋值时相同。无论是否显式地给变量赋值,定义变量时都会有一个值。如果您没有显式地给它一个值,并且变量有自动存储,那么它将有一个初始值,但该值将是不确定的。如果它有静态存储,它将根据类型隐式初始化(例如,指针类型初始化为html" target="_blank">空指针,算术类型初始化为零,等等)。

因此,如果您定义一个自动变量而没有为其指定初始值,例如:

int myfunc(void) {
    int myvar;
    ...

您定义了它(因此也声明了它,因为定义是声明),但没有初始化它。因此,定义不等于声明加初始化。

谭梓
2023-03-14

宣言说“这东西存在于某个地方”:

int foo();       // function
extern int bar;  // variable
struct T
{
   static int baz;  // static member variable
};

定义说“这个东西存在在这里;为它留下记忆“:

int foo() {}     // function
int bar;         // variable
int T::baz;      // static member variable

在定义对象时,初始化是可选的,它会说“这是这个东西的初始值”:

int bar = 0;     // variable
int T::baz = 42; // static member variable

有时候在声明的时候也是可以的:

struct T
{
   static int baz = 42;
};

...但这涉及更复杂的功能。

萧自珍
2023-03-14

声明,通常是指在程序中引入新名称。例如,您可以通过描述新函数的“签名”来声明它:

void xyz();

或者声明一个不完整的类型:

class klass;
struct ztruct;

最后但同样重要的是,声明一个对象:

int x;

在C标准第3.1/1节中,它被描述为:

声明(第7条)可以将一个或多个名称引入翻译单元或重新声明先前声明引入的名称。

定义是先前声明的名称的定义(或者它可以是定义和声明)。例如:

int x;
void xyz() {...}
class klass {...};
struct ztruct {...};
enum { x, y, z };

具体而言,C标准在§3.1/1中将其定义为:

声明是一个定义,除非它在不指定函数体的情况下声明一个函数(8.4),它包含外部说明符(7.1.1)或链接规范25(7.5),既不是初始化器也不是函数体,它在类定义中声明一个静态数据成员(9.2,9.4),它是一个类名声明(9.1),它是一个不透明的枚举声明(7.2),它是一个模板参数(14.1),它是一个函数声明符中的参数声明(8.3.5),它不是函数定义的声明符,或者它是一个typedef声明(7.1.3),一个别名声明(7.1.3),一个使用声明(7.3.3),一个static_assert声明(第7条),一个属性声明(第7条)、空声明(第7条)或使用指令(7.3.4)。

初始化是指在构造时“赋值”。对于 T 类型的泛型对象,它通常采用以下形式:

T x = i;

但是在C语言中可以是:

T x(i);

甚至:

T x {i};

与C 11。

那么这是否意味着定义等于声明加初始化?

看情况。你在说什么。例如,如果你在谈论一个物体:

int x;

这是一个没有初始化的定义。相反,以下是一个带有初始化的定义:

int x = 0;

在一定的语境下,谈论“初始化”、“定义”和“声明”是没有意义的。如果你谈论的是一个函数,例如,初始化并不意味着什么。

所以,答案是否定的:定义并不自动意味着声明加初始化。

 类似资料:
  • 看完问题后,我知道了声明和定义之间的区别。那么它是否意味着定义等于声明加初始化呢?

  • 本文向大家介绍tensorflow 声明和初始化可变张量,包括了tensorflow 声明和初始化可变张量的使用技巧和注意事项,需要的朋友参考一下 示例 当值需要在会话中更新时,使用可变张量。这是在创建神经网络时将用于权重矩阵的张量类型,因为这些值将在训练模型时更新。 可以使用或函数声明可变张量。建议使用,因为它提供了更大的灵活性,例如:tf.Variable()tf.get_variable()

  • 问题内容: 两者的含义使我难以理解。 问题答案: 甲声明引入的标识符和描述了它的类型,无论是类型,对象,或功能。声明是编译器需要接受对该标识符的引用的内容。这些是声明: 甲定义实际实例化/器具该标识符。这是什么样的连接器需要以链接引用这些实体。这些是与上述声明相对应的定义: 可以使用定义代替声明。 可以根据需要多次声明标识符。因此,以下内容在C和C ++中是合法的: 但是,必须定义一次。如果忘记定

  • 问题内容: 我对这两个词感到非常困惑。我检查了stackoverflow,对于C ++有一个类似的问题,但对于Java没有。 有人可以解释一下Java的两个术语之间的区别吗? 问题答案: 概念上的区别很简单: 声明 :您 声明的 是某些东西,例如类,函数或变量。你不说任何事情 什么 是类或函数的样子,你刚才说,它的存在。 定义 :您 定义 某种事物的实现方式,例如类,函数或变量,即您说的 是 实际

  • 问题内容: 我对Java开关有一个疯狂的问题。 方案1-当为2时,它成功地将值打印为2。 方案2-当我要在其中注释时,saying地说 “本地变量值可能尚未初始化” 。 问题: 场景1:如果执行流程没有转到(当时),那么它如何知道value变量的类型为? 方案2:如果编译器将value变量的类型识别为,则它必须已访问。(声明和初始化)中的表达式。那为什么它会吱吱作响?当我要发表评论时,说 本地变量

  • 问题内容: 我有这个代码: 这会导致编译错误:可能尚未初始化,这很公平。 现在,我将代码更改为: 我得到同样的编译错误!我必须初始化为null: 那么,不初始化对象和初始化为null有什么区别?如果我声明一个没有初始化的对象,它是否为null? 谢谢 问题答案: 字段(成员变量)被初始化为(或初始化为默认的原始值,如果它们是原始的) 局部变量未初始化,您有责任设置初始值。