【发布时间】:2010-10-14 21:20:25
【问题描述】:
我倾向于交替使用定义、声明和分配这些词,但这似乎会冒犯某些人。这是合理的吗?我应该只在第一次分配给变量时使用声明这个词吗?或者还有更多的意义吗?
【问题讨论】:
标签: c++ variable-assignment terminology declare
我倾向于交替使用定义、声明和分配这些词,但这似乎会冒犯某些人。这是合理的吗?我应该只在第一次分配给变量时使用声明这个词吗?或者还有更多的意义吗?
【问题讨论】:
标签: c++ variable-assignment terminology declare
定义是描述值或函数的地方,即准确地告诉编译器或程序员它是什么,例如
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();
【讨论】:
define 和 declare 类似,但 assign 非常不同。
我在这里声明(或定义)一个变量:
int x;
我在这里为该变量赋值:
x = 0;
我在一个声明中同时做这两个:
int x = 0;
注意
并非所有语言都支持在一个语句中声明和赋值:
T-SQL
declare x int;
set x = 0;
某些语言要求您在声明时为变量赋值。此要求允许语言的编译器或解释器推断变量的类型:
Python
x = 0
【讨论】:
x = 5 ; x = "str"
使用正确的术语很重要,否则人们不会知道你在说什么,或者错误地认为你不知道你在说什么。
【讨论】:
这些术语在各种语言的标准中通常具有精确的含义。在这种情况下,不应将它们混为一谈。
以 c 为例:
一个函数可能只定义一次(当你说它做什么时),但它也可能在此之前声明(当你说什么参数时)它需要和返回什么类型)。
同样,当您说出它是什么类型时,变量被声明,并且对于每个范围仅发生一次。但是您可以分配一个重复的值。 (某些语言还区分 initialization(在声明时给变量一个值)和 assignment(稍后更改值)。)
【讨论】:
这些差异看起来很微妙,但它们很重要。并非每种语言都有相同的区别,但在 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);
}
您可以将函数声明和定义合二为一,但您必须在程序中的任何位置调用该函数之前这样做。
【讨论】:
i = 1 是一个赋值,而不是一个定义。要成为定义(例如,在其定义的翻译单元中声明的 extern 变量),它需要类型(并且赋值组件是可选的)。
一般角色: 定义 = 声明 + 保留空间。
定义、声明、赋值有两种情况:
对于变量:
-- 定义:
告诉编译器为变量保留内存。
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?),一个类或结构总是只有一个定义,但可以声明零次或多次。没有定义就不能声明一个类。所以“declared”可能是“used”的同义词。
在大多数语言中,整数等简单类型不需要像类那样定义。
【讨论】: