第3章C++编程语言基础,怎么学习c语言开发

语言 5
第3章C++编程语言基础 如同在第2章中所提到的那样,VisualC++只是一个开发工具,并不能实现软件应具备的所有功能。
因此,了解C++编程语言的各种特性以及基础语法,对于游戏编程高手而言是非常必要的。
因此,本章将主要帮助读者熟悉C++编程语言的优点及基本语法。
把这些基本语法与VisualC++开发工具相结合就是巩固所学知识的最好方法。
但愿本章所列举的材料能够很好地帮助读者理解前一章中所学习的内容,同时能够建立起一定的C++编程语言基础。
如果您已经是一位C++编程人员,那么请跳过本章,继续学习后面的内容。
如果只是一个初学者,那么请一定要详细阅读这一章,并对每一节的示例代码进行实践。
只有这样才能够真正的走进C++程序设计的大门。
其实,有关C++编程语言的内容在前面已经有所涉及,如第2章中的HelloWorld程序就演示了编程语言是如何实现文字输出的。
本章将通过一些更加详细的内容来帮助读者了解C++编程语言。
为了保证这些应用程序代码能够正常运行,可能在前面的代码简单的涉及后面代码中的内容,读者只需要明白代码中本节所包含的内容即可。
在阅读完本章的全部内容后,再回过头来看就会明白。
本章主要涉及的内容如下:C++编程语言的优点及其发展过程:了解C++编程语言的优点及其发展。
C++中的各种字符:掌握什么是C++中的关键字、标识符等概念。
常用数据类型:明白常用数据类型的范围及其定义。
运算符与表达式:知道什么是表达式、运算符,及其如何使用。
常量与变量:掌握变量与常量的定义及区别。
控制语句:掌握基本的语法,并熟悉相关的控制语句。
数组与指针:知道如何使用数组及指针。
C++类的特性:了解C++中类的特性及其主要的成员。
运算符的重载:了解其基本方法,明白其优点。
编程规范:掌握基本的编程规范,对自己编程或者阅读别人的代码大有裨益。
3.1C++编程语言是什么 在学习C++这门编程语言之前,确实有必要了解一下这种编程语言的发展过程、优点及特性,这样才能对一种编程语言有一个全面的了解。
第3章C++编程语言基础 3.1.1C++语言的由来 C++语言起源于C语言。
在1973~1979年间,C语言迅速成为应用最广泛的系统程序设计语言。
然而,由于C语言也存在一些缺陷,例如类型检查机制相对较弱、缺少支持代码重用的语言结构等,造成用C语言开发大程序比较困难。
为了克服C语言存在的缺点,在1980年,由美国贝尔实验室在C语言的基础上,开始对C语言进行改进和扩充,并将“类”的概念引入了C语言,构成了最早的C++语言(1983年)。
后来C++中又引进了运算符重载、引用、虚函数等许多特性,并使之更加精炼。
由贝尔实验室开发出的这种过程性与对象性相结合的程序设计语言,直到1983年正式取名为C++。
以后又经过不断的完善和发展,由美国国家标准化协会ANSI和国际标准化组织ISO一起进行了标准化工作,并于1998年正式发布了C++语言的国际标准(ISO/IEC:98-14882)成为目前的C++语言。
简单地说,C++语言是在C语言的基础上引入了面向对象的机制而形成的一门计算机编程语言。
C++继承了C语言的大部分特点:一方面,C++语言将C语言作为其子集,使其能与C语言相兼容;另一方面,C++语言支持面向对象的程序设计,如类的概念和性质。
这就是对C语言的重要改进。
3.1.2C++语言的特点 C++语言的特点大致有如下3点:C++语言是一种面向对象的程序设计语言。
其模仿了人们建立现实世界模型的方法。
C++语言的基础是对象和类。
现实世界中客观存在的事物都被称为对象。
例如,一辆汽车、一家百货商场等。
C++中的一个对象就是描述客观事物的一个实体,其是构成信息系统的基本单位。
类(class)是对一组性质相同对象的描述,是用户定义的一种新的数据类型,也是C++语言程序设计的核心。
C++是C语言的超集。
其不仅包含了C语言的大部分特性,例如指针、数组、函数、语法等。
其还包含面向对象的特点,例如封装、继承、多态等。
C++是程序员和软件开发者在实践中创造的。
注意:由于C++语言来源于C语言,所以不管哪种C++结构都可以用C语言实现。
但C语言的结构,C++不一定可以实现。
3.2C++中的各种字符 世界上所有的语言都有自己的字符表示和组合,像平时常常接触到的中文和英文都是如此。
所以为了让大家都能够使用C++编程语言,其设计者也给这种语言定义了自己的字符表示和组合。
从本节起,才真正开始介绍C++编程语言的基础内容。
·37· 第1篇游戏开发基础 3.2.1标识符与关键字 在C++中,有一套用来表示程序中的变量、常量、数据类型及语法关键字的符号,这些符号被统称为标识符。
标识符的命名有如下几点规则需要遵循:标识符的第一个字符必须是字母或者下划线。
标识符中不应有除字母、数字和下划线以外的字符。
标识符的长度一般不超过31个字符。
C++中的标识符可以大写,也可以小写。
不过大写和小写是有区别的,即对应的大小写字母会被当作不同的标识符。
例如Good和good是被当作不同的标识符,Hello和HELLO也是不同的标识符。
例如:下面这些就是合法的标识符的例子。
InnoResultGoodAt_ThisGG_88nCount 而如下这些就是不合法的标识符例子。
2SDA!
bcGG*88good-bye 在C++的标识符中,有些单词组合是不能由用户声明的,其是由C++编程语言本身保留使用,具有特殊的含义。
一般用于表示固定语句、预定义类型说明、预定义函数等。
这种标识符被统称为关键字或者保留字。
有了这些关键字,C++编译器才能正确识别输入的程序代码是如何分隔的,这就好像写应用文时为了突出重点,常常把关键字或者词进行标注一样。
表3.1列出了一些C++中常用的关键字(只是一部分),请读者注意。
publicnewinttruemainbool_asm 表3.1常用关键字 privateconstlongfalsetrysizeof_int8 classvoidshortfloatthisoperator_int16 deleteunsignedchardoubleEnumStruct_int32 注意:在VisualC++中,为了让用户阅读方便,所有的保留关键字都会被自动高亮标识出来。
读者可以在VisualC++的源文件中输入一些关键字试一试。
3.2.2分隔符与注释符 C++中除了3.2.1节所说的标识符外,还有两种起特殊作用的符号。
一种是用来分隔代码语句的,被称为分隔符;另一种是起说明作用的,被称为注释符。
·38· 第3章C++编程语言基础
1.划分语句的分隔符其中分隔符又被称为C++中的标点符号。
用来将单词或者程序分隔,其表示某个程序的结束和另一个程序的开始。
C++中包括如下几种分隔符。
空格符:用来作为单词与单词之间的分隔符。
逗号:用来作为说明多个变量的分隔符,或者多个参数(将在后面的章节讲解)之间的分隔符。
分号:用来作为C++中语句的结束分隔符。
花括号:用来构造程序实体的分隔。

2.使语句无效的注释符注释在程序代码中起到对程序语句注解和说明的作用。
其目的是为了代码设计者或审查者方便阅读程序代码。
对计算机而言其是无效的,在程序编译时,注释会被自动从程序代码中忽略掉。
换句话说,这就好比大家在读书时所做的读书笔记,可以标记在书上,也可以标记在笔记本上,但对书的内容(代码)并没有任何影响,只是起一个辅助说明的作用。
在C++中采用如下两种注释方法。

(1)使用/*和*/括起来进行注释,在/*和*/之间的字符都被作为注释符处理,适用于多行注释信息,如图3.1所示。
图3.1中从/*开始一直到*/结束的两行字符都是被当作注释信息处理的。
图3.1多行注释
(2)使用“//”,从“//”开始直到所在行的行尾,所有字符都被当作注释处理。
适用于单行注释信息。
这种方法已经遇到过多次,如图3.2所示。
图3.2单行注释 在真实的程序编程中,上面介绍的注释方法可以根据不同的情况进行选用,增强了注 ·39· 第1篇游戏开发基础 释和阅读的灵活性。
注意:好的注释,能够提高程序设计或者代码阅读的效率。
3.3C++中的常用数据类型 在C++程序中数据的类型分为很多种,这就好比人的个头有高低、体重有胖瘦、皮肤有黑白一样。
不同类型的数据,在数据存放的空间和处理数据的时间上都是各不相同的。
本节的主要内容就是介绍C++中常用的基本数据类型、声明关键字和格式。
注意:在游戏设计中对于数据的类型尤为重视。
因为采用的数据类型不同,游戏最后的运行速度和处理效果是有质的差别的。
3.3.1整数型数据 所谓的整数型数据类是指数据是没有小数部分的,其值可以是正,也可以是负,简称为整数型。
例如日常生活中用到的12、–22、1234、2009、–999、–2009、0等都是整数型的。
其中12、1234、2009等又被称为正整数,0一般也被当作正整数处理。
而–22、–999,–2009等被称为负整数。
在C++中用int这个关键字来声明一个存放整数型数据的变量(变量这个概念将在3.4节中进行讲解)。
例如: intnCount;intnNum;intabc;. //声明一个整数型变量nCount//声明一个整数型变量nNum//声明一个整数型变量abc 声明整数型时要进行初始化,其方法如下: intnCount=100; 说明:在C++程序中所有数据类型都是通过关键字来声明的。
知道了如何声明一个整数型变量,那么一个整数型在计算机中可以表示的数值的大小范围是多少呢?如表3.2所示。
计算机系统16位机32位机 表3.2有符号整数范围最大值 327672147483647 最小值–32768–2147483648 注意:整数变量能存储的最大值,是由计算机给其分配的存储空间的大小决定的。
在不同的计算机系统中,其表示的范围是不同的。
例如,早期的16位计算机是使用2个字节,而32位计算机则是使用4个字节。
一般,现在的计算机都是32位的,不过也有64位的。
·40· 第3章C++编程语言基础 虽然整数型能表示的数已经比较大,但也有不够用的情况。
例如,在有的游戏中表示银河系两个星球之间的距离是多少千米,或者太阳系的直径是多少米等数据时,整数型变量就不够了。
为此C++中就引入了长整数类型。
用long这个关键字来声明一个长整数型变量。
例如: longlLen;longlCount;longlTime; //声明长整数型变量iLen//声明长整数型变量iCount//声明长整数型变量iTime 长整数型变量,其存储数值的范围如表3.3所示。
计算机系统16位机32位机 表3.3长整数范围最大值21474836472147483647 最小值–2147483648–2147483648 从上面的表中会发现一个问题,长整数和整数其实只是在16位计算机上有表示范围的差异,而在32位计算机上是无差异的。
这是因为在32位计算机上,一般把长整数和整数的表示范围设置为相同大小。
在计算机中长整数可能会降低程序执行的速度,所以有时候为了节约空间和提高程序执行速度,C++中又引入了短整数。
在C++中用short这个关键字来声明一个短整数型变量,其数值的范围在16位和32位计算机上都是一样的,为32767~–32768。
例如: shortsCount;shortsNum;shortsLen; //声明短整数型变量sCount//声明短整数型变量sNum//声明短整数型变量sLen 其实,在日常生活中大家一般使用的都是正整数,即数学中的自然数,负数是比较少使用的。
所以计算机为了在不增加存储空间和不影响执行速度的前提下,在存储数据时,直接把存储数据的符号去掉,这样变量能表示的最大值就扩大了,这种存储的数据在C++中就被称为无符号数据类型。
C++中声明无符号整数型变量,是在int关键字前加上unsigned关键字。
例如: unsignedintunCount;unsignedintunNum;unsignedintabc; //声明无符号整数型变量unCount//声明无符号整数型变量unNum//声明无符号整数型变量abc 既然是把最大值扩大了,那么其数值范围也不同了,无符号整数型变量存放的数值范围如表3.4所示。
计算机系统16位机32位机 表3.4 无符号整数范围最大值655354294967295 最小值00 既然有无符号的整数型变量,那么也就有无符号的长整数和短整数型变量,其声明都是在原关键字前加上unsigned关键字。
例如: ·41· 第1篇游戏开发基础 unsignedlongulCount;unsignedlongulNum;unsignedshortusLen;unsignedshortusCount; //声明无符号的长整数型变量uiCount//声明无符号的长整数型变量uiNum//声明无符号的短整数型变量usLen//声明无符号的短整数型变量usCount 无符号短整数其数值范围在16位和32位计算机上都是65535~
0。
而无符号的长整数其数值范围如表3.5所示。
计算机系统16位机32位机 表3.5 无符号长整数范围最大值42949672954294967295 最小值00 3.3.2实数型数据 实数型数据是由一个整数部分、一个小数部分以及可选的后缀组成的。
例如,3.1415、0.5、0.875等都是实数型数据。
在C++中把实数型数据按照其表示的数值范围进行分类,可分为单精度、双精度和长双精度3种数据类型。

(1)声明一个单精度的实数变量使用float关键字,所以单精度的实数型又被称为浮点型。
例如: floathalf;floatpi;floatnum; //声明单精度的实数变量half//声明单精度的实数变量pi//声明单精度的实数变量num 单精度实数类型一般是以32位进行存储表示的,其数值表示范围为3.4e+38~3.4e–38,最多只提供7位有效数字。

(2)双精度数据类型和单精度数据类似,因为其要占据的存储空间是单精度数据类型的两倍,所以被称为双精度数据类型。
声明一个双精度类型的实数变量,使用double关键字。
例如: doubledbNum1;doubledbNum2;doubledbNum3; //声明双精度的实数变量dbNum1//声明双精度的实数变量dbNum2//声明双精度的实数变量dbNum3 双精度实数类型是以64位进行存储表示的,其数值范围为1.7E–308~1.7E+308,最多可提供16位的有效数字。

(3)长双精度数据类型,理论上是双精度占用存储空间的两倍,但在实际中还是只占用64位的存储空间。
声明一个长双精度实数变量,使用longdouble关键字。
例如: longdoubledbNum1;longdoubledbNum2;longdoubledbNum3; //声明长双精度的实数变量dbNum1//声明长双精度的实数变量dbNum2//声明长双精度的实数变量dbNum3 长双精度因为其占用的存储空间和双精度相同,所以其实数类型的数值表示范围还是为1.7E–308~1.7E+308,最多可提供16位有效数字。
实数在C++中也可以包含一个指数形式的数值,其类似于数字的科学计数表示法。
·42· 第3章C++编程语言基础 例如: 1.5e3其中1.5是尾数部分,3是指数部分,表示的数值为1500。
1.23e-2其中1.23是尾数部分,-2是指数部分,表示的数值为0.0123 注意:字母e或E之前(即尾数部分)必须是有数字的。
e或E后面的指数部分必须是整数。
所有的实数型变量在声明时,对其进行初始化方法如下: floathalf=11111.511;doubledwSize=11111.105; 由于float型的变量只能存储4个字节,有效数字为7位。
所以其中half中的最后一位小数是不起作用的,即其值为11111.51。
但如果是double型的,则dwSize中是能够存储全部11111.105这个数的。
对于这一点,读者只需要记住就行了,不必细究。
3.3.3字符型数据 通常字符型数据变量是用来存储计算机中的字符的。
例如:‘A’,‘#’,‘z’,‘1’等都是字符型的数据。
在计算机中,字符型变量并不是直接存储字符,而是存储字符的ASCII(AmericanStandardCodeforInformationInterchange,美国标准信息交换码)码值。
ASCII码是目前计算机中用得最广泛的字符集及编码,是由美国国家标准局(即ANSI)制定的,其已被国际标准化组织(ISO)定为国际标准,称为ISO646标准。
适用于所有拉丁文字字母。
根据ASCII码标准,数值65代表大写的‘A’,而97则代表小写字母‘a’,表3.6列出了ASCII码表中前128个编码的十进制表示,读者可以不必记住这些代码值,但必须理解每个ASCII码都与一个特定的数值相对应的这个概念,ASCII码表如表3.6所示。
十进制0123456789101112 符号NUTSOHSTXETXEOTENQACKBELBSHTLFVTFF 十进制13141516171819202122232425 表3.6ASCII码表 符号 十进制 CR 26 SO 27 SI 28 DLE 29 DCI 30 DC2 31 DC3 32 DC4 33 NAK 34 SYN 35 TB 36 CAN 37 EM 38 符号SUBESCFSGSRSUS (space)!”#$%& 十进制39404142434445464748495051 符号,()*+,./0123 ·43· 第1篇游戏开发基础 十进制52535455565758596061626364656667686970 符号456789:;<=>?
@ABCDEF 十进制71727374757677787980818283848586878889 符号GHIJKLMNOPQRXTUVWXY 十进制90919293949596979899100101102103104105106107108 符号Z[\]^—、abcdefghijkl 十进制109110111112113114115116117118119120121122123124125126127 续表符号 mnopqrstuvwxyz{|}~DEL 看一下这张表,会发现其中有不少奇怪的字母组合,这些字母组合的含义如表3.7所示。
NULSOHSTXETXEOYENQACKBELBSHTLF 空标题开始正文开始正文结束传输结束询问字符承认报警退一格横向列表换行 表3.7 VTFFCRSOSIDLEDC1DC2DC3DC4NAK 特殊字符的含义 垂直制表走纸控制回车移位输出移位输入空格设备控制1设备控制2设备控制3设备控制4否定 SYNETBCANEMSUBESCFSGSRSUSDEL 空转同步信息组传送结束作废纸尽换置换码文字分隔符组分隔符记录分隔符单元分隔符删除 字符型在计算机中以8位进行存储,其表示数值的范围为127~–128。
在C++中声明一个字符型的变量,使用关键字char,例如: charno;charyes; //声明一个字符型变量no//声明一个字符型变量yes ·44· 第3章C++编程语言基础 chartmp; //声明一个字符型变量tmp 字符型的数据都是使用单引号引起来,例如‘Y’。
如果要在声明字符型变量时进行初始化,其方法如下。
charno='N'; //声明字符变量no,并初始化为
N 在C++中还有一些是由单引号引起来的,但由多个字符所组成的特殊字符,C++把这些特殊字符当作单一字符来处理,称为转义字符。
转义字符都具有特殊的功能,如表3.8所示。
转义字符\a\b\f\n\r\t\v\\\’\”\?
\nnn\xnn 表3.8转义字符 说明蜂鸣回退键换页换行回车换行水平制表垂直制表反斜杠单引号双引号问号八进制位模式,nnn是一个八进制数十六进制位模式,xnn是一个十六进制数 前面在讲解整数型时,知道分为“有符号”和“无符号”两种。
其实字符型数据也是如此。
如果要声明一个无符号的字符型数据,只需要在char关键字的前面加上unsigned关键字,其表示的数值范围就变为255~
0。
例如: usignedcharno;usignedcharid; //声明无符号字符型变量no//声明无符号字符型变量id 现在再来了解另一种字符串型数据,所谓字符串就是由0个或多个字符组成的有限序列。
例如abcde、Hello、1234这些都是字符串。
字符串就相当于一个字符数组。
注意:在表示单独字符的时候,使用单引号,而在表示字符串或多于一个字符的时候必须使用双引号。
3.3.4布尔型数据 布尔型数据即是逻辑型的简单数据值,其只有包含两个值:false(假)和true(真),前者序号为
0,后者序号为
1。
在C++中,虽然布尔类型的数据量最少,但用途却非常广泛,其主要用于程序设计中的流程控制和逻辑判断。
·45· 第1篇游戏开发基础 声明一个布尔型的变量,使用bool关键字,例如: boolbFlg;boolbOpen;boolbClose; //声明一个布尔型变量bFlg//声明一个布尔型变量bOpen//声明一个布尔型变量bClose 在声明布尔型的变量时,也可以进行初始化,其方法如下。
boolno=false; //在定义布尔型变量no时,初始化为false 注意:在C++中,只有0才能表示为假。
其他任何数值代表布尔型变量时都表示真,包括负数。
总之,在设计游戏需要的数据类型时,应尽量满足游戏设计的要求。
比如要计算有小数参与的运算,就应该选择实数类型,而不能选择整数型。
而在没有小数参与的运算时,就应该选择整数型。
3.4C++中的常量与变量 前面的数据类型一节中,常常会提到“变量”,在本节将会对其进行详细的说明。
不仅如此,还将学习到另一个概念——“常量”。
3.4.1变量的定义 变量就是在内存中,可以不断地被程序操作的、有名字的存储区。
在代码中可以只使用一个变量,也可以使用多个变量。
在使用变量前,必须先要创建一个变量。
创建变量的C++语句称为变量的声明,在前面已经见过。
其格式如下: 变量数据类型变量名;intnLen; //声明一个整数型的变量nLen 也可以使用如下格式同时声明n个同类型的变量,但要注意一定是同类型的才能如此。
变量数据类型变量名
1,变量名
2,…,变量名n;inta,b,c; //同时声明三个整数型变量a,b,c 不同类型的变量不能在同一语句中进行声明,下面的方式是错误的。
例如: intlen,shortcount; //在同一行声明不同类型变量,这是错误的 通过前面的学习,知道了C++中的每一个变量都有特定的类型,该类型决定了变量的内存大小和布局,以及能够存储于该内存中的值的取值范围和可应用于该变量上的操作集。
这样计算机就可以正确理解变量中的数据含义了。
在前面的声明格式中看到的“变量名”就是变量的名字,就像每个人都有自己的名字一样,给变量起名的意义是为了区分不同的变量。
在C++中的变量名称是不能随便取的,除了必须遵循标识符命名规则外,还应该尽量遵循下面几条编程经验,虽然不是必须遵循 ·46· 第3章C++编程语言基础 的,但为了方便对代码的阅读和理解,在程序设计时应尽量采用。
见名见意,指当看到这个变量的名称时就能望名知意,这样能便于读者阅读和进行程序设计。
例如,用count来作为计数器变量名,用len作为长度变量名,用age作为年龄变量名等。
尽量不用汉语拼音。
例如,声明一个姓名变量,应该使用name为变量名,而不是用xingming作为变量名。
命名不宜过长。
用很长一串字符来命名会减慢编程的速度,也会使阅读程序困难。
不要用过长的名称来命名变量,一般采用缩写来命名,例如,用init来表示初始化等。
采用驼峰标记法和匈牙利标记法来命名变量。
声明变量之后必须对其进行初始化才能使用,否则会导致程序运算错误。
对变量进行初始化后,变量的值才会有效。
变量名=初始值; 也可以在声明变量的时候进行初始化,其格式如下: 变量类型变量名=初始值; 要注意,在变量初始化的时候,设置的初始值一定要符合变量的数据类型。
例如: intnPI=3.1415intnCount=100 //错误的初始化//正确的初始化 3.4.2常量的定义 与变量相对的就是常量。
变量的值可以在程序中随时而改变,而常量的值是不能被改变的,所以其被称为常量。
比如在游戏设计中,设置常常会把圆周率π设置为常量。
其值就默认等于3.1415927。
在C++中常量分为如下两种:文字常量,例如整数888、字母b等都是文学常量。
自定义常量,即自己声明的常量。
自定义常量的声明格式与变量声明差不多,只是在语句的最前面多了一个const关键字来说明这是一个常量。
例如: const数据类型常量名=文字常量;constintMAX=1000;constdoublePI=3.1415927f; //声明一个int型的常量MAX,其值为1000//声明一个float型的常量 常量必须在声明时进行初始化,并且在除声明语句外,在程序的任何地方不能再对其进行赋值。
这是和变量不同的地方之
一。
声明一个单精度实型常量,需要该文字常量的最后加上F或者f;如果要表示长双精度实型常量,则要在该文字常量的最后加上L或者l。
例如: 1.05f; //声明的是单精度实型常量 ·47· 第1篇游戏开发基础 1.75l2.55F;3.75L; //声明的是长双精度实型常量//因为采用了F说明,所以是单精度常量//因为采用了L说明,所以是长双精度常量 事实上,只要在游戏程序中不需要改变的值,都应用常量来表示。
这样做可以提高程序稳定性和严谨性。
3.5C++中的运算符与表达式 除了变量和常量外,在C++中还有其自身支持的、操作变量的运算符和表达式。
运算符是表示对数值进行一种运算的符号。
其对操作数进行运算,操作数可以是一个数值、变量或者常量。
比如,大家平时接触到的数学中的运算符(+、–)及比较运算符(>、<、=)等。
这些在C++中也是支持的。
C++的运算符范围很广,有带一个操作数的,也有带两个操作数的;有些是专用的,而有些是由其他运算符派生出来的;甚至有些是重载的(将在后面的章节进行讲解)。
所以很难找到一个程序能把所有的运算符都用上。
表达式是与运算符对应的,其代表的是由运算符和操作数组成的式子。
由于运算符很丰富,因此表达式的种类也很多。
最简单的表达式是常量或者变量。
在本章中,笔者只列举出常用的几种简单的运算符和表达式。
同时在示例代码中给出其使用方法。
3.5.1赋值运算符 在程序设计中最常用到的赋值运算符。
C++规定赋值运算符为=,其作用是将一个数据赋值给一个变量,类似于数学中的等于符号。
如num1=1的作用是把字符常量“1”赋值给变量num1。
也可以将一个表达式的值赋值给一个变量,由赋值运算符将一个变量和一个表达式连接起来的语句被称为“赋值表达式”,格式为: 左值=表达式; 赋值运算符的操作过程如下:
(1)计算右边表达式的值。

(2)把右边计算出来的值,存放在左值之中。
左值可以理解为变量或者声明语句中的自定义常量。
例如: a=11;constintA=10; //赋值给左值变量a,值为11//赋值给左值常量
A,值为10 3.5.2算术运算符 在C++中支持的运算符如表3.9所示。
·48· 第3章C++编程语言基础 运算符+–*/% 表3.9算术运算符说明 加法运算符,或者表示正值减法运算符,或者表示负值乘法运算符除法运算符取模运算符,又称取余运算符 例子2+3+85–2–887*29/310%3的结果是
1 算术运算符的计算方法同数学中的基本一致。
不过要注意:当除号两边的数为整数型数据时,其结果为整数。
如5/3的结果值为
1,舍去小数部分。
但是如果除数或者被除数中有一个为负值,则舍去的方向是不固定的。
例如,–5/3有的电脑上–
1,有的是–
2。
下面的例子说明了算术运算符的使用方法,如代码3.1所示【代码参考:光盘的源代码\C03\Demo1.dsp】 代码3.1算术与赋值运算符示例 01#include //一个Windows应用程序应该包含的头文件 02#include03LRESULTCALLBACKWinSunProc //标准输入输出流文件/*声明一个回调函数*/ 04( 05HWNDhwnd,06UINTuMsg, /*窗口的句柄*//*窗口的消息*/ 07WPARAMwParam, 08LPARAMlParam 09); 10intWINAPIWinMain 11( 12HINSTANCEhInstance,13HINSTANCEhPrevInstance,14LPSTRlpCmdLine, //实例句柄,当前应用程序的实例句柄//默认这个参数为NULL//储存一个命令行参数 15intnCmdShow) 16{ 17 WNDCLASSwndcls; 18 wndcls.cbClsExtra=0; 19 wndcls.cbWndExtra=0; 20 //定义一个窗口对象//指定额外内存空间//指定额外内存空间//指定窗口背景色 21 wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); 22 //设置光标样式 23 wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); 24 //设置图标样式 25 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); 26 wndcls.hInstance=hInstance;//指定窗口实例句柄 27 wndcls.lpfnWndProc=WinSunProc;//指定窗口函数,即窗口主处理函数 28 //窗口类名称 29 wndcls.lpszClassName="VisualC++Game"; 30 wndcls.lpszMenuName=NULL; //菜单 31 wndcls.style=CS_HREDRAW|CS_VREDRAW; 32 RegisterClass(&wndcls); 33 HWNDhwnd; 34 hwnd=CreateWindow //注册窗口类//声明窗口句柄/*创建窗口,但这里的窗口是不会显示的*/ 35 ( 36 "VisualC++Game", /*已注册窗口类的名称*/ 37 "VisualC++游戏开发", /*窗口标题*/ ·49· 第1篇游戏开发基础 38 WS_OVERLAPPEDWINDOW, /*窗口风格*/ 39 200, /*窗口位置的横坐标*/ 40 200, /*窗口位置的纵坐标*/ 41 600, /*窗口的宽度*/ 42 400, /*窗口的高度*/ 43 NULL, 44 NULL, 45 hInstance, //实例句柄 46 NULL); 47 //在这里真正显示窗口 48 ShowWindow(hwnd,SW_SHOWNORMAL); 49 UpdateWindow(hwnd); //更新显示 50 MSGmsg; 51 while(GetMessage(&msg,NULL,0,0)) 52 { 53 TranslateMessage(&msg); //转换键盘消息 54 DispatchMessage(&msg); //分派消息 55 } 56 return0; 57} 58LRESULTCALLBACKWinSunProc( 59 HWNDhwnd, /*窗口句柄*/ 60 UINTuMsg, /*消息*/ 61 WPARAMwParam, /*参数1*/ 62 LPARAMlParam /*参数2*/ 63 ) 64{ 65 chartmsg[128]={0}; 66 intnum1,num2,num3,num4,num5;//声明5个变量 67 num1=3+8; //加法运算 68 num2=10-7; //减法运算 69 num3=100*33; //乘法运算 70 num4=155/5; //除法运算 71 num5=9%2; //取模运算 72 //把运算符和结果输出到tmsg中 73 sprintf(tmsg,"3+8=%d10-7=%d100*33=%d155/5=%d9%%2=%d", 74 num1,num2,num3,num4,num5); 75 switch(uMsg) /*判断消息类型*/ 76 { 77 caseWM_PAINT: /*更新窗口消息*/ 78 HDChDC; /*定义DC设备*/ 79 PAINTSTRUCTps; 80 hDC=BeginPaint(hwnd,&ps); /*得到设备hDC*/ 81 TextOut(hDC,150,0,tmsg,strlen(tmsg)); 82 EndPaint(hwnd,&ps); 83 break; 84 caseWM_CLOSE: /*当单击“关闭”按钮时,产生关闭消息*/ 85 if(IDYES==MessageBox(hwnd,"是否真的结束?","游戏开发",MB_ YESNO)) 86 { 87 DestroyWindow(hwnd);/*单击“确定”按钮,销毁窗口*/ 88 } 89 break; 90 caseWM_DESTROY: /*销毁窗口消息*/ 91 PostQuitMessage
(0); /*退出程序*/ 92 break; ·50· 第3章C++编程语言基础 9394 95969798} default://在default:处必须调用DefWindowProc,这是Windows内部默认的消息处理函数returnDefWindowProc(hwnd,uMsg,wParam,lParam); }return0; 代码解析:第71行,是用%运算符来表示这是一个取模运算。
其意思是用来得到除法运算后的余数,即数学中的取余运算。
其方法是先用9除以
2,得到商是
4,余数是
1,再把商丢弃,最后得到余数,并保存到变量num5中。
第73行是把变量的结果格式化输出到字符数组tmsg中,格式化输出的方法是属于C语言的内容,请参见相关书籍,这里不再介绍。
代码编译运行的结果如图3.3所示。
图3.3赋值与算术运算符示例运行结果 在C++中用算术运算符和括号将运算对象连接起来的、符合C++语法规则的语句,被称为算术表达式。
运算对象包含常量、变量等。
如代码3.1中的3+8、10–7、num2*num1、num3/5,以及num3%2这些语句都是算术表达式。
3.5.3自增与自减运算符 有两个特殊的运算符++和––,在C++中被称为自增和自减运算符,运算符++的作用是使变量的值增加
1。
其表达式如下: a++;++a; //相当于a=a+1//相当于a=a+
1 a++和++a的作用相当于a=a+1都是将a的值加
1,但也有些不同。
因为a++是先使用a的值,再执行a=a+
1。
而++a是先执行a=a+
1,然后使用a的值。
如果使用另一个变量来存放运算结果,这两种形式的不同就容易理解了。
例如:现在假定a的初值是30。
inta=30;intb=a++; 上面的语句是先将a的值30赋值给b,然后a增加
1。
最后的结果是变量b的值为30,而变量a的值为31。
如果把语句修改为: Inta=30;intb=++a; 上面的语句是先将a增加
1,然后将a的新值31放在b中,最后的变量结果是变量b的值为31,而变量a的值仍为31。
在这里,把++a念为“a先加”而把a++念为“a后加”。
好了,相信现在大家应该明 ·51· 第1篇游戏开发基础 白++的作用了吧,其实另外一个运算符––正好和++的作用相反,是将变量的值减少
1。
但运算过程是一样的,这里不再复述。
自增(++)和自减(––)运行符,只能用于变量,而不能用于常量或者表达式,如“10++”或者(a*c)++都是不合法的。
因为10是常量,常量的值不能被改变。
而“(a*c)++”是一个表达式,相加之后的结果没有变量可供存放。
3.5.4复合运算符 复合运算符是对赋值运算符的扩展,其是在“=”赋值符之前加上其他运算符,就构成了复合运算符。
使用复合运算符可以简化程序,使程序看上去精练,提高代码的编译效率。
其表达式格式如下: 变量运算符=表达式; 例如: b+=4;b-=4; //等价于b=b+4//等价于b=b-
2 以“b+=4”为例来说明,其相当于先使变量b加
4,然后再重新赋值给变量b。
同理,“b–=4”是先使变量b减
4,然后再赋值给变量b。
为了便于记忆,读者也可以这样理解: (1)a+=b,其中a为变量,而b为表达式。

(2)把a+移动到=的右侧,变成=a+b。

(3)在=的左边补上变量名,变成a=a+b。
即变成如下格式: 变量=变量运算符表达式 如果表达式是由几个表达式组成的,则相当于该表达式是有括号的。
例如:a*=3*(2+3)。
=a*(3*(2+3))。
a=a*(3*(2+3)),不要写成a=a*3*(2+3)。
凡是只有两个操作数的运算符,都可以与赋值运算符组成复合运算符。
在C++中规定了如下所示两类共10种复合运算符。
算术类:+=、–=、*=、/=、%=。
位运算类:<<=、>>=、&=、^=、|=。
3.5.5位运算符 在计算机内所有的数据,总是用0和1的组合进行存储的,也就是二进制。
而8个二进制位构成一个字节,两个字节构成一个字,也就是16位。
有时按位来操作数据是很必要的,程序员可以通过改变存储在位、字节或者字中的0和1来改变它的值,这也就是位操作的由来。
其表达式如下: ·52· 变量位运算符变量或者常量第3章C++编程语言基础
1.左位移运算符(<<) 左位移运算符是将一个字中的数据位左移指定的位数。
左移位一次相当于对当前这个数值每次乘
2。
其实现的方法如下:
(1)在32位计算机中,7被表示为0000000000000111。

(2)左移4位,变成000000000111…。

(3)空位用0来填充,变成0000000001110000。

(4)这个二进制数的数值正好是112。

2.右位移运算符(>>) 右位移运算符刚好和左位移相反,它是将一个字中的数据位右移指定的位数。
实现方法如下:
(1)在32位计算机中,128被表示为0000000010000000。

(2)右移2位,变成…0000000010000。

(3)空位用0来填充,变成0000000000010000。

(4)这个二进制数的数值正好是16。
不过要注意,在右移位时,只有移位的变量是正数时,才会用0作为填充位,而如果变量是负数的话,右移位的结果是无法预料的,左移位无此限制。
右移位一次相当于对当前数值每次除
2。

3.按位与运算符(&) 按位与运算符(&)是用来得到两个整数操作数的逻辑乘积。
当被“与”的两位是1时结果是
1,否则结果为
0,如表3.10所示。
操作位10011 表3.10按位与示例表操作位2 0101 结果0001 现在设定n的初值为250,m的初值为86。
那么这两个数进行按位与运算后,其结果如表3.11所示。
数值111110100101011001010010 表3.11按位与运算结果说明 250二进制86二进制对齐后,根据表5.2方法竖式运算,结果为82 ·53· 第1篇游戏开发基础
4.按位或运算符(|) 按位或运算符(|)是用来得到两个整数操作数的逻辑和。
当被“或”的两位是0时结果是
0,否则结果为
1,如表3.12所示。
操作位10011 表3.12操作位2 0101 按位或示例表 结果0111 现在设定n的初值为250,m的初值为86,进行按位或运算过程和结果如表3.13所示。
数值111110100101011011111110 表3.13按位或运算结果说明 250二进制86二进制对齐后,根据表5.4方法竖式运算,结果为254
5.按位异或运算符(^) 按位异或运算符(^)是用来得到两位操作数之间的异或结果的,其示例见表3.14。
操作位10011 表3.14按位异或示例表操作位2 0101 结果0110 现在设定n的初值为250,m的初值为86,进行按位异或运算过程和结果如表3.15所示。
数值111110100101011010101100 表3.15按位异或运算结果 250二进制 说明 86二进制 对齐后,根据表5.4方法竖式运算,结果为172 3.5.6关系运算符 关系运算符与数学的比较运算符的运算方法相同,但标记格式不同。
C++提供了6种 ·54· 第3章C++编程语言基础 关系运算符,如表3.16所示。
运算符<<=>>===!
= 表3.16关系运算符说明小于小于等于大于大于等于等于不等于 例子a<10a<=10b>10b>=200a==ba!
=b 用关系运算符将两个表达式连接起来的式子,称为关系表达式,例如: a>ba+b(1)或者“假”
(0)
例如,关系表达式“5==3”的值为“假”,而“5>3”的值为“真”。
3.6C++中的控制语句 一个结构化程序设计需要3种基本结构:连续结构、选择结构和循环结构。
在C++中这3种结构分别对应基本语句、条件选择语句和循环语句。
掌握好这3种语句的使用,对于程序设计是非常重要的。
和其他高级语言一样,C++的语句也是用来向计算机系统发出操作指令的。
这就好像操练时的“向左转”、“向右转”、“稍息”、“立正”等一系列口令(即语句)。
有了这些口令大家才能走出整齐的队列。
3.6.1基本语句 一条基本语句经过编译后,将产生几条机器指令。
为实现特定功能的程序一般又包含若干条基本语句。
通常把C++的基本语句分为如下两种。

1.简单的基础语句 在一个C++程序中有许多表达式。
有由算术运算符组成的算术表达式、由赋值运算符组成的赋值表达式、由位运算符组成的位运算表达式等。
例如: x=x+4x=7*yy=4,x=3,n/55x++,y-x|y+n^m //算术表达式//赋值表达式 //位运算表达式 ·55·

标签: #c4d #转换成 #容量 #web #培训机构 #后缀名 #cs1.6怎么联机 #大众