C++ 定义、声明和赋值到底是啥?
Posted
技术标签:
【中文标题】C++ 定义、声明和赋值到底是啥?【英文标题】:What exactly are C++ definitions, declarations and assignments?C++ 定义、声明和赋值到底是什么? 【发布时间】:2010-10-14 21:20:25 【问题描述】:我倾向于交替使用定义、声明和分配这些词,但这似乎会冒犯某些人。这是合理的吗?我应该只在第一次分配给变量时使用声明这个词吗?或者还有更多的意义吗?
【问题讨论】:
【参考方案1】:定义是描述值或函数的地方,即准确地告诉编译器或程序员它是什么,例如
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 var;”作为定义,“int var = 5;”是一个组合的 def/ass。基本上,在 C 中,定义是为对象创造空间的任何东西。无论如何我都会投票,也许你会改变答案,也许不会,但这是迄今为止最好的。【参考方案2】:define 和 declare 类似,但 assign 非常不同。
我在这里声明(或定义)一个变量:
int x;
我在这里为该变量赋值:
x = 0;
我在一个声明中同时做这两个:
int x = 0;
注意
并非所有语言都支持在一个语句中声明和赋值:
T-SQL
declare x int;
set x = 0;
某些语言要求您在声明时为变量赋值。此要求允许语言的编译器或解释器推断变量的类型:
Python
x = 0
【讨论】:
我会分头——Python 没有任何类型的“声明”。类和函数是“定义的”,变量是在分配时创建的。您并没有真正“声明”变量,因为它们只是分配给对象的名称。 这是一个很好的观点 - 从一个学究到另一个我很欣赏这种区别:) 更多吹毛求疵:Python 并没有真正做任何类型推断,它是动态类型的。仅当变量具有类型时才需要类型推断。这是有效的 Python,并说明了我的观点的效果:x = 5 ; x = "str"
我建议使用不同的语言作为示例(Haskell 或带有 var 的 C#),或者只是删除“推理”-sentence。无论如何,这只是吹毛求疵:)
-1 是公认的答案但错误:声明和定义完全不相似(即使在某些语言中没有区分)。请参阅下面的 jheriko 的答案。【参考方案3】:
使用正确的术语很重要,否则人们不会知道你在说什么,或者错误地认为你不知道你在说什么。
【讨论】:
【参考方案4】:这些术语在各种语言的标准中通常具有精确的含义。在这种情况下,不应将它们混为一谈。
以 c 为例:
一个函数可能只定义一次(当你说它做什么时),但它也可能在此之前声明(当你说什么参数时)它需要和返回什么类型)。
同样,当您说变量是什么类型时,它已声明,并且对于每个范围仅发生一次。但是您可以分配一个重复的值。 (有些语言还区分 initialization(在声明时给变量一个值)和 assignment(稍后更改值)。)
【讨论】:
【参考方案5】:这些差异看起来很微妙,但它们很重要。并非每种语言都有相同的区别,但在 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);
您可以将函数声明和定义合二为一,但您必须在程序中的任何位置调用该函数之前这样做。
【讨论】:
我以为变量声明分配了存储空间。除非您还提供初始化或分配新值,否则您只会在该空间中得到垃圾。您只能在声明变量时对其进行初始化。 @Artelius:在大多数情况下,声明包括编译器的隐式定义,这使得声明似乎分配了存储空间。我做了一个(希望)澄清补充,以将其包含在我的答案中。感谢您指出。 我投票赞成这个答案,因为我知道它是正确的。如果没有,我真的很想知道为什么。上面的答案有声明和定义倒退。i = 1
是一个赋值,而不是一个定义。要成为定义(例如,在其定义的翻译单元中声明的 extern
变量),它需要类型(并且赋值组件是可选的)。【参考方案6】:
一般角色: 定义 = 声明 + 保留空间。
定义、声明、赋值有两种情况:
-
用于变量。
用于函数。
对于变量:
-- 定义: 告诉编译器为变量保留内存。
int x;
-- 声明: 告诉编译器该变量定义在别处。
extern int x;
-- 作业: 告诉编译器将值放入变量中。
x = 0;
对于函数:
-- 定义:
int functionDef(int x)
int x;
...
...
...
return x;
-- 声明: 它只是函数的原型。
int functionDef(int x);
【讨论】:
【参考方案7】:正确答案取决于您所谈论的语言。计算机语言通常有特定的术语,要么是因为语言规范,要么是因为围绕该语言发展起来的社区。在我使用 COBOL 的时候,它的术语与更主流的语言(在语言更接近语言开发的主流,而不是主流业务的意义上)有很大不同。 Forth 开发了一些奇怪的术语。
如果你懂英语,你通常可以从它的正常含义中很好地了解一个词的含义,但不要太依赖它。跨语言或语言社区的特定单词也是如此。
【讨论】:
【参考方案8】:如前所述,这可能取决于语言。我认为这真的取决于这些词是否用于类之类的东西。对于这里讨论的大多数数据类型,这个问题可能没有太大的相关性。在 C++ 中(参见c++ - What is the difference between a definition and a declaration?),一个类或结构总是只有一个定义,但可以声明零次或多次。没有定义就不能声明一个类。所以“declared”可能是“used”的同义词。
在大多数语言中,整数等简单类型不需要像类那样定义。
【讨论】:
以上是关于C++ 定义、声明和赋值到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章