C的数据和表达式四川内江第二中学.docx
《C的数据和表达式四川内江第二中学.docx》由会员分享,可在线阅读,更多相关《C的数据和表达式四川内江第二中学.docx(27页珍藏版)》请在冰豆网上搜索。
C的数据和表达式四川内江第二中学
第一章《C++的数据和表达式》
内江二中C++培训讲稿
袁武廷2010年2月
课时2:
C++的词法符号
1、定义:
词法符号是程序中不可再分的单位。
2、C++的词法符号共有六类,它们是:
①关键字;②标识符;③常量;④字符串;⑤运算符;⑥标点符号。
它们是C++程序的“基石”,必须认真掌握每种词法符号。
本节课我们学习:
关键字、标识符和标点符号三类。
(一)关键字
关键字又叫保留字,是C++系统预定义的符号,在程序中具有固定的意义,程序员不能重新定义用作它用。
C++的关键字有几十个,随着同学们学习的深入,掌握的数量就会越来越多。
前面例题我们见过的以及马上我们会学到的有:
doublefloatifelse
charintvoidlongshortsignedunsigned
(二)标识符
是程序员自定义的名字,主要用来给“变量、函数、类”等命名。
1、标识符的组成
(1)大写字母;
(2)小写字母;(3)数字符号0到9;(4)下划线“_”。
(除了此四种字符外,不能有其它的符号)
2、组成标识符的规则
*字母或下划线开始;*其后可以跟0个或多个字母、数字、下划线。
(1)合法的标识符
Mysteryresultdouble_list_workof_old_977
(2)不合法的标识符
12bD$7_i
(3)字母区分大小字
addAddaDdADd是四个不同的标识符
(4)标识符不能是前面说的关键字
经验
(5)定义标识符时可以用单词或缩写来定义,尽量能使标识符能“顾名思义”,这样就会增加标识符的可读性从而增加整个程序的可读性。
如返回结果的变量,它的标识符就可定义为:
result
(6)由于C++系统库中的符号都是以下划线开头的,因此程序员在自己的程序中定义的标识符,最好不要用下划线开始,以免同系统库中的符号相冲突。
最好也不要用连续的两个下划线。
如:
最好不用_result来标识返回结果的变量。
最好不出现形如:
r__kk两个连续的下划线。
(三)标点符号
#(){},:
;等等
C++要求在程序的某些地方必须写上相应的标点符号,但不表示任何实际的操作。
如:
词句结束时,必须写上“;” { } 与()须成对出现。
[说明]
1、什么是C++中的“空白”?
在C++程序中,输入空格、制表符(TAB)、回车换行符,将产生C++所谓的“空白”。
空白用来表示词法符号的开始和结束,多余的空白将会被忽略。
如:
inti;floatf; 与inti;floatf;是等价的,都是由六个词法符号组成。
又如:
inti;
floatf;
cin>>f;
i=(int)f;
与
inti;
floatf;
cin>>f;
i=(int)f;
两个程序块也是等价的。
2、C++中的注释被法成空白对待
如:
cin>>f;//输入一个值给f变量
3、C++中,编译器在分析词法符号时,总是提取最长的有效符号。
如integer被分析成为一个标识符(表示整数),而不被分析成int和eger,虽然int也有意义。
课时3:
C++基本数据类型
引言:
①程序数据都必须是具有某种数据类型的数据
②数据的数据类型限制着数据的两个方面的性质:
一是数据类型定义了该数据的存储表示;二是数据类型定义了该数据所能参加的运算的集合。
③描述数据的数据类型的名字叫做类型名。
类型名:
可以是一个简单的关键字,也可以是一个表达式。
如前面程序中我们用到的double它定义的数据的类型就是双精度型。
④C++的数据类型有很多,主要分成两类:
一是“基本类型”;二是“派生类型”。
(一)C++的基本数据类型
类型名位数范围
char8-128到127
int16-32768到32767
float32-3.4E-38到3.4E+38
double64-1.7E-308到1.7E+308
void0无值
(1)char字符型;int整型;float浮点型;double 双精度浮点型;void 无值型
(2)位数,是指这种数据类型的数据点用内存的大小
(3)范围,是指这种类型的变量,能接受的数的范围。
(4)char型的变量:
用来保存8位的Ascii字符;int型的变量用来保存整数;float和double型的变量用来存贮不同精度的有小数点的数;void主要用于定义函数的返回值。
(二)C++基本类型的修饰名词
shortlongsignedunsigned
上面四个修饰符用于改变基本数据类型的含义,以便更加适合于各种实际情况的需要。
加上了修饰符的类型仍是基本数据类型(不是前面说的派生类型)
char-128--127
signedchar-128--127
unsignedchar0-255
shorint-32768--32767
signedshorint-32768--32767
unsignedshorint0-65535
int-32768--32767
signedint-32768--32767
unsignedint0-65535
longint-2,147,483,648—2,147,483,647
signedlongint-2,147,483,648—2,147,483,647
unsignedlongint0—4,294,967,295
float3.4E-38—3.4E+38
double1.7E-308—1.7E+308
longdouble3.4E-4932—1.1E+4932
1、当用short、long、signed、unsigned 修饰int时int可以省略,如:
unsignedintx;可写成unsignedx;
longintx可写成longx;
2、当未使用signed或unsigned修饰int时,C++默认为是有符号的,即是默认是用signed修饰。
3、程序员在使用变量时,应该根据实际情况中数据种类(带不带小数或是表不表示ASCII字符等)和这个数据的取值范围,来选择将变量定义成为何种数据类型。
[例题]我想用一个变量来表示普通中学的在读的学生学号,如果这个变量的名字用标识符num来表示,请同学们想想该变量应该选择什么数据类型?
4、字符变量不仅能存贮ASCII字符,也可以用来存贮-128至127或是0到255之间的整数,如果你的程序中的某个数据是这个取值范围,你也可以用char型的变量来存贮。
5、在选择变量的类型时,要尽量根据数据的情况来选择类型,在估计不准时,肯定是宁愿选大范围的,这样程序不会出错。
课时4:
常量
引言:
①常量是用来表示固定的数值或字符值的词法符号。
②常量一旦定义,值就不能更改。
③常量都具有数据类型,由常量的表示方法决定。
④常量在程序中不用申明,就直接使用。
(一)整型常量
在程序中可用“十进制”、“八进制”、“十六进制”三种进制表示整型常量。
1、十进制整型常量
由0到9数字组成;书写时不能以0开始;无小数部分。
2、八进制整型常量
由0到7数字组成;书写时以0开始;无小数部分。
3、十六进制整常量
由0到9和A到F组成;书写时以0x开始;无小数部分。
[说明]
(1)任何一个整常量后缀L(或l),则其数据类型为满足longint或unsignedlongint值域的第一个数据类型。
5L属于longint类型;
2,147,483,648L属于unsignedlongint类型
(2)任何一个整常量,后缀u,则表示其数据类型为满足
unsignedint或unsignedlongint值域的第一个数据类型。
(3)一个常量后可以同时后缀u和L(顺序大小写无所谓)
则表示其类型一定是unsignedlongint类型
如:
5LU
(4)当一个整型常量不存在后缀时,则该整型常量的类型为满足下列数据类型的值域的第一个类型:
10进制:
int–-longint—unsignedlongint
8进制:
int—unsignedint—longint—unsignedlongint
16进制:
int—unsignedint—longint—unsignedlongint
(二)浮点常量
1、由整数部分和小数部分组成(如2.5)
2、浮点常量只支持10进制
3、可用科学法表示
0.2E+13
.2E+13
1.4E-8
3E+9
4、浮点常量的数据类型默认为double,如上面的4个数均为double类型,但可以在后在加上f,将其类型指定为float类型。
如:
2.5f与2.5
5、浮点常量后缀l就是longdouble数据类型
2.52.5f2.5l
(三)字符常量
1、用单引号括起来的字符称为字符常量
‘a’‘\n’‘r’‘\x61’
2、字符常量的类型都是char数据类型
3、C++的转义序列
\a 表示响铃
\n新行
\t水平制表符(TAB)
\v垂直制表符
\b回退符
\r回车符
\f页馈进符
\\反科杠\
\’单引号’
\”双引号”
如果用单引号将上面的括起来,它们都是一个字符。
4、可用8进制或16进制来表示ASCII字符集中的任何字符。
形如:
\nnn8进制的字符
\xnnn16进制表示的字符(此处的x就必须是小写的)
如a字符的十六进制数是61,则a可以表示成:
’\x61’
(四)字符串
1、字符串,是由一对双引号括起来的字符序列。
“Thisisastring\n”
2、字符串是一种特殊的常量,它的数据类型不是基本型,这一点我们后面再讲。
3、在字符串中使用16进制或8进制转义序列来表示字符时,C++按最长的有效的长度提取转义序列。
如:
Cout<<”Error:
\x07Dividedbyzero\n”;
其中:
\x07是响铃的意思
\x07D是字符}的意思
所以这个语句最终在屏幕上输出:
}ivdedbyzero
不会有铃声。
4、由于双引号起特殊的作用,如果要在字符串中表示双引号,就必须使用转义序列,如:
想在屏上显示
PleaseEnter“good”
必须写成:
cout<<”PleaseEnter\”goot\”\n”;
Main()
{
Cout<<”thisisastring\n”;
Cout<<”hello,\tword!
\n”;
Cout<<”Error:
\07Dividedbyzero\n”;
Cout<<”Error:
\x007Dividedbyzero\n”;
Cout<<”Thisisoneline”;
Cout<Cout<<”Pleaseenter\”good\”\n”;
}
课时5:
简单说明
1、程序中每个变量都必须要有一个名字(合法标识符),用变量的名字来存取变量;
2、变量是用来表示数据的,程序中的数据都必须是具有某程数据类型的数据,因此也必须将变量定义成为其所表示的数据类型。
如:
用一个变量来表示一个中学的学生学号
变量名你取为:
num
类型你定为:
unsignedint
则在程序中要这样定义:
unsignedintnum;
3、简单说明变量的一般格式是:
数据类型名 变量1,变量2,…,变量n;
如:
floatv1,v2,v3;
这样说明的变量也叫做简单变量
定义了三个名字分别是v1,v2,v3,类型都是float的变量,由于v1、v2、v3、都是float类型,因此也就定义了这三个变量能参加哪些运算以及运算的性质。
[例题]
#include
main()
{
inti,max;
i=0;
max=0;
floatcurrent,square,cube;
current=1.5f;
square=current*current;
cube=square*current;
cout<
<}
(1)定义了3个浮点弄变量,2个整型变量。
(2)任何简单变量都可以直接用于输入输出操作
floatf;
cin>>f;
cout<
课时6:
枚举类型
前在的基本型以及基本型前面加上修饰词的类型,均是C++系统预定义好的数据类型,其实程序员在程序中也可以根据自己的算法,自己定义符合C++语法规则的数据类型。
比如本课要讲的“枚举类型”。
1、枚举类型是程序员根据自己的算法需要自定义的类型。
2、枚举类型的定义格式:
emun枚举标记{枚举常量表};
如:
emuncolor{RED,BLUE,GREEN,YELLOW};
(1)emun是C++系统的关键字
(2)color是你自定义的名字(符合标识符的语法),也是你建立的枚举类型的类型名。
(3){RED,BLUE,GREEN,YELLOW}是一个集合,里面是你自己定义的这种类型的数据的定义域。
比如:
colorx;
意思就是说你用你自定义的数据类型color定义了一个变量x,此变量x就只能被赋予该定义域的元素。
例如:
x=RED;//是合法的
x=ywt;//是不合法的
课时7:
基本运算符和表达式
引言:
(1)运算是对数据的处理过程;
(2)记述各种不同运算的符号称为运算符;
(3)参与运算的数据称为操作数;
(一)C++的运算符表
优先级
运算符
例子
结合性
1
()
[]
->
.
:
:
++
--
(a+b)/4;
array[4]=2;
ptr->age=34;
obj.age=34;
Class:
:
age=2;
for(i=0;i<10;i++)...
for(i=10;i>0;i--)...
lefttoright
2
!
~
++
--
-
+
*
&
(type)
sizeof
if(!
done)...
flags=~flags;
for(i=0;i<10;++i)...
for(i=10;i>0;--i)...
inti=-1;
inti=+1;
data=*ptr;
address=&obj;
inti=(int)floatNum;
intsize=sizeof(floatNum);
righttoleft
3
->*
.*
ptr->*var=24;
obj.*var=24;
lefttoright
4
*
/
%
inti=2*4;
floatf=10/3;
intrem=4%3;
lefttoright
5
+
-
inti=2+3;
inti=5-1;
lefttoright
6
<<
>>
intflags=33<<1;
intflags=33>>1;
lefttoright
7
<
<=
>
>=
if(i<42)...
if(i<=42)...
if(i>42)...
if(i>=42)...
lefttoright
8
==
!
=
if(i==42)...
if(i!
=42)...
lefttoright
9
&
flags=flags&42;
lefttoright
10
^
flags=flags^42;
lefttoright
11
|
flags=flags|42;
lefttoright
12
&&
if(conditionA&&conditionB)...
lefttoright
13
||
if(conditionA||conditionB)...
lefttoright
14
?
:
inti=(a>b)?
a:
b;
righttoleft
15
=
+=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
inta=b;
a+=3;
b-=4;
a*=5;
a/=2;
a%=3;
flags&=new_flags;
flags^=new_flags;
flags|=new_flags;
flags<<=2;
flags>>=2;
righttoleft
16
for(i=0,j=0;i<10;i++,j++)...
lefttoright
1、按运算符同操作数的关系,运算符会成:
一元运算符;二元运算符;三元运算符。
2、按运算符和操作数的运算性质,又分成算术运算、逻辑运算、关系运算、移位运算和其它运算。
3、表达式是由操作数和运算符组成的符号序列,每个表达式都产生单一的值,并且这个值肯定具有某种数据类型,这个类型就是表示式的类型。
4、常量表达式可以出现在常量能出现的地方。
5、一个变量或是一个常量也是一个表达式。
一个表达式的值可以用来参与其它运算,即可用作其它运算符的操作数,这样就可以组成复杂的表达式了。
5a5+aa+ba*(b+c)
6、表达式的求值顺序:
先计算括号内的表达式,再计算括号外的表达式,优先级高的运算符先运算,优先级低的运算符后运算。
7、如果一个运算符对其操作数从左向右进行规定的运算,则称这个运算符是右结合的。
反之为左结合。
2+3对“+”这个运算符,其操作数是左边加右边的操作数。
“+”是右结合的。
8、当一个表达式中出现各种运算符时,优先级和运算符的结合性最终决定表达式的求值顺序。
(二)算术运算符
2-一元运算符取负,取操作数的负值
3*/%二元
4+-二元
(1)“%”是取模运算符,就是求两个整数相除的余数,如7%5表达式的值是2。
要求两个操作数必须是整数。
(2)“/”:
当此运算符用于两个整数相除时,结果仍是整
数。
如7/5结果是15/7结果是0
同学们看出“%”与“/”的意思没有?
当他们用于整数运算时,一个求余数,一个求整数的商。
(3)二元算术运算符是右结合的,即从左向右进行运算。
(4)算术表达式计算中的溢出问题:
①被零除或浮点溢出会作为一个错误导致程序终止。
②整数溢出不会认为是一个错误。
在时需要利用整数的溢出进行一些较低级的程序设计。
但是,这样也就是说C++不能报告整数的溢出问题,一旦出现这种情况,很难找出错误来。
main()
{
inti,j,k;
i=1000;
j=1000;
k=i*j;//发生溢出了哈,超过了int类型的值域,不报错
cout<}
int类型的k变量最多能保存32767,而i*j的结果是1,000,000
将这个结果赋给k,就发生了整数溢出。
但C++又不报错,运算结果肯定是错误的。
可以通过将三个变量都定义成为long类型,得到正确的结果:
main()
{
longinti,j;
longintk;
i=1000L;
j=1000L;
k=i*j;
cout<}
(三)关系运算
6<<=>>=
7==!
=
1、关系运算符是右结合的,即从左向右进行运算。
运算的结果是整数,操作数满足运算符的比较关系时,运算结果为1,若不满足比较关系,运算结果为0。
2、关系运算符的优先级(6,7)低于算术运算符(2,3,4)。
如:
n+m
(四)逻辑运算符
2!
一元运算符
11&&二元
12||二元
1、右结合的运算符。
2、运算结果只有1或是0
i&&j只要i或j中有一个是0,结果为0;
两个都非零时,结果为1;两个均为0结果为0。
i||j只有i或是j中有一个非0,结果为1;两个均为0时,结果为0。
!
i当i为0时,结果为1当i非零时,结果为0
3、关系运算符的优先级高于&&和||
in
先进行两个关系运算,然后再进行逻辑运算
(五)位运算符
1、在计算机中各种数据都是用二进制的位表示出来的。
如int型的数据用16位二进制表示,char型数据用8个二进制位表示,如小写字母a:
0110001
2、前面学习过的运算符都是对数的所有位进行操作的,在C++低级程序设计中,常常需要检查或设置变量中的某几位的值。
C++提供了六个位运算符,用于处理组成整型变量的位。
&|^<<>>~
(1)位取反运算
是一元运算符,对所作用的数逐位取反(0变1,1变0)
main()
{
unsignedchara;
a=~0x9a
cout<}
10011010
01100101
0x65
(2)位与&、位或|、位异或^
二元运算符,针对两个整数的对应位就进运算。
①位与:
对应位只要有一个为0结果为0,只有两个均为1,结果为1。
②位或:
对应位只要有一个为1结果为1,只有两个均为0,结果为0。
③位异或:
对应位相异为1,相同为0。
10111001
&10000011
10000001
10111001
|10000011
10111011
10111001
^10000011
00111010
(3)位左移与右移
移位运算符左边操作数的二进制位,移动的次数由右边的操作数确定。
①“<<”左移左边操作数中的二进制位,移位的过程中,右端出现的空位补0,而移出左端之外的位自动舍弃。
如:
10011011左移两位,就是去掉前两位10后在尾上补00,得到:
01001100
②“>>”右移左边操作数中的二进制位,其最终的结果与操作数的数据类型是否为有符号类型有关。
*对于无符号的操作数,左端移出的空位补0;
*对于有符号数,最高位称为符号位(左第一位),在右移时,移出的空位按符号位复制,也就是说,符号位为1时,移出的空位补1,符号位为0时,移出的空位补0。
#include"stdafx.h"
#include"stdlib.h"
#include"iostream"
usingnamespaceSystem;
usingnamespacestd;
intmain(array:
String^>^args)
{
signedchara;
unsignedcharb;
a=0x9b;
b=0x9b;
unsignedcharc;
cout<c=b<<2;
cout<<"Afte