第2章 VC++简单程序设计.docx
《第2章 VC++简单程序设计.docx》由会员分享,可在线阅读,更多相关《第2章 VC++简单程序设计.docx(19页珍藏版)》请在冰点文库上搜索。
![第2章 VC++简单程序设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/af0535c8-50ff-4f8b-b14b-e63117971782/af0535c8-50ff-4f8b-b14b-e631179717821.gif)
第2章VC++简单程序设计
第2章VC++2005简单程序设计
第三讲
2.1C++基本语法
2.1VC++2005基本语法
2.1.1字符集
字符集是构成C++语言的基本元素。
用C++语言编写程序时,除字符型数据外,其他所有成分都只能由字符集中的字符构成。
C++语言的字符集由下述字符构成:
大小写的英文字母:
A~Z,a~z
数字字符:
0~9
特殊字符:
空格!
#%^&*_(下划线)
+=-~<>/\'";.,()[]{}
2.1.2词法记号
关键字
标识符
字面常量
运算符
分隔符。
1关键字(keyword)
关键字是这样一类有特定的专门含义的单词。
对于C++语言来说,凡是列入关键字表的单词,一律不得移作它用。
因此,关键字又称为保留字(reservedword)。
在上节的程序中,int,for,if等单词就属于关键字。
2.1.2词法记号
2.1.2词法记号
关于C++语言的关键字,有如下说明:
(1)C++语言的关键字一般包含了几乎所有的C语言的关键字。
(2)随着C++语言的不断完善,其关键字集也在不断变化。
(3)各不同版本的C++语言的实现可能有不少涉及其应用领域的关键字的设置,如与微机有关的far,near等关键字。
2.1.2词法记号
2标识符(identifier)
标识符是由程序员为程序中的各种成分:
变量,有名常量,用户定义的类型,枚举类型的值,函数及其参数,类,对象等所起的名字。
2.1.2词法记号
标识符的组成规则:
(1)标识符是一个以字母或下横线‘_’开头的,由字母、数字、下横线组成的字符串
(2)标识符应与任一关键字有区别,如for,if,case等都不可作标识符。
(3)标识符中字母区分大小写,即Abc与abc,被认为是不同的两个标识符。
(4)标识符的有效长度。
2.1.2词法记号
3字面常量(literalconstant)
C++程序中的常量是指固定不变的量。
一般常量有两种表示形式:
一种称为有名常量,一种称为字面常量。
例如圆周率pai=3.1416,其中pai就是一个有名常量,pai是量3.1416的名字,而3.1416称为字面常量
2.1.2词法记号
4运算符(operator)
C++中另一类重要单词是运算符,主要由字母、数字之外的第三类基本符号组成,少数的例外是个别关键字如sizeof,new,delete,也被列入运算符之列,其余运算符为:
+,-,*,/,%,==,!
=,<,<=,>,>=,!
,&&,||,&,^,|,~,++,--,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=,?
:
,=,(),[],.,->,<<,>>,’,:
2.1.2词法记号
5分隔符(separator)
分隔符本身没有明确的含义,但程序中却必不可少,一般用来界定或分割其他语法成分的单词称为分隔符(separator)。
例如:
“;”:
表示一个语句的结束。
“"”:
表示一个字符串的开始与结束。
分隔符包括:
︺(空格),",#,(,),/*,*/,//,’,;,{,}
2.2基本数据类型和表达式
2.2.1基本数据类型
2.2.2字面常量
整型常量
实型常量
字符型常量
字符串常量
2.2.2字面常量
1、整型常量:
即整数,在C++中可以用十进制、八进制、十六进制表示。
十进制表示与我们熟悉的书写方式相同。
八进制表示以0打头,由数字07组成,用来表示一个八进制数。
如:
012、-0655
十六进制以0X(大小写均可)打头,由数字09和字母AF(大小写均可)组成,用来表示一个十六进制数。
如:
0x32A、-0x2fe0
整数常量还可以表示长整数和无符号整数。
长整型常数以L或l结尾,无符号常整数以U或u结尾,以UL或LU(大小写均可)结尾则可表示无符号长整型常数
2.2.2字面常量
2、实型常量:
C++中,包含小数点或10的幂的数为实型常量。
有一般形式和指数形式两种表示方法。
一般形式与平时书写形式相同,由数字09和小数点组成。
例如:
0.23-125.760.0.46-35.
指数形式(也称为科学表示法)表示为尾数乘以10的整数次方形式,由尾数、E或e和阶数组成。
例如:
23E12//表示1231012
-34e-2//表示-0.3410-2
2.2.2字面常量
3、字符型常量:
字符常量是用单引号引起来的单个字符。
如:
′a′//字符a
′@′//字符@
′4′//字符4
′′//空格字符
2.2.2字面常量
4、字符串常量:
用双引号引起来的若干个字符称为字符串常量。
例如:
“IamaChinese.”“123”“a”
字符串常量在内存中是按顺序逐个存储串中字符的ASCII码,并在最后存放一个“\0”字符,作为串结束符。
字符串的长度指的是串中“\0”之前的所有字符数量,包括不可见字符。
因此,字符串常量占用的字节数是串长+1。
2.2.3变量
在程序的执行过程中其值可以变化的量称为变量,变量是需要用名字来标识的
变量说明的格式为:
[<存储类>]<类型名或类型定义><变量名表>;
例如:
intsize,high,temp=37;
staticlongsum;
其中:
2.2.3变量
存储类:
程序员可有五种选择:
auto:
把变量说明为自动变量
register:
把变量说明为寄存器变量
static:
把变量说明为静态变量
extern:
把变量说明为外部变量
第五种选择为缺省,按自动变量处理。
[<存储类>]的方括号表示可以缺省。
2.2.3变量
类型名或类型定义:
任何变量说明语句中,必须包含数据类型的说明,不可缺省。
在上面的例中:
int,long(longint),float就是变量的类型说明。
变量名表:
列出该说明语句所定义的同一类型的变量及其初值,其格式为:
变量名表:
<变量名>[=<表达式>],<变量名表>
例如:
floatc1;
charch1='e',ch2;
inta,b,c=5;
2.2.3变量
auto变量:
用关键字auto说明的局部变量,称为自动变量。
该变量在程序的临时工作区中获得存储空间,如说明语句未赋初值,系统不会自动为其赋初值,随着变量生存期结束,这段临时空间将被释放,可能为其他自动变量占用。
变量的auto属性为缺省属性,即不写auto与写上的效果相同。
2.2.3变量
register变量:
用register说明的局部变量,称为寄存器变量,该变量将可能以寄存器作为存储空间。
register说明仅能建议(而不是强制)系统使用寄存器,这是因为寄存器虽存取速度快,但空间有限,当寄存器不够用时,该变量仍按自动变量处理。
2.2.3变量
static变量:
用static说明的变量称为静态变量,任何静态变量的生存期将延续到整个程序的终止,其要点为:
(1)静态变量和全局变量一样,在内存数据区分配空间,在整个程序运行过程中不再释放。
(2)静态变量如未赋初值,系统将自动为其赋缺省初值0(NULL)。
(3)静态变量的说明语句在程序执行过程中多次运行或多次被同样说明时,其第一次称为定义性说明,进行内存分配和赋初值操作,在以后的重复说明时仅维持原状,不再做赋初值的操作。
2.2.3变量
extern变量:
用关键字extern说明的变量称为外部变量。
一个变量被说明为外部变量,其含义是告诉系统不必为其按一般变量那样分配内存,该变量已在这一局部的外面定义。
外部变量一般用于由多个文件组成的程序中,有些变量在多个文件中被说明,但却是同一变量,指出某一变量为外部变量就避免了重复分配内存,产生错误。
2.2.4符号常量
符号常量就是使用一个标识符来表示某个常量值。
定义常量定义格式如下:
const<类型说明符><常量名>=<常量值>;
例如:
constintN=2000;
constfloatpai=3.1416;
必须以关键字const开头。
类型名:
限定为基本类型(int,float,char,bool)及其派生类型。
常量名:
标识符。
表达式:
其值应与该常量类型一致的表达式(常量和变量也是表达式)。
2.2.4符号常量
C++语言另外还有一种定义常量的方法,即宏定义(或宏替换)方法,例如:
#defineN1000
#definepai3.1416
用宏替换与const方式的实现机制是不同的:
宏替换是在编译时把程序中出现的所有标识符N或pai都用1000和3.1416来替换,这里并没有一个只读不写的const变量存在;宏替换的方式中没有类型、值的概念,仅是两个字符串的代换,容易产生问题。
2.2.5运算符与表达式
1运算符
(1)算数运算符
在C++中对常量或变量进行运算或处理的符号称为运算符,参与运算的对象称为操作数。
运算符的优先级指不同运算符在运算中的优先关系,表中序号越小,优先级越高。
运算符的结合性决定同优先级的运算符对操作数的运算次序。
若一个运算符对其操作数按从左到右的顺序运算,称该运算符为右结合,反之称为左结合。
2.2.5运算符与表达式
按照要求的操作数个数,运算符分为单目(一元)运算符、双目(二元)运算符和三目(三元)运算符。
单目运算符只对一个操作数运算,如负号运算符“”等;双目运算符要求有两个操作数,如乘号运算符“*”等;三目运算符要求有三个操作数,三元运算符只有一个“?
:
”。
按照运算的种类,运算符可分为算术运算符、关系运算符、逻辑运算符、位运算符等。
2.2.5运算符与表达式
(2)关系运算符和逻辑运算符
关系运算符都是二元运算符,包括:
(大于)、(不小于)、(小于)、(不小于)、==(等于)和!
=(不等于)。
关系运算符完成两个操作数的比较,结果为逻辑值true(真)或false(假)。
2.2.5运算符与表达式
逻辑运算符用来进行逻辑运算。
其操作数和运算结果均为逻辑量。
2.2.5运算符与表达式
(3)位运算符
位运算对操作数的各个位进行操作。
位运算符共有六个:
~(按位取反)、<<(左移)、>>(右移)、&(按位与)、|(按位或)、^(按位异或)。
①按位取反运算符“~”
将操作数的每个二进制位取反,即1变为0,0变为1。
例如,整数a的值为10011011,则~a的值为01100100。
②左移运算符“<<”运算一般格式为:
a<其中a为整数,n为一个正整数常数。
语义为将a的二进制数依次向左移动n个二进制位,并在低位补0。
例如,变量a的值为00000010,则a<<3的值为00010000,而a的值仍为00000010。
2.2.5运算符与表达式
③右移运算符“>>”
与左移运算符类同,将左操作数向右移动右操作数指定的二进制位数,忽略移位后的小数部分,并在高位补0。
一个整数右移n位相当于除以2n,但比除法快。
例如,变量a的值为00010000,则a>>2的值为00000100,a的值仍为00010000。
2.2.5运算符与表达式
④按位与运算符“&”
将两个操作数的对应位逐一进行按位逻辑与运算。
运算规则为:
对应位均为1时,该位运算结果为1;否则为0。
例如,整型变量a和b的二进制值分别为01001101和00001111,则a&b的值为00001101
2.2.5运算符与表达式
⑤按位或运算符“|”
将两个操作数的对应位逐一进行按位逻辑或运算。
运算规则为:
只要有一个数对应位为1,该位运算结果即为1;两个数对应位均为0,该位结果为0。
例如,对上例的整数a,b,a|b的值为01001111
2.2.5运算符与表达式
⑥按位异或运算符“^”
将两个操作数的对应位逐一进行按位异或运算。
运算规则为:
当对应位的值不同时,该位运算结果为1,否则为0。
例如,对上例的整数a,b,a^b的值为01000010
2.2.5运算符与表达式
(4)赋值运算符
将数据存放到相应存储单元中称为赋值,如果该单元中已有值,赋值操作以新值取代旧值.
赋值通过赋值运算符“=”来完成,其意义是将赋值号右边的值送到左边变量所对应的单元中。
赋值号不是等号,它具有方向性
C++将变量名代表的单元称为“左值”,而将变量的值称为“右值”。
左值必须是内存中一个可以访问且可以合法修改的对象
2.2.5运算符与表达式
(5)自增、自减运算符
C++中提供了两个具有给变量赋值作用的单目算术运算符:
自增运算符“++”和自减运算符“––”,其意义是使变量当前值加1或减1,再赋给该变量。
例如:
i++//相当于i=i+1
j––//相当于j=j–1
由于具有赋值功能,这两个运算符要求操作数只能是变量
2.2.5运算符与表达式
自增和自减运算符的使用还分前置和后置两种,前置是先增减后引用,即先对变量自加或自减,用新的值参与其他运算;后置则是先引用后增减,即用变量原来的值参与其他运算,然后再对变量进行自加或自减。
例如:
inti=5,j=5,m,n;
m=i++;//相当于m=i;i=i+1;结果i的值为6,m的值为5
n=++j;//相当于j=j+1;n=j;结果j的值为6,n的值为6
2.2.5运算符与表达式
(6)sizeof()运算符
该运算符用于计算一个操作数类型或一个变量的字节数。
一般格式为:
sizeof(数据类型)或sizeof(变量名)
其中数据类型可以是标准数据类型,也可以是用户自定义类型。
变量必须是已定义的变量。
另外括号可以省略,运算符与操作数之间用空格间隔。
例如:
sizeof(int)//值为4
sizeoffloat//值为4
2.2.5运算符与表达式
2表达式
由运算符、操作数及标点符号组成的,能取得一个值的式子称为表达式。
一个常数或一个变量即是最简单的表达式
表达式的求值要根据运算符的意义、求值次序、优先级、结合性,以及类型转换约定进行。
根据运算符的不同,表达式有算术表达式、关系表达式、逻辑表达式、赋值表达式、逗号表达式等。
2.2.5运算符与表达式
(1)算术表达式
由算术运算符连接的表达式称为算术表达式。
使用算术表达式应注意:
①两个运算分量应为同一类型,如果不同,应该遵循类型转换原则,即由“短”类型向“长”类型的自动转换,
②两个int型数据相除,结果应为int型,若商不是整数,也要取整。
int型与float或double型相除,结果应为float或double型。
③取模运算符%主要应用于整形数值计算。
a%b表示用b除a所得到的余数。
例如,47%4的值为3,
2.2.5运算符与表达式
(2)关系表达式
由关系运算符连接的表达式称为关系表达式。
关系表达式的值为true或false。
这个值可对应整数1或0直接参与其他运算。
例如:
a>b>c//等同于(a>b)>c,先求a>b的值,再将结果0或1与c比较大小
a+b>c+d//等同于(a+b)>(c+d),结果为0或1
2.2.5运算符与表达式
(3)逻辑表达式和逻辑表达式求值的优化
由逻辑运算符连接的表达式称为逻辑表达式。
逻辑表达式的值为true或false。
这个值可对应整数1或0参与其他运算。
例如,求下列逻辑表达式的值:
inta=0,b=2,c=3;
floatx=1.8,y=2.4;
a>b&&ay)-!
a
根据优先级,该表达式等同于
((a>b)&&(ay)-!
a)
求值顺序为:
先求a>b,值为0,再求出ay,值为0,再求!
a,值为1,再求0-1,值为-1,作为逻辑值为1,最后求0||1,值为1。
所以整个表达式的值为1。
2.2.5运算符与表达式
(4)赋值表达式与复合赋值表达式
赋值表达式的格式为:
<变量>=<表达式>
赋值表达式的含义是,先计算右边表达式的值,再将该值赋给左边的变量。
a=5+6//合法,计算5+6,将11赋给a,整个表达式的值为11
c=(a=1)+(b=2)//合法,将1赋给a,再将2赋给b,再将表达式(a=1)和(b=2)的
//值相加得3,将3赋给c,整个表达式的值为3
a=3+b=2//非法,因为算术运算符的优先级高,先计算表达式3+b,该表达式成为第二个赋值号的左值
2.2.5运算符与表达式
复合赋值运算符的格式与赋值运算符完全相同,表示为:
变量复合赋值运算符表达式
它等同于
变量=变量运算符表达式
例如:
a+=1//a=a+1
a*=b–c//a=a*(b–c)
a–=(b+1)//a=a–(b+1)
2.2.5运算符与表达式
(5)逗号表达式
用逗号连接起来的表达式称为逗号表达式。
一般格式为:
表达式1,表达式2,…,表达式n
它所作的运算是,从左到右依次求出各表达式的值,并将最后一个表达式的值作为整个逗号表达式的值。
逗号运算符的优先级最低。
例如:
假定a=1,b=2,c=3,逗号表达式:
a=a+1,b=b*c,c=a+b+c
运算过程是,将2赋给a,将6赋给b,将2+6+3即11赋给c,并将11作为整个逗号表达式的值。
2.2.6语句
1、表达式语句
表达式语句是最简单的语句形式,一个表达式后面加上一个分号就构成了表达式语句,一般格式为:
表达式;
例如赋值表达式可以构成赋值语句。
2.2.6语句
2、空语句
只由一个分号构成的语句称为空语句。
空语句不执行任何操作,但具有语法作用,例如for循环在有些情况下循环体是空语句
3、复合语句
由一对“{}”括起来的一组语句构成一个复合语句。
复合语句描述一个块,在语法上起一个语句的作用。
4、流程控制语句
流程控制语句用来控制或改变程序的执行方向。
具体内容在第三章流程控制语句中介绍。
2.3数据的输入与输出
2.3.1I/O流
将数据从一个对象到另一个对象的流动抽象为“流”。
从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插人操作。
数据的输人与输出是通过I/O流来实现的cin和cout是预定义的流类对象。
cin用来处理标准输入,即键盘输入;cout用来处理标准输出,即屏幕输出。
2.3.2预定义的插入符和提取符
“<<”是预定义的插入符,作用在流类对象cout上便可以实现最一般的屏幕输出。
格式如下:
cout<<表达式<<表达式…
例如:
cout<<”Hello!
\n”;//将字符串“Hello!
”输出到屏幕上并换行。
cout<<”a+b=”<2.3.2预定义的插入符和提取符
最一般的键盘输人是将提取符作用在流类对象cin上。
格式如下:
cin>>表达式>>表达式...
例如:
inta,b;
cin>>a>>b;
要求从键盘上输入两个int型数,两数之间以空格分隔。
若输入:
34
这时,变量a得到的值为3,变量b得到的值为4。
2.3.3简单的I/O格式控制
C++I/O流类库提供了一些操纵符,可以直接嵌人到输入/输出语句中来实现I/O格式控制。
下几个常用的I/O流类库操纵符。
2.4.1一个简单程序设计例程
【例2.1】一个简单的C++程序
#include
usingnamespacestd;
intmain()
{
cout<<"欢迎学习VisualStudioC++2005!
";
return0;
}
程序编译、运行后计算机屏幕会显示“欢迎学习VisualStudioC++2005!
”字样。
2.4基于vs2005的简单程序开发
2.4.1一个简单程序设计例程
该程序由一个函数main()组成。
每个C++程序至少要包含函数main(),且只能有一个main()函数。
C++程序的执行总是从main()中的第一条语句开始。
该函数的第一行语句是:
intmain()
通常情况下,函数中的语句总是按顺序执行,除非有一个语句改变了执行顺序。
2.4.2main函数
在C++程序中,main函数是整个程序的入口。
(1)主函数是任何一个C++程序中唯一必不可少的函数。
(2)主函数的函数名是标识符main,它是由系统指定的。
(3)主函数的类型(返回类型)为int型,它可以返回一整型数值,这个值是传送给操作系统的。
2.4.2main函数
(4)主函数的参数可有下面的两种形式:
intmain()
intmain(intargc,char*argv[])
(5)主函数可调用任何其他函数,但它本身不可由任何函数调用,而只能由C++程序被编译后的执行代码将要在其上运行的操作系统自动调用,实际上它是为系统运行该程序标识出启动地址。
因此,主函数也是任一C++程序运行的执行入口。
(6)主函数不可作其他属性说明,如不可说明为静态(static)的,内联(inline)的等等。
2.4.2main函数
2.4.3注释
注释是用来帮助程序员读程序的语言结构,可以用来概括程序的算法、标识变量的意义或者阐明一段比较难懂的程序代码。
一种是注释对/**/。
注释的开始用/*标记,编译器会把/*与*/之间的代码当作注释。
第二种注释符是双斜线//,它可用来注释一个单行,程序行中注释符右边的内容都将被当作注释而被编译器忽略。
2.4.2main函数
例如:
/*代码作用在屏幕上输出HelloWorld!
*/
#include//需要包含的头文件
usingnamespacestd;
voidmain()
{
cout<<"HelloWorld!
";
}
2.4.4编译预处理
可以在C++源程序中加入一些“预处理命令”(preprocessordirectives),以改进程序设计环境,提高编程效率。
VC++2005提供的预处理功能主要有以下3种:
(1)宏定义
(2)文件包含
(3)条件编译
2.4.4编译预处理
1宏定义
定义宏的作用一般是用一个短的名字代表一个长的字符串。
它的一般形式为:
#define标识符字符串
如:
#definePI3.1415926
还可以用#define命令定义带参数的宏定义。
其定义的一般形式为:
#define宏名(参数表)字符串
如:
#defineS(a,b)a*b//定义宏S(矩形面积),a、b为宏的参数
使用的形式:
area=S(3,2)
用3、2分别代替宏定义中的形式参数a和b,即用3*2代替S(3,2)。
因此赋值语句展开为:
area=3*2;
2.4.4编译预处理
2“文件包含”处理
(1)“文件包含”的作用
所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件