VC语法汇总.docx
《VC语法汇总.docx》由会员分享,可在线阅读,更多相关《VC语法汇总.docx(25页珍藏版)》请在冰豆网上搜索。
![VC语法汇总.docx](https://file1.bdocx.com/fileroot1/2022-12/11/c87f588c-d684-4423-9f41-7452a57c2fda/c87f588c-d684-4423-9f41-7452a57c2fda1.gif)
VC语法汇总
VC++语法知识汇总
第2章运算符
基本成份关键字:
由小写字母组成;
标识符:
运算对象名,由字母、数字和下划线组成,不能以数字开头、不能是关键字,大小写严格区分;
运算符:
<<,+,==等表示指定运算;
常量:
具体的数据;
串:
用双引号括起来的字符序列;
特殊符号:
{,},//,#,(,)等。
1.常量
整型:
十进制;八进制(0开头,由0~7组成);十六进制(0x开头,由0~9和A~F组成)
实型:
小数形式(由0~9和小数点组成);指数形式(尾数e指数,尾数和指数必须有值,指数为整数)
字符型:
单引号引起的单个字符或转义序列,转义序列由\开头,后跟对应字符的ACSII码(用八或十六进制数表示,默认为八进制数)或字符
标识符常量(符号常量)的定义方法:
编译预处理指令#define标识符常量名常量值
常量说明符const类型标识符常量名=常量值;
2.变量
变量在使用前,必须有值。
说明格式:
[存储类型]数据类型变量名1[,变量名2,,变量名n];
变量说明时直接赋初值:
[存储类型]数据类型变量名=值;
变量先说明后赋值:
[存储类型]数据类型变量名;
变量名=表达式;
3.运算符与表达式
(1)算术运算符:
+、-、*、/(除)、%(求余)
%只对整数操作,/和%的除数(右操作数)不能为0
(2)关系运算符:
<、<=、>、>=、==(相等比较)、!
=(不等比较)
操作数非0为真、0为假;运算结果真为1、假为1,且继续参加运算。
(3)逻辑运算符:
!
(非)、&&(与)、||(或)
运算规则:
非真即假,&&运算时操作数中有一个为0(假)时为假,||运算时操作数全为0(假)时为假;括号优先,同层的优先顺序为!
、&&、||,从左到右,一旦能确定结果值,停止运算。
(4)赋值运算符:
=、+=、-=、*=、/=、%=等
左操作数必须为变量;先计算右操作数;i*=j+2等价于i=i*(j+2)
(5)自增自减运算符:
++、--
操作数为变量,运算符的位置会影响两个值(前置:
表达式为运算前的变量值,变量自增自减1;前置:
变量自增自减1,表达式为运算后的变量值)
(6)逗号运算符:
,
从左到右依次计算各操作数,最后一个操作数的值为表达式的值。
(7)条件运算符:
?
:
操作数1的值为真(非0),表达式取操作数2的值,否则表达式取操作数3的值。
优先级:
一元运算(一个操作数),二元运算(算术运算、关系运算、逻辑运算,赋值运算),条件运算,逗号运算
4.类型转换
自动转换:
一般表达式中向数据长度增加的方向转换;赋值表达式向左操作数类型转换。
强制转换:
(type)表达式或type(表达式);只改变表达式的值的类型。
第1~3章VC程序的结构
1.程序的基本结构
#include//预处理部分
…//说明部分(全局变量说明部分、自定义函数说明),可以无
voidmain(void)//主函数说明
{
…//函数体,说明部分、操作部分(一般由输入、处理和输出三部分组成)
}
程序中严格区分字母大小写;中文符号只能出现在字符串或注释中;采用缩格式。
2.输入
cin>>变量1>>变量2>>…>>变量n;
注意:
变量类型可以是整型、实型和字符型;键盘输入的数据之间要用空格或回车隔开;数据的类型、顺序、个数与列举的变量对应一致;当接受到类型不致时,对应变量值为0,以后的输入数据丢失、变量无值;当个数不足时,等待继续输入;当个数超过时,取所需个数的数据,多余的由后面的输入接收或自动放弃;
cin.get(字符型变量名);
注意:
每次从输入行中接受一个字符(包括空格和回车符)到指定变量中;
3.处理
各种语句(说明语句、表达式语句、流程控制语句、空语句、复合语句)的集合。
每个语句均以“;”结束;复合语句是多个语句用{}括起组成的一个语句。
4.输出
cout<<表达式1<<表达式2<<…<<表达式n;
注意:
先计算表达式的值,再输出结果;表达式中的运算符的优先级必须高于<<,否则要将表达式用圆括号括起;当表达式为字符(串)常量时,输出引号里的内容,如果串中含有转义字符时,输出对应的ASCII字符;连续输出的表达式的值,如果需要间隔,则必须人为增加输出分隔符;也可以使用setw(整数)规定其后一个输出项的宽度,但要在预处理部分加预处理指令#include。
第4章流程控制语句
1.分支语句
(1)单分支语句if
1)if(表达式)
语句;
if(表达式)
{语句1;
语句2;
…
}
执行流程见图1。
图1图2
注意:
表达式的值非0或条件成立为真,否则为假。
2)if(表达式)语句1;
else语句2;
执行流程见图2,其中语句1和语句2均或为复合语句。
3)if(表达式1)
语句1;
elseif(表达式2)
语句2;
elseif(表达式3)
语句3;
else图3
语句4;
执行流程见图3。
(2)多分支语句switch
switch(表达式)
{
case常量表达式1:
语句序列1;[break;]
case常量表达式2:
语句序列2;[break;]
…
case常量表达式n:
语句序列n;[break;]
[default:
]
语句序列0;
}
执行流程为:
1)计算switch后的表达式的值。
2)将该值依次与case后的常量表达式的值进行比较,等值时,执行其后的语句序列,当执行到break语句时,switch执行结束,否则继续执行后面的case中的语句。
3)如果该值未在case后出现,若有default,则执行其后的语句,否则结束。
注意事项:
1)switch后的表达式的结果必须是整型、字符型或枚举类型;
2)case后的常量表达式的值必须是整型、字符型或枚举类型的常量,不能是变量表达式(即不能含有变量)
(3)分支语句的嵌套
在if语句的嵌套中,要注意else与if语句的匹配原则:
else与之前同一层未配过对的if进行配对。
2.循环语句
(1)while语句
while(表达式)
语句;
执行流程见图4。
图4图5
注意:
循环体可以是单一语句或复合语句(用{}括起),其中必须有改变表达式(循环条件)值的相关语句,且能最终使表达式(循环条件)为假。
(2)do-while语句
do
语句;
while(表达式);
执行流程见图5。
注意:
1)while后的;不能缺少。
2)while与do-while的区别:
while的循环体可以不执行,而do-while的循环体至少执行1次;while先判断后执行,do-while先执行后判断。
(3)for语句
for(表达式1;表达式2;表达式3)
语句;
执行流程见图6。
注意:
1)表达式1只执行一次,用于初始化循环控制变量。
2)表达式2在每次准备循环前执行,为循环控制条件。
3)表达式3在每次循环后执行,用于更新控制变量的值。
4)各表达式均可省略,表达式2省略表示循环条件成立,其他表达式省略,则为空。
图6
(4)循环嵌套
执行流程:
从外循环进入,外循环一次,内循环执行一遍。
注意:
1)可以使用continue提前开始下一轮循环;使用break中断循环。
2)continue和break只影响包含它的最内层循环。
第5章函数
1.函数定义
类型函数名(参数1,参数2,…)
{功能语句系列;
[return(表达式);]
}
注意:
(1)参数的定义形式为:
类型形式变量名
(2)每个参数要分别定义,中间用“,”分隔。
(3)形式变量的使用范围为函数体内,不需要给初值,由函数调用时给定。
(4)函数名前的类型省略时,默认为整型。
当函数名前的类型为非void时,函数体中至少要有一条return语句。
(5)return后表达式值的类型若与函数名前的类型不一致时,以函数名前的类型为准。
(6)函数不能嵌套定义。
2.函数调用
函数表达式:
函数名(实际参数表)
注意:
(1)实际参数的个数、顺序、类型都是由形参决定,但实参使用的是已经存在的变量、常量或表达式。
(2)有返回值时,函数表达式可出现在一般表达式中。
无返回值时,直接加“;”构成表达式语句。
(3)当定义在调用后面时,在调用前必须进行函数说明,说明的格式为:
函数的首部加“;”。
其中的形式参数名可以省略。
(4)参数值的传递方式有:
值传递、地址传递和引用传递。
值传递:
实参将值单向传递给形参,函数中对形参的操作,在离开函数后,形参不复存在,实参的值保持不变。
(即实参和形参各自占有空间,值的传递为单向)
地址传递:
实参向形参传递的为地址,函数中对形参地址中的内容操作,在离开函数后,该地址中的内容仍然存在。
引用传递:
实参和形参共享空间(形参为实参的别名)
3.函数的嵌套调用:
在调用一个函数的过程中,那个函数又调用另一个函数。
函数的递归:
一个函数在调用的过程中直接或间接地调用了自己。
执行流程:
从主函数进入,当遇到函数调用时,转向被调用的函数执行,执行结束后,返回到原调用点继续执行。
4.函数重载:
定义多个同名函数,调用时,根据提供的实参个数或类型顺序决定所调用的函数。
注意:
(1)定义重载函数的原则是重载的函数在参数上要与原函数有所区别,即参数个数不同,或参数的类型顺序不同。
(2)函数重载在编译时实现程序的静态多态性。
5.函数的缺省参数
注意:
(1)如果函数定义在后,则在原型说明时给了缺省值后,函数的定义时就不可再给缺省值。
(2)只有带缺省值的参数在函数调用时才可以省略;没有缺省值的参数,函数调用时必须给出实参。
(3)如果函数定义时的参数有多个,且只有部分参数有缺省值,应将缺省参数依次位于参数的最右边。
6.内联函数
在函数定义的前面加inline
7.作用域
(1)块作用域局部变量,同一个块内不允许两个标识符同名,但不同块中的两个标识符可同名。
且内层的标识符屏蔽外层块的同名标识符。
(2)文件作用域全局变量,若有同名的局部标识符,则在同名局部标识符的作用域内缺省使用的是局部标识符,但仍可以通过作用域运算符“:
:
”来使用具有文件作用域的同名标识符。
(3)函数作用域语句标号,goto中使用;无“先说明后使用”的限制,也不无块的限制;
作用范围在函数内部。
(4)函数原型作用域作用范围在函数原型说明语句。
8.存储类型
(1)auto局部变量,一旦离开作用域,该变量就不再存在。
(2)static
局部静态变量:
作用域为块作用域,在离开其作用域时,变量仍然存在,且其值不变,但暂时不可使用,下一次函数调用时在其作用域内可以再次使用,其值延续以前的变量值。
更重要的是,对于静态局部变量,仅在首次遇到说明语句时为其分配存储空间并赋初值。
一般用于用户自定义函数中。
全局静态变量:
在说明全局变量时如果加上static,其变量仅在本程序文件中使用,在其它程序文件中不可使用。
可以避免在多个文件组成的程序中变量的重名问题。
(3)register使用CPU中的寄存器作为变量空间存放数据。
(4)extern外部变量一定是全局变量,属于静态存储类型。
有两种情况必须使用外部变量,第一种情况:
在同一源程序中定义的全局变量,属于先使用后定义的,在使用之前要声明该变量为外部类型变量;第二种情况:
与static全局变量相对应,当在一个源程序文件中要使用其它文件中说明的全局变量时,要用extern先对变量进行声明。
9.编译预处理
特点:
1)以#开头标识。
2)每一条预处理指令各占一行,不是以分号结束。
3)在编译源程序之前进行。
(1)文件包含
格式为:
#include"文件名"或#include<文件名>
注意:
(1)文件名为文件名的全称,若非系统缺省目录,应指明文件路径。
系统缺省目录有两种:
包含系统指定的专用包含文件目录中的文件“<>”指定。
扩展名通常为“.h”;当前目录(用户源程序所在的目录)下的文件用双引号指定。
(2)一条包含命令只能包含一个文件。
(2)宏定义
1)不带参数的宏格式:
#define宏名字符序列
注意:
①宏名(标识符)通常用大写字母表示,以区别于普通变量。
②区分字符串(用双引号)或数值的宏定义形式,且字符串中与宏名相同的字符串不作为宏名对待。
③在进行宏扩展时,只对宏名作简单的替换,不进行计算。
④终止宏的定义#undef宏名
2)带参数的宏格式:
#define宏名(参数列表)字符序列
注意:
①参数列表中不能指定类型。
②宏名与括号之间不能有空格。
③宏代换只是对参数作简单的替换而不做任何计算。
④宏定义通常在一行内定义完,并以换行符结束,不可与其它语句同行编写;当一个宏定义多于一行时,必须在换行前先输入一个转义符“\”。
(3)条件编译
#ifdef宏名
程序段
#endif
10.程序的多文件组织
多文件组织的程序,可以通过三种方法实现:
(1)在含有主函数的文件中用#incude命令将不同的文件包含进来,再对含有主函数的文件进行编译处理。
(2)将各源程序单独编译成目标程序,然后作连接处理。
(3)使用工程文件的方法,将各源程序文件都添加至一个工程项目中,由编译器自动处理。
程序的多文件组织,需遵守以下原则:
1)要使用其它文件定义的函数或变量,使用前要再以extern进行说明。
2)如有不想让其他程序文件使用的函数和变量,则用static修饰的函数或变量限于本源程序文件内使用。
第6章数组
1.数组的定义
1)一维数组数据类型数组名[元素个数];
2)二维数组数据类型数组名[行数][列数];
注意:
①元素个数(行数、列数)必须为一个大于零的整型常量,不可为有变量的表达式或变量。
②数组必须先定义后使用,在使用前各元素必须有确定的值。
2.数组的初始化
数组元素的初始化方法:
(1)以集合形式给出所有元素的值。
(二维,先行后列取值)
(2)以集合形式给出部分元素(不能多于元素个数)的值(二维以行为单位),其余元素的值则分别被赋0。
(3)可以在定义数组时不限定数组元素个数(二维只能不限定行数),而由给出的元素个数来确定数组的大小。
(4)如果定义的数组为全局类型或静态类型,则数组各元素有缺省的初值0(字符型数组元素缺省初值为’\0’)。
3.数组的使用
一般数组(非字符数组)是面向元素的,不可直接对数组名进行输入、处理和输出。
(1)数组元素的使用
一维数组名[下标]
二维数组[行下标][列下标]
注意:
①数组的下标可以是一个表达式
②下标表达式值的类型必须是一个整数
③下标表达式的值应大于或等于0,且小于数组定义时的大小值
④数组元素作为函数实参时,为值传递方式。
(2)数组名的使用
注意:
①数组名可以看作常量,值为存放数组元素的空间首地址,只能使用,其值不能被改变。
②一般用于函数的实参,为地址传递方式,对应的形参定义形式同数组定义(元素个数可以省略),
③作为函数的实参时,函数体中对数组操作时要注意下标不能越界。
4.字符数组
(1)定义:
char数组名[常量表达式];
char数组名[常量表达式1][常量表达式2];
(2)字符数组的初始化用字符串对字符数组初始化,可以不指定数组大小,通过字符串的大小确定数组的大小,但系统会给字符数组自动增加一个字符串结束标志’\0’。
(3)字符数组的使用可直接对数组名进行输入、处理和输出。
输入:
cin>>数组名;或cin.getline(数组名,数组长度);后一种方式可接收空格。
输出:
cout<<数组名;
处理函数:
①strcpy(字符数组1,字符数组2)用于将字符数组2赋值给字符数组1。
字符数组1的大小必须≥字符数组2的大小;字符数组2可以是数组名,也可以是字符串常量;
②strcmp(字符数组1,字符数组2)逐个比较对应的字符的ASCII,全部相同,返回0;前面大,则返回1;前面小,则返回-1。
③strlen(字符串)返回字符串从开始到第一个结束标志之间(不包括结束标志)的字符个数。
sizeof(字符串)返回字符串所占字节数(包括结束标志)。
第7章结构体
数组中只能存放同类型的数据。
结构体变量中可以存放不同类型的数据。
1.结构体的定义
(1)先定义类型,再定义变量
structstu{
charxh[10];charxm[8];floatmath,english;
};
stust1[30],st2,st3;
(2)定义类型的同时,定义变量
structstu1{
charxh[10];charxm[8];floatmath,english;
}st4[30],st5;
stu1st6;
(3)不指定结构体类型名,说明类型的同时定义变量
struct{
charxh[10];charxm[8];floatmath,english;
}st7[30];
2.同类型结构变量:
用同一结构体类型所定义的变量
(1)同类型的结构体类型之间可以直接赋值;
(2)结构体类型变量不能直接进行输入/输出,成员的直接输入/输出取决于其类型;
(3)结构体类型变量可以作为函数的参数(作输入参数,为值传递),函数也可返回结构体值。
3.结构体类型变量成员的使用:
结构体变量名.成员名
注意:
1)成员的赋值可以在定义的同时进行,也可以先定义后赋值。
2)成员可进行操作与运算由成员的类型确定。
4.结构体数组:
数组元素的类型为结构体
访问方式:
数组名[下标].成员名
第8章指针
1.指针变量的定义类型*指针变量名;
注意:
类型为指针变量的值(地址)相应空间中的数据类型
2.指针变量的使用
指针变量中存放的内容为内存空间的地址,一般变量所占内存空间的地址可以用取地址运算&求得。
例:
inti;&i则为i变量所在空间的地址。
(1)赋值定义的同时赋值,如inti,*p=&i;
先定义后赋值,如inti,*p;p=&i;
同类型变量之间相互赋值,如inti,*p=&i,*p1;p1=p;
(2)内存中的数据存取1)直接存取一般变量名直接访问
2)间接存取通过指针变量访问使用取内容运算符*
(3)指针变量的运算
常用于对数组的操作中
1)算术运算+和-
指针加或减一个整数n表示指针指向当前内存中相邻的同类型的数据的后面第n个或前面第n个数。
两指针变量相减表示两地址之间的元素个数。
注意:
两指针进行相加运算无意义。
2)关系运算表示指针之间的位置关系
==与!
=表示两指针是否指向同一个内存单元。
>、>=、<、<=表示两指针的前后位置。
3.指针与数组
(1)数组名为整个数组的首地址,可作为一个指针,是一个常量;指针变量的值是可以改变的。
(2)指针数组类型*数组名[元素个数];数组的元素为指针
(3)数组指针类型(*指针变量名)[元素个数];指针指向指定元素个数的数组
4.指针与函数
(1)指针作为函数的参数属于地址传递
有定义:
intn=10,b[10],*pr=b;
形参(int*p,inta[],inti)
实参(pr,b,n)(b,pr,n)(&n,b,n)
即:
数组作形参,实参为数组名;指针型变量为形参,实参为数组名;
数组作形参,实参为指针;指针型变量为形参,实参为指针;
指针型变量为形参,实参为变量的地址。
(2)返回值为指针的函数一般定义格式:
类型*函数名(参数表){…}
(3)指向函数的指针返回值类型(*指针变量名)(形参表);
5.指向指针的指针如int*p1,**p2,***p3;
6.引用
(1)引用的定义inta,&b=a;
注意:
1)一定要用一个已存在的变量初始化。
2)引用的类型和被引用的类型要一致。
3)可以引用数组中的元素,但不能定义引用类型的数组。
4)可以把某引用的地址赋给指针,该指针则指向被引用的变量。
5)可以定义引用的引用,也可以两个变量对同一个变量进行引用。
6)对动态内存引用时,不可引用其地址,只能引用其值。
通过引用变量释放动态内存时要取其地址。
(2)引用的使用一般用在函数的形参中,属于引用传递
有定义:
intn=10;形参:
(int&i)实参:
(n)
在函数体中对形参所作的操作实际上就是对函数调用时的实参的操作,其实参的值将受函数调用的影响。
7.const类型
(1)const常量const类型常量名=值;
注意:
1)定义const型常量的同时必须对其初始化。
2)const型常量一经定义,就不能再对其进行赋值。
(2)const型指针
有定义:
inta=5,b=6,c=7;
三种形式:
1)指针所指向的值不变constint*p1=&a;
2)指针的值不变int*constp2=&b;
3)指针以及指针所指向的值都不变constint*constp3=&c;
8.new和delete运算符
char*p,*p1,*p2,(*p3)[10],*p4;
new用于为指针变量申请指向的空间,返回空间的地址:
p=newchar;p1=newchar(‘A’);p2=newchar[10];
p3=newchar[5][10];//或p3=(char(*)[10])newchar[5*10];
p4=newchar[5*10];//或p4=(char*)newchar[5][10];
delete释放new申请到的空间:
deletep;deletep1;delete[]p2;或delete[10]p2;delete[]p3或delete[5]p3;
9.链表
(1)链表结点结构为:
structnode{数据成员的定义;
node*next;};
(2)链表的建立
1)先设立一个指针(head)来存放链表的首地址。
指针head的初值赋为0。
2)不断用new运算符生成一个新的结点p,将这个结点链入已有的链表尾部(新结点的next指针值为0表示链表尾),有二种情况:
如果链表为空(head==0),则这个新结点将是链首结点;head=p;
否则将新结点的地址赋给原有的尾结点p1的next指针。
p1->next=p;
(3)链表结点插入
将结点p插入至一个结点p0和结点p1之间的操作:
p->next=p1;p0->next=p;
注意:
顺序不能颠倒。
(4)链表结点删除
1)找到要删除的结点p;
2)有三种情况:
删除的结点是首结点(p==head),则将第二个结点的首地址作为