我倾向于交替使用定义、声明和分配这些词,但这似乎对某些人造成冒犯。这是合理的吗?我应该只在第一次分配给变量时使用声明这个词吗?或者还有更多的东西吗?
8 回答
定义是描述值或函数的地方,即准确地告诉编译器或程序员它是什么,例如
int foo()
{
return 1;
}
int var; // or, e.g. int var = 5; but this is clearer.
声明告诉编译器或程序员该函数或变量存在。例如
int foo();
extern int var;
赋值是指设置变量的值,通常使用 = 运算符。例如
a = b;
a = foo();
定义和声明是相似的,但分配是非常不同的。
在这里,我声明(或定义)一个变量:
int x;
在这里,我为该变量赋值:
x = 0;
在这里,我在一个声明中同时做这两个:
int x = 0;
笔记
并非所有语言都支持在一个语句中声明和赋值:
T-SQL
declare x int;
set x = 0;
某些语言要求您在声明时为变量赋值。此要求允许语言的编译器或解释器推断变量的类型:
Python
x = 0
使用正确的术语很重要,否则人们不会知道你在说什么,或者错误地认为你不知道你在说什么。
这些术语在各种语言的标准中通常具有精确的含义。在这种情况下,不应将它们混为一谈。
例如在 c 中:
一个函数可能只定义一次(当你说它做什么时),但它也可以在此之前声明(当你说它接受什么参数以及它返回什么类型时)。
同样,当您说出它是什么类型时,就会声明一个变量,并且每个范围仅发生一次。但是你可以重复赋值。(一些语言还区分初始化(在声明时给变量一个值)和赋值(稍后更改值)。)
差异可能看起来很微妙,但它们很重要。并非每种语言都有相同的区别,但在 C++ 中,变量声明使编译器知道变量的类型和名称
int i;
变量定义分配存储空间并为变量指定初始值。
i = 1;
您可以像通常那样将变量声明和定义组合到一个语句中。
int x = 1;
在函数内声明变量也会为变量留出内存,所以下面的代码隐式定义变量a
作为其声明的一部分。
int main()
{
int a;
return 0;
}
由于变量a
是由编译器自动定义的,它将包含分配给它的内存位置中的任何值。这就是为什么在您明确为它们分配已知值之前使用自动变量是不安全的。
每当您更改程序中变量的值时,都会发生赋值。
x = 2;
x++;
x += 4;
函数声明,类似于变量声明,使编译器知道函数签名。这允许您在定义之前调用源代码中的函数,而不会导致编译器错误。
int doSomething(float x);
函数定义指定函数的返回类型、名称、参数列表和指令。这些元素中的前三个必须与函数声明相匹配。一个函数只能在给定程序中定义一次。
int doSomething(float x)
{
if( x < 0 )
{
x = -x;
}
return static_cast<int>(x);
}
您可以将函数声明和定义合二为一,但您必须在程序中的任何位置调用该函数之前这样做。
一般作用: 定义=声明+保留空间。
定义、声明和赋值有两种情况:
- 对于变量。
- 对于函数。
对于变量:
--定义:
告诉编译器为变量保留内存。
int x;
--声明:
告诉编译器该变量定义在别处。
extern int x;
--赋值:
告诉编译器将值放入变量中。
x = 0;
对于功能:
--定义:
int functionDef(int x){
int x;
...
...
...
return x;
}
--声明: 只是函数的原型。
int functionDef(int x);
正确答案取决于您所谈论的语言。计算机语言通常有特定的术语,要么是因为语言规范,要么是因为围绕该语言发展起来的社区。在我使用 COBOL 时,它的术语与更主流的语言(在更接近语言开发主流而非主流业务的语言的意义上)有很大不同。Forth 开发了一些奇怪的术语。
如果你懂英语,你通常可以从它的正常含义中很好地了解一个单词的含义,但不要太依赖它。跨语言或语言社区的特定单词也是如此。
如前所述,这可能取决于语言。我认为这真的取决于这些词是否用于类之类的东西。对于这里讨论的大多数数据类型,这个问题可能没有太大的相关性。在 C++ 中(参见c++ - What is the difference between a definition and a declaration?),一个类或结构总是只有一个定义,但可以声明零次或多次。没有定义就不能声明一个类。所以“声明”可能是“使用”的同义词。
在大多数语言中,简单类型(如整数)不需要像类那样定义。