1、目录 C+语言概述 标准I/O流 基本数据类型和表达式 流程控制 顺序 选择 循环 其他控制语句1C+的产生和发展 C+从C语言发展演变而来,最初的C+被称为“带类的C”;1983年正式取名为C+;于1998年11月被国际标准化组织(ISO)批准为国际标准;2003年10月15日发布第2版C+标准ISO/IEC 14882:2003;2011年8月12日ISO公布了第三版C+标准C+11,C+11标准包含核心语言的新机能,而且扩展C+标准程序库;2014年8月18日ISO公布了C+14,其正式名称为”International Standard ISO/IEC 14882:2014(E)Pro
2、gramming Language C+”。C+14旨在作为C+11的一个小扩展,主要提供漏洞修复和小的改进;2017年12月ISO公布了C+17,它相较于C+14引入了如文件系统库等很多新特性,移除了如register存储类说明符等弃用特性;2C+的特点 兼容C 它保持了C的简洁、高效和接近汇编语言等特点 对C的类型系统进行了改革和扩充 C+也支持面向过程的程序设计,不是一个纯正的面向对象的语言 支持面向对象的方法 支持泛型程序设计方法3例2-1 C+程序实例/2_1.cpp#include using namespace std;int main()cout Hello!endl;cout
3、 Welcome to c+!endl;return 0;运行结果:Hello!Welcome to c+!I/O流 在C+中,将数据从一个对象到另一个对象的流动抽象为“流”。流在使用前要被建立,使用后要被删除。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。数据的输入与输出是通过I/O流来实现的,cin和cout是预定义的流类对象。cin用来处理标准输入,即键盘输入。cout用来处理标准输出,即屏幕输出。5预定义的插入符和提取符“”是预定义的插入符,作用在流类对象cout上便可以实现项标准输出设备输出。cout 表达式 表达式 表达式.提取符可以连续写多个,每个后面跟一个
4、表达式,该表达式通常是用于存放输入值的变量。例如:int a,b;cin a b;6C+字符集 大小写的英文字母:AZ,az 数字字符:09 特殊字符:!#%&*_+=-/“;.,:?()|7词法记号 关键字C+预定义的单词 标识符程序员声明的单词,它命名程序正文中的一些实体 文字在程序中直接使用符号表示的数据 操作符用于实现各种运算的符号 分隔符(),:;用于分隔各个词法记号或程序正文 空白符空格、制表符(TAB键产生的字符)、垂直制表符、换行符、回车符和注释的总称8关键字alignasalignofasmautoboolbreak casecatchcharchar16_tchar32_t
5、class const constexprconst_cast continuedecltypedefaultdeletedodoubledynamic_castelseenumexplicitexportexternfalsefloatforfriendgotoifinlineintlong mutablenamespacenewnoexceptnullptroperatorprivateprotectedpublicreinterpret_castreturnshortsignedsizeofstaticstatic_cast structswitchtemplatethisthread_
6、localthrow truetrytypedeftypeidtypenameunion unsignedusing virtualvoidvolatilewchar_twhile9标识符的构成规则 以大写字母、小写字母或下划线(_)开始。可以由以大写字母、小写字母、下划线(_)或数字09组成。大写字母和小写字母代表不同的标识符。不能是C+关键字或操作符。10基本数据类型 C+能够处理的基本数据类型 整数类型 浮点数类型 字符类型 布尔类型 程序中的数据 常量 在源程序中直接写明的数据,其值在整个程序运行期间不可改变,这样的数据称为常量。变量 在程序运行过程中允许改变的数据,称为变量。11文字
7、常量 所谓常量是指在程序运行的整个过程中其值始终不可改变的量,文字常量是直接使用符号(文字)表示的值。例如:12,3.5,A都是常量。12变量 变量定义:数据类型 变量名1,变量名2,.,变量名n;在定义一个变量的同时,也可以对它初始化。C+语言中提供了多种初始化方式,例如:int a=0;int a(0);int a=0;int a0;其中使用大括号的初始化方式称为列表初始化,列表初始化时不允许信息的丢失。例如用double值初始化int变量,就会造成数据丢失。C+基本数据类型没有字符串类型,C+标准库中有string类。13符号常量(由const修饰的对象)常量定义语句的形式为:const
8、 数据类型说明符 常量名=常量值;数据类型说明符 const 常量名=常量值;constexpr 数据类型说明符 常量名=常量表达式;/constexpr修饰的对象暗含了const属性,并且必须由常量表达式初始化。例如,我们可以定义一个代表圆周率的符号常量:const float PI=3.1415926;constexpr int size=get_size();/要求get_size()为常量表达式,即函数返回常量表达式。符号常量在定义时一定要初始化,而在程序中间不能改变其值。引入constexpr关键字要求编译器会验证初始值是否为常量表达式。14常量表达式常量表达式是一类值不能发生改变的
9、表达式,其值在编译阶段确定,便于程序优化。文字常量是常量表达式,由常量表达式初始化的const对象也是常量表达式。一个对象或表达式是否为常量表达式取决于它的类型与初始值,例如:const int max_size=100;/max_size是常量表达式const int limit=max_size+1;/limit是常量表达式int student_size=30;/studemt_size不是常量表达式const int size=get_size();/size不是常量表达式15基本数据类型 整数类型 基本的整数类型 int 按符号分 符号的(signed)和无符号的(unsigned)
10、按照数据范围分 短整数(short)和长整数(long)、长长整数(long long)char类型 字符型,实质上存储的也是整数(详见字符类型)16整数文字常量 以文字形式出现的整数;十进制 若干个09的数字,但数字部分不能以0开头,正数前边的正号可以省略。八进制 前导0+若干个07的数字。十六进制 前导0 x+若干个09的数字及AF的字母(大小写均可)。后缀 后缀L(或l)表示类型至少是long,后缀LL(或ll)表示类型是long long,后缀U(或u)表示unsigned类型。17基本数据类型 浮点数类型 单精度 float 双精度double 扩展精度 long double18浮
11、点数文字常量 以文字形式出现的实数。一般形式:例如,12.5,-12.5等。指数形式:例如,0.345E+2,-34.4E-3 整数部分和小数部分可以省略其一 浮点常量默认为double型,如果后缀F(或f)可以使其成为float型,例如:12.3f。19sizeof 运算符 语法形式sizeof(类型名)或 sizeof 表达式 结果值:“类型名”所指定的类型,或“表达式”的结果类型所占的字节数。例:sizeof(short)sizeof x20基本数据类型 字符类型 char类型 容纳单个字符的编码 字符串类型(详见第6章)C风格的字符串 采用字符数组 C+风格的字符串 采用标准C+类库中
12、的string类 布尔类型 bool类型,只有两个值:true(真)、false(假)常用来表示关系比较、相等比较或逻辑运算的结果21字符文字常量 单引号括起来的一个字符,如:a,D,?,$C+转义字符列表(用于在程序中表示不可显示字符)字符常量形式ASCII码(十六进制)含义a07响铃n0A换行t09水平制表符v0B垂直制表符b08退格r0D回车f0C换页5C字符“”22双引号27单引号?3F问号22C风格字符串常量 一对双引号括起来的字符序列 字符串与字符是不同的,它在内存中的存放形式是:按串中字符的排列次序顺序存放,每个字符占一个字节,并在末尾添加 0 作为结尾标记。23C风格字符串常量
13、 通过添加前缀可以改变字符常量或者字符串常量的类型,前缀及其含义如下表所示:前缀含义类型uUnicode 16 字符char16_tUUnicode 32字符char32_tL宽字符wchar_tu8UTF-8(仅用于字符串字面常量)char24基本数据类型类型名长度(字节)取值范围bool1false,truechar1-128127signed char1-128127unsigned char10255short(signed short)2-3276832767unsigned short2065535int(signed int)4-231231-1unsigned int40232
14、-1long(signed long)4-231231-1unsigned long40232-1long long8-263263-1unsigned long long80264-1float4绝对值范围3.410-383.41038double8绝对值范围1.710-3081.710308long double8绝对值范围1.710-3081.710308注:表中各类型的长度和取值范围,以面向IA32处理器的msvc12和2 gcc4.8为准25基本数据类型 ISO C+标准并没有明确规定每种数据类型的字节数和取值范围,它只是规定它们之间的字节数大小顺序满足:(signed/unsign
15、ed)signed char (unsigned)short int (unsigned)int (unsigned)long int long long int26类型别名 可以为一个已有的数据类型另外命名 typedef 已有类型名 新类型名表 typedef double Area,Volume;typedef int Natural;Natural i1,i2;Area a;Volume v;using 新类型名=已有类型名;using Area=double;using Volume=double;27auto类型与decltype类型 auto让编译器通过初始值自动推断变量的类型。
16、例如:auto val=val1+val2;val的类型取决于表达式val1+val2的类型,如果val1+val2是int类型,那么val将是int类型;如果val1+val2是double类型,那么val将是double类型。定义一个变量与某一表达式的类型相同,但并不想用该表达式初始化这个变量,这时我们需要decltype变量 例如:decltype(i)j=2;表示 j 以 2 作为初始值,类型与 i 一致。28算术运算符与算术表达式 基本算术运算符 +-*/(若整数相除,结果取整)%(取余,操作数为整数)优先级与结合性先乘除,后加减,同级自左至右+,-(自增、自减)例:i+;-j;29
17、赋值运算符和赋值表达式 简单的赋值运算符=举例n=n+5 表达式的类型赋值运算符左边对象的类型 表达式的值赋值运算符左边对象被赋值后的值30逗号运算和逗号表达式 格式表达式1,表达式2 求解顺序及结果先求解表达式1,再求解表达式2最终结果为表达式2的值 例a=3*5,a*4 最终结果为6031关系运算与关系表达式 关系运算是比较简单的一种逻辑运算,优先次序为:=!=优先级相同(高)优先级相同(低)关系表达式是一种最简单的逻辑表达式其结果类型为 bool,值只能为 true 或 false。例如:a b,c b)&(x y)其结果类型为 bool,值只能为 true 或 false33逻辑运算与
18、逻辑表达式(续)“&”的“短路特性”表达式1&表达式2 先求解表达式1 若表达式1的值为false,则最终结果为false,不再求解表达式2 若表达式1的结果为true,则求解表达式2,以表达式2的结果作为最终结果“|”也具有类似的特性34条件运算符与条件表达式 一般形式表达式1?表达式2:表达式3表达式1 必须是 bool 类型 执行顺序 先求解表达式1,若表达式1的值为true,则求解表达式2,表达式2的值为最终结果 若表达式1的值为false,则求解表达式3,表达式3的值为最终结果 例:x=a b?a:b;35条件运算符与条件表达式(续)条件运算符的优先级 条件运算符优先级高于赋值运算符
19、,低于逻辑运算符 表达式2、3的类型可以不同,条件表达式的最终类型为 2 和 3 中较高的类型。例:x=a b?a:b;36位运算按位与(&)运算规则 将两个运算量的每一个位进行逻辑与操作 举例:计算 3&5 3:0 0 0 0 0 0 1 1 5:0 0 0 0 0 1 0 13&5:0 0 0 0 0 0 0 1 用途:将某一位置0,其他位不变。例如:将char型变量a的最低位置0:a=a&0 xfe;取指定位。例如:有char c;int a;取出a的低字节,置于c中:c=a&0 xff;37位运算按位或(|)运算规则 将两个运算量的每一个位进行逻辑或操作 举例:计算 3|5 3:0 0
20、 0 0 0 0 1 1 5:0 0 0 0 0 1 0 13|5:0 0 0 0 0 1 1 1 用途:将某些位置1,其他位不变。例如:将 int 型变量 a 的低字节置 1:a=a|0 xff;38位运算按位异或()运算规则 两个操作数进行异或:若对应位相同,则结果该位为 0,若对应位不同,则结果该位为 1,举例:计算 071052 071:0 0 1 1 1 0 0 1 052:0 0 1 0 1 0 1 0 071052:0 0 0 1 0 0 1 139位运算按位异或()(续)用途:使特定位翻转(与0异或保持原值,与1异或取反)例如:要使 01111010 低四位翻转:0 1 1 1
21、 1 0 1 0 ()0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 140位运算取反()单目运算符,对一个二进制数按位取反。例:025:0000000000010101 025:111111111110101041位运算移位 左移运算()右移后,低位:舍弃高位:无符号数:补0 有符号数:补“符号位”42混合运算时数据类型的转换隐含转换条件 转换有一个操作数是long double型。将另一个操作数转换为long double型。前述条件不满足,并且有一个操作数是double型。将另一个操作数转换为double型。前述条件不满足,并且有一个操作数是float型。将另一个操作数转换为
22、float型。前述条件不满足(两个操作数都不是浮点数)。有一个操作数是unsigned long long型。将另一个操作数转换为unsigned long long型。有一个操作数是long long型,另一个操作数是unsigned long型两个操作数都转换为unsigned long long型。前述条件不满足,并且有一个操作数是unsigned long型。将另一个操作数转换为unsigned long型。前述条件不满足,并且有一个操作数是long型,另一个操作数是unsigned int型。将两个操作数都转换为unsigned long型。前述条件不满足,并且有一个操作数是long
23、型。将另一个操作数转换为long型。前述条件不满足,并且有一个操作数是unsigned int型。将另一个操作数转换为unsigned int型。前述条件都不满足将两个操作数都转换为int型。43混合运算时数据类型的转换 当把一个非布尔类型的算术值赋给布尔类型时,算术值为0则结果为false,否则结果为true。当把一个布尔值赋给非布尔类型时,布尔值为false则结果为0,布尔值为true则结果为1 当把一个浮点数赋给整数类型时,结果值将只保留浮点数中的整数部分,小数部分将丢失。当把一个整数值赋给浮点类型时,小数部分记为0。如果整数所占的空间超过了浮点类型的容量,精度可能有损失。44混合运算时
24、数据类型的转换显式转换 语法形式(3种):类型说明符(表达式)(类型说明符)表达式 类型转换操作符(表达式)类型转换操作符可以是:const_cast、dynamic_cast、reinterpret_cast、static_cast 显式类型转换的作用是将表达式的结果类型转换为类型说明符所指定的类型。例:int(z),(int)z,static_cast(z)三种完全等价45简单的I/O格式控制操纵符名含 义 dec 数值数据采用十进制表示 hex 数值数据采用十六进制表示 oct 数值数据采用八进制表示 ws 提取空白符 endl 插入换行符,并刷新流 ends 插入空字符setpreci
25、sion(int)设置浮点数的小数位数(包括小数点)setw(int)设置域宽常用的I/O流类库操纵符例:cout setw(5)setprecision(3)3.1415;46例2_2:输入一个年份,判断是否闰年/2_2.cpp#include using namespace std;int main()int year;bool isLeapYear;cout year;isLeapYear=(year%4=0&year%100!=0)|(year%400=0);if(isLeapYear)cout year is a leap year endl;elsecout year is not
26、 a leap year y)cout y)cout x;else cout y;if(表达式1)语句1else if(表达式2)语句2else if(表达式3)语句3 else 语句 n48例2_3:输入两个整数,比较两个数的大小。/2_3.cpp#includeusing namespace std;int main()int x,y;cout x y;if(x!=y)if(x y)cout y endl;elsecout x y endl;elsecout x=y endl;return 0;运行结果1:Enter x and y:5 8x y嵌套的if结构(续)语法形式if()if()
27、语句 1 else 语句 2else if()语句 3 else 语句 4 注意语句 1、2、3、4 可以是复合语句,每层的 if 与 else 配对,或用 来确定层次关系。50if(表达式1)语句1else if(表达式2)语句2 else if(表达式3)语句3 else 语句 nif(表达式1)语句1else if(表达式2)语句2else if(表达式3)语句3 else 语句 n51例2_4:输入一个06的整数,转换成星期输出/2_4.cpp#include using namespace std;int main()int day;cin day;switch(day)case 0
28、:cout Sunday endl;break;case 1:cout Monday endl;break;case 2:cout Tuesday endl;break;case 3:cout Wednesday endl;break;case 4:cout Thursday endl;break;case 5:cout Friday endl;break;case 6:cout Saturday endl;break;default:coutDay out of range Sunday.Saturday endl;break;return 0;switch语句的语法 一般形式switch
29、(表达式)case 常量表达式 1:语句1 case 常量表达式 2:语句2 case 常量表达式 n:语句n default:语句n+1 l执行顺序以case中的常量表达式值为入口标号,由此开始顺序执行。因此,每个case分支最后应该加break语句。case分支可包含多个语句,且不用。表达式、判断值都是int型或char型。若干分支执行内容相同可共用一组语句。53例2_5:求自然数110之和/2_5.cpp#include using namespace std;int main()int i=1,sum=0;while(i=10)sum+=i;/相当于sum=sum+i;i+;cout
30、sum=sum endl;return 0;运行结果:sum=55分析:本题需要用累加算法,累加过程是一个循环过程,可以用while语句实现。while语句的语法 形式while (表达式)语句可以是复合语句,其中必须含有改变条件表达式值的语句。执行顺序 先判断表达式的值,若为 true 时,执行语句。55例2_6:输入一个整数,将各位数字翻转后输出/2_6.cpp#include using namespace std;int main()int n,right_digit;cout n;cout The number in reverse order is ;do right_digit=
31、n%10;cout right_digit;n/=10;/相当于n=n/10 while(n!=0);cout endl;return 0;运行结果:Enter the number:365The number in reverse order is 563do-while 语句的语法形式 一般形式do 语句while(表达式)可以是复合语句,其中必须含有改变条件表达式值的语句。执行顺序先执行循环体语句,后判断条件。表达式为 true 时,继续执行循环体 与while语句的比较:while 语句执行顺序 先判断表达式的值,为true时,再执行语句57例2_7:用do-while语句,求自然数1
32、10之和/2_7.cpp#include using namespace std;int main()int i=1,sum=0;do sum+=i;i+;while(i=10);cout sum=sum endl;return 0;对比下面的程序程序1:#include using namespace std;int main()int i,sum=0;cin i;while(i=10)sum+=i;i+;cout sum=sum endl;return 0;程序2:#include using namespace std;int main()int i,sum=0;cin i;do sum
33、+=i;i+;while(i=10);cout sum=sum endl;return 0;例2_8:输入一个整数,求出它的所有因子/2_8.cpp#include using namespace std;int main()int n;cout n;cout Number n Factors ;for(int k=1;k=n;k+)if(n%k=0)cout k ;cout endl;return 0;运行结果1:Enter a positive integer:36Number 36 Factors 1 2 3 4 6 9 12 18 36 运行结果2:Enter a positive i
34、nteger:7Number 7 Factors 1 7 for语句(续)语法形式for (初始语句;表达式1;表达式2)语句 循环前先求解为true时执行循环体 每次执行完循环体后求解for语句还有另一种更加简洁的写法,称为范围for语句,语法形式为:for (声明:表达式)语句这种形式的for语句主要用于遍历一个容器中的序列,将在第6、10章详细介绍61循环结构与选择结构的嵌套例2_10:输入一系列整数,统计出正整数个数i和负整数个数j,读入0则结束。分析:需要读入一系列整数,但是整数个数不定,要在每次读入之后进行判断,因此使用while循环最为合适。循环控制条件应该是n!=0。由于要判断
35、数的正负并分别进行统计,所以需要在循环内部嵌入选择结构。62例2-10/2_10.cpp#include using namespace std;int main()int i=0,j=0,n;cout Enter some integers please(enter 0 to quit):n;while(n!=0)if(n 0)i+=1;/if(n n;cout Count of positive integers:i endl;cout Count of negative integers:j endl;return 0;其他控制语句 break语句使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句。不宜用在别处。continue 语句结束本次循环,接着判断是否执行下一次循环。goto 语句goto语句的作用是使程序的执行流程跳转到语句标号所指定的语句。64小结 主要内容 C+语言概述、基本数据类型和表达式、数据的输入与输出。程序流程的选择和循环结构if、while、do.while、for语句适用的场合、算法,几种流程控制语句的语法。达到的目标 掌握C+语言的基本概念和基本语句,能够编写简单的程序段。能够设计简单的选择结构、循环结构算法,能够运用流程控制语句实现简单算法。简单了解枚举类型。65