变量的声明和定义之间的区别和联系
- 格式:doc
- 大小:36.50 KB
- 文档页数:2
变量的“存在性”与“可见性”.一、变量的作用域与存储类型一个C程序(*.EXE)由若干个C文件(*.C)组成,一个(*.C)文件由若干个C函数组成。
函数内、外均可(根据需要)定义或声明变量。
【按作用域划分】内部变量、外部变量内部变量:在函数内定义变量称为内部变量(局部);外部变量:在函数外定义变量称为外部变量(全局);二者区别:定义出现的位置。
【按存储类型划分】auto、static/register(动态、静态/寄存器变量)变量定义一般格式:[存储类型] 数据类型变量表auto:动态:([存储类型]缺省时,系统默认为动态;)位置:动态区特点:程序运行时动态分配,每次调用时都重新赋初值,调用不赋初值时,其值不确定。
static:静态:位置:静态区特点:程序编译时静态分配,每次调用时不再重新赋初值,保留最后一次调用的值。
二者区别:存储位置不同,register:寄存器:位置:在CPU内;特点:速度快;补充说明:一般不用认为进行存储类型声明,系统编译时,根据需要自动声明register类型)【可见性/作用域(屏蔽/扩展)说明/声明】static/extern程序使用内存存储空间分布:二、Static:用于变量和函数时的不同意义1.Static:用于变量时,共性是:静态存储(1)用于外部变量:代表是本*。
C文件内私有变量,且静态存储其他*。
C(即使用extern声明也)不能调用(2)用于内部变量:代表是本函数内私有变量,且静态存储2. Static:用于函数时,代表是本*。
C文件私有函数,其他*。
C(即使用extern声明也)不能调用Static:静态的:用于外部变量或函数时,代表作用域用于内部变量时,代表生存期三、变量的“存在性”与“可见性”(简表)四、函数的形参与实参之间的数据传递1. 数据传递方向是单向的:实向形;2.被调用函数的内可有多个retun (可供条件选择),但返回值只有一个。
Return(表达式)中的返回值以函数类型不一致时,返回值以函数类型为准。
C++Primer中文版(第4版)学习笔记调用GNU 或微软编译器调用GNU 编译器的默认命令是g++:$ g++ -o prog1微软编译器采用命令cl 来调用:C:\directory> cl -GX prog1.cppacm pc2编译器搭配下面是pc2配置:(以vc为编译环境)配置环境变量:jdk设置:path=C:\Program Files\Java\jdk1.6.0\bin;vc编译器设置:path=C:\Program Files\Microsoft Visual Studio\VC98\Bin;lib=C:\Program Files\Microsoft Visual Studio\VC98\Lib;include=C:\Program Files\Microsoft Visual Studio\VC98\include环境变量配置完成之后,设置下pc2就ok了!pc2设置如下:compile com line: cl.exe {:mainfile}Executable Filename:{:basename}.exeprogram execution command line:{:basename}.exe做到这些配置,基本上编译就不成问题了!注意,期间可以需要到C:\Program Files\Microsoft Visual Studio\COMMON\Tools路径下拷贝mspdb60.dll到C:\Program Files\Microsoft Visual Studio\VC98\Bin;!这个自己调试就Ok了!访问main 函数的返回值的方式和系统有关。
不论UNIX 还是Windows 系统,执行程序后,必须发出一个适当的echo 命令。
UNIX 系统中,通过键入如下命令获取状态:$ echo $?要在Windows 系统下查看状态,键入C:\directory> echo %ERRORLEVEL%再谈编译编译器的部分工作是寻找程序代码中的错误。
关于C++的变量和类的声明和定义什么是变量?变量或者叫对象,是⼀个有具名的、可以供程序操作的存储空间。
这⾥具名是指变量是有名字的,可供操作是指能进⾏加减乘除或者输⼊输出等操作,存储空间则是指有⼀块属于它的内存空间。
为了便于说明,标题和后⾯的内容将对象分为两种。
对于内置的,⽂章称作为变量,对于⾃定义的,称之为对象。
第⼀个问题:在C++中,什么是定义,什么是声明?①定义:⽤于为变量分配存储空间,还可为变量指定初始值。
在程序中,变量有且仅有⼀个定义。
②声明:⽤于向程序表明变量的类型和名字。
在程序中,变量可以有多个声明。
定义也是声明:当定义变量时我们声明了它的类型和名字。
上⾯的这些内容很容易理解,很多情况下,定义就是声明,由于C++⽀持分离式编译,因此⼀个C++程序允许别分成许多块,由这些块共同组成完整的程序。
既然程序可以分成多块,那么如果要在所有块之间共⽤⼀个变量,那就要能够在这些块之间共享代码。
为了⽀持这种分离式编译机制,C++中就将声明和定义区分开来了。
第⼆个问题:定义也是声明,那么如果仅仅声明?回答这个问题之前,需要了解什么是作⽤域,这⾥假定你已知晓C++的作⽤域知识。
在需要声明⼀个变量之前,先想⼀想为什么需要声明变量?因为程序需要使⽤定义在别处(通常是别的⽂件中)的变量。
这⾥使⽤别处的变量暗含了⼀个意义,这个变量应当是个全局变量,因为当前作⽤域找不到,所以需要去别的地⽅找,⽽别的地⽅定义的变量应当全局变量,能够被我看到(这⾥只考虑全局变量,其他情况暂不考虑)。
既然变量已经在别的地⽅定义过了,⽽且变量有且仅有⼀个定义,那么我不能再次定义⽽只能声明了,如何声明?声明的⽅式是使⽤extern关键词,形如extern int i,这⾥有了关键词extern的修饰,因此是⼀个声明,⽽不是定义。
从这个声明中,得知了变量的类型和名字,但是没有分配内存。
假如给上⾯声明的变量⼀个值,那还是不是声明呢?回答是:不是。
编程变量的概念变量是计算机编程中的一种基本概念,用于存储和表示各种不同类型的数据。
在编程中,我们经常需要处理各种数据,例如数字、文字、图像等,而变量就是用来将这些数据存储起来,以便使用和操作。
变量的概念类似于数学中的代数符号,可以代表一个或多个值。
每个变量都有一个名称(标识符)和一个数据类型。
变量的名称用来标识它所代表的数据,而数据类型决定了变量可以存储的数据的种类和范围。
在大多数编程语言中,我们需要在使用变量之前先声明它。
声明变量就是告诉计算机要为这个变量分配一些内存空间,以便存储数据。
声明变量的语法可以根据编程语言的不同而有所差异,但一般都需要指定变量的名称和数据类型。
变量的命名是编程中非常重要的一部分。
命名应该具有一定的意义,并且能够清晰地表达变量所代表的数据的含义。
一个好的变量命名可以使代码更易于理解和维护。
变量的命名通常需要遵循一些规则,例如变量名必须以字母开头,可以包含字母、数字和下划线等字符。
变量的值可以在程序的执行过程中多次改变,这是它与常量的主要区别。
常量是不可变的,而变量是可以被重新赋值的。
通过改变变量的值,我们可以在程序的不同位置使用相同的变量进行不同的计算和处理。
变量与存储地址之间有一个重要的关系。
在计算机内存中,每个变量都有一个唯一的存储地址,用来标识变量在内存中的位置。
这意味着我们可以通过变量的名称访问和操作它所代表的数据。
通过改变变量的值,程序可以直接修改内存中存储的数据,从而实现对数据的读取和修改。
在使用变量时,可以通过赋值操作来改变变量的值。
赋值操作使用等号(=)来表示,将一个值赋给一个变量。
例如,可以使用以下语句将数字10赋值给一个名为“num”的变量:num = 10此时,变量“num”将存储数字10的值。
通过使用变量名,我们可以在接下来的代码中引用这个值,进行计算和处理。
不同的编程语言支持不同的数据类型。
常见的数据类型包括整数(int)、浮点数(float)、布尔值(bool)、字符串(string)等。
一些基本概念:1. 编译单元(模块):在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在VC 这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了两步工作,第一步,将每个.cpp(.c)和相应.h文件编译成obj文件;第二步,将工程中所有的obj文件进行LINK生成最终的.exe文件,那么错误就有可能在两个地方产生,一个是编译时的错误,这个主要是语法错误,另一个是连接错误,主要是重复定义变量等。
我们所说的编译单元就是指在编译阶段生成的每个obj文件,一个obj文件就是一个编译单元,也就是说一个cpp(.c)和它相应的.h文件共同组成了一个编译单元,一个工程由很多个编译单元组成,每个obj文件里包含了变量存储的相对地址等。
2. 声明与定义的区别函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过,但是当函数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!你也可以这样理解,对同一个变量或函数的声明可以有多次,而定义只能有一次!3. extern的作用extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b); 则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的, C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了 (不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern intg_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块或者其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可, 在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。
变量的声明和定义之间的区别和联系前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”,从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。
然而对于 extern a 来讲它只是声明不是定义。
一般的情况下我们常常这样叙述,把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。
很明显我们在这里指的声明是范围比较窄的,即狭义上的声明,也就是说非定义性质的声明,例如:在主函数中:int main( {extern int A;//这是个声明而不是定义,声明A是一个已经定义了的外部变量//注意:声明外部变量时可以把变量类型去掉如:extern A;dosth(; //执行函数}int A; //是定义,定义了A为整型的外部变量外部变量的“定义”与外部变量的“声明”是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明也可以在函数之外(在外部变量的定义点之前。
系统会根据外部变量的定义(而不是根据外部变量的声明分配存储空间的。
对于外部变量来讲,初始化只能是在“定义”中进行,而不是在“声明”中。
所谓的“声明”,其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是为了“提前”引用该变量而作的“声明”而已。
extern 只作声明,不作任何定义。
(我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。
)用static来声明一个变量的作用有二:(1对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。
C 语言程序设计试卷 ,C++语言程序设计试题及答案一、单项选择题(每题1分,共20分)1.C语言规定:在一个源程序中,main函数的位置( C )。
A.必须在最开始B.必须在系统调用的库函数的后面C.可以任意D.必须在最后2. 下面四个选项中,均是合法浮点数的选项是( B )。
A.+1e+1 5e-9.4 03e2B.-.60 12e-4 -8e5C.123e 1.2e-.4 +2e-1D.-e3 .8e-4 5.e-03. 若a=-14,b=3,则条件表达式 a<b? a:b+1的值为(A )。
A.-14B. -13C. 3D. 44. 已知:int n,i=1,j=2;执行语句n=i<j?i++:j++;则i和j的值是( c ).A.1,2B. 1,3C. 2,2D. 2,35. 为了判断两个字符串s1和s2是否相等,应当使用( D )A.if (s1==s2)B. if(s1=s2)C. if (strcmp(s1,s2))D. if (strcmp(s1,s2)==0)6. 以下正确的描述是( B )。
A.函数的定义可以嵌套,但函数的调用不可以嵌套。
B.函数的定义不可以嵌套,但函数的调用可以嵌套。
C.函数的定义和函数的调用均不可以嵌套。
D.函数的定义和函数的调用均可以嵌套。
7. 在C语言中,下面对函数不正确的描述是( D)。
A.当用数组名作形参时,形参数组值的改变可以使实参数组之值相应改变。
B.允许函数递归调用。
C.函数形参的作用范围只是局限于所定义的函数内。
D.子函数必须位于主函数之前。
8. 如果在一个函数中的复合语句中定义了一个变量,则以下正确的说法是( A)。
A.该变量只在该复合语句中有效B.该变量在该函数中有效C.该变量在本程序范围内均有效D.该变量为非法变量9. 以下正确的函数形式是( D )。
A.double fun(int x,int y) { z=x+y;return z;}B.fun(int x,y) { int z; return z;}C.fun(x,y) { int x,y; double z; z=x+y; return z;}D.double fun( int x,int y) {double z; z=x+y; return z; }10. 以下程序的输出结果是( B )。
变量的基本概念忽然很困惑为什么变量要初始化,查阅了⼀些资料,整合记录下。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++⼀、变量的定义变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
变量定义指定⼀个数据类型,并包含了该类型的⼀个或多个变量的列表。
变量其实就是⼀块内存空间的名称。
简要地说,计算机拥有可供程序使⽤的随机存取存储器(RAM),当⼀个变量被定义时,⼀部分内存就会被预留给这个变量。
内存的最⼩单位是⼆进制数字(binary digit,bit,⽐特),0或者1。
你可以把bit想象成传统的电灯开关——要么是关的(0),要么是开的(1),不存在两者之间的状态。
如果你要查看⼀个随机的内存⽚段,你可能看到…011010100101010…或者它们的组合。
内存按照称为“地址”的连续单元进⾏组织,就像可以通过门牌号找到⼀条街上的某户⼈家,内存地址使我们能够找到和访问⼀块特定内存的内容。
但在现代计算机中,并没有给每⼀个bit都分配地址,最⼩的可寻址内存单元称为字节(byte),包含8个bit。
⼆、变量的声明变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进⼀步的编译。
变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量定义。
三、变量的初始化 定义变量后,它的值不确定,除⾮你赋初始值。
四、区别1)变量的定义和声明的区别声明是仅仅告诉编译器,有个某类型的变量会被使⽤,但是编译器并不会为它分配任何内存。
⽽定义就是分配了内存。
2)初始化和赋值赋值操作是在两个已经存在的对象间进⾏的,⽽初始化是要创建⼀个新的对象,并且其初值来源于另⼀个已存在的对象。
编译器会区别这两种情况,赋值的时候调⽤重载的赋值运算符,初始化的时候调⽤拷贝构造函数。
参考资料:。
变量的声明和定义之间的区别和联系
前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”,从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。
然而对于 extern a 来讲它只是声明不是定义。
一般的情况下我们常常这样叙述,把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。
很明显我们在这里指的声明是范围比较窄的,即狭义上的声明,也就是说非定义性质的声明,例如:在主函数中:
int main() {
extern int A;
//这是个声明而不是定义,声明A是一个已经定义了的外部变量
//注意:声明外部变量时可以把变量类型去掉如:extern A;
dosth(); //执行函数
}
int A; //是定义,定义了A为整型的外部变量
外部变量的“定义”与外部变量的“声明”是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。
系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。
对于外部变量来讲,初始化只能是在“定义”中进行,而不是在“声明”中。
所谓的“声明”,其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是为了“提前”引用该变量而作的“声明”而已。
extern 只作声明,不作任何定义。
(我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。
)
用static来声明一个变量的作用有二:
(1)对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。
(2)外部变量用static来声明,则该变量的作用只限于本文件模块。