C语言基本语法成分.docx
《C语言基本语法成分.docx》由会员分享,可在线阅读,更多相关《C语言基本语法成分.docx(30页珍藏版)》请在冰豆网上搜索。
C语言基本语法成分
1、3C语言基本语法成分
1、C语言字符集:
字符是C语言的最基本的元素,C语言字符集由字母、数字、空白、标点和特殊字符组成(在字符串常量和注释中还可以使用汉字等其它图形符号)。
由字符集中的字符可以构成C语言进一步的语法成分(如,标识符,关键词,运算符等)。
(1)字母:
A-Z,a-z
(2)数字:
0-9
(3)空白符:
空格,制表符(跳格),换行符(空行)的总称。
空白符除了在字符,字符串中有意义外,编译系统忽略其它位置的空白。
空白符在程序中只是起到间隔作用。
在程序的恰当位置使用空白将使程序更加清晰,增强程序的可读性。
(4)标点符号、特殊字符:
!
#
%
^
&
+
-
*
/
=
~
<
>
\
|
.
;
:
?
‘
“
(
)
[
]
{
}
2、标识符(名字):
用来标识变量名、符号常量名、函数名、数组名、类型名等实体(程序对象)的有效字符序列。
标识符由用户自定义(取名字)。
C语言标识符定义规则:
1)标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。
例如:
合法的标识符:
sum,average,_total,Class,day,stu_name,p4050
不合法的标识符:
M.D.John,$123,#33,3D64,a>b
2)大小写敏感。
C程序员习惯:
变量名小写,常量名大写,但不绝对,如windows编程,应当使用匈牙利表示法(大小写混用,每个单词词首第一个大写,其余小写,如WinMain)。
例如:
sum不同Sum。
BOOK不同book。
3)ANSIC没有限制标识符长度,但各个编译系统都有自己的规定和限制(TC32个字符,MSC8个字符)。
例如:
student_name,student_number如果取8个,这两个标识符是相同的。
4)标识符不能与“关键词”同名,也不与系统预先定义的“标准标识符”同名。
5)建议:
标识符命名应当有一定的意义,做到见名知义。
3、关键词(保留字):
C语言规定的具有特定意义的字符串。
参阅P234附录V。
4、运算符:
运算符将常量、变量、函数连接起来组成表达式,表示各种运算。
运算符可以由一个或多个字符组成。
参阅P233附录IV。
运算符根据参与运算的操作数的个数分为:
单目、双目、三目运算符。
5、分隔符:
逗号,空格。
起分隔、间隔作用。
6、注释符:
“/*”和“*/”构成一组注释符。
编译系统将/*...*/之间的所有内容看作为注释,编译时编译系统忽略注释。
●注释在程序中作用:
提示、解释作用。
注释与软件的文档同等重要,要养成使用注释的良好习惯,这对软件的维护相当重要。
记住:
程序是要给别人看的,自己也许还会看自己几年前编制的程序(相当别人看你的程序),清晰的注释有助于他人理解您的程序、算法的思路。
●在软件开发过程中,还可以将注释用于程序的调试-暂时屏蔽一些语句。
例如,在调式程序时暂时不需要运行某段语句,而你又不希望立即从程序中删除它们,可以使用注释符将这段程序框起来,暂时屏蔽这段程序,以后可以方便地恢复。
1、4C程序结构
1、4、1简单的C程序介绍
例1.1:
main()
{
printf(“ThisisaCprogram.\n”);
}
说明:
本程序的功能是输出一行信息:
ThisisaCprogram.
其中:
1、main表示“主函数”。
每个C语言程序都必须有一个main函数,它是每一个C语言程序的执行起始点(入口点)。
main()表示“主函数”main的函数头。
2、用{}括起来的是“主函数”main的函数体。
main函数中的所有操作(或:
语句)都在这一对{}之间。
也就是说main函数的所有操作都在main函数体中。
3、“主函数”main中只有一条语句,它是C语言的库函数,功能是用于程序的输出(显示在屏幕上),本例用于将一个字符串“ThisisaCprogram.\n”的内容输出。
即在屏幕上显示:
ThisisaCprogram.
_(回车/换行)
4、注意:
每条语句用“;”号结束语句。
例1.2:
main()/*计算两数之和*/
{
inta,b,sum;/*这是定义变量*/
a=123;b=456;/*以下3行为C语句*/
sum=a+b;
printf(“sum=%d\n”,sum);
}
说明:
本程序计算两数之和,并输出结果。
1、同样此程序也必须包含一个main函数作为程序执行的起点。
{}之间为main函数的函数体,main函数所有操作均在main函数体中。
2、/**/括起来的部分是一段注释,注释只是为了改善程序的可读性,在编译、运行时不起作用(事实上编译时会跳过注释,目标代码中不会包含注释)。
注释可以放在程序任何位置,并允许占用多行,只是需要注意“/*”、“*/”匹配,一般不要嵌套注释。
3、inta,b,sum;是变量声明。
声明了三个具有整数类型的变量a,b,sum。
C语言的变量必须先声明再使用。
4、a=123;b=456;是两条赋值语句。
将整数123赋给整型变量a,将整数456赋给整型变量b。
a,b两个变量分别为123,456。
注意这是两条赋值语句,每条语句均用“;”结束。
也可以将两条语句写成两行,即:
a=123;
b=456;
由此可见C语言程序的书写可以相当随意,但是为了保证容易阅读要遵循一定的规范。
5、sum=a+b;是将a,b两变量内容相加,然后将结果赋值给整型变量sum。
此时sum的内容为579。
6、printf(“sum=%d\n”,sum);是调用库函数输出sum的结果。
%d为格式控制表示sum的值以十进制整数形式输出。
程序运行后,输出(显示):
sum=579
1、4、2C程序结构
综合上述三个例子,我们对C语言程序的基本组成和形式(程序结构)有了一个初步了解:
1、C程序由函数构成(C是函数式的语言,函数是C程序的基本单位)(以例1.3说明)
●一个C源程序至少包含一个main函数,也可以包含一个main函数和若干个其它函数。
函数是C程序的基本单位。
●被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编写设计的函数。
C是函数式的语言,程序的全部工作都是由各个函数完成。
编写C程序就是编写一个个函数。
●C函数库非常丰富,ANSIC提供100多个库函数,TurboC提供300多个库函数。
2、main函数(主函数)是每个程序执行的起始点(以例1.3说明)
一个C程序总是从main函数开始执行,而不论main函数在程序中的位置。
可以将main函数放在整个程序的最前面,也可以放在整个程序的最后,或者放在其它函数之间。
3、一个函数由函数首部和函数体两部分组成(以例1.3的max函数说明)
(1)函数首部:
一个函数的第一行。
返回值类型函数名([函数参数类型1函数参数名1][,…,函数参数类型2,函数参数名2])
注意:
函数可以没有参数,但是后面的一对()不能省略,这是格式的规定。
(2)函数体:
函数首部下用一对{}括起来的部分。
如果函数体内有多个{},最外层是函数体的范围。
函数体一般包括声明部分、执行部分两部分。
{
[声明部分]:
在这部分定义本函数所使用的变量。
[执行部分]:
由若干条语句组成命令序列(可以在其中调用其它函数)。
}
4、C程序书写格式自由
●一行可以写几个语句,一个语句也可以写在多行上。
●C程序没有行号,也没有FORTRAN,COBOL那样严格规定书写格式(语句必须从某一列开始)。
●每条语句的最后必须有一个分号“;”表示语句的结束。
5、可以使用/**/对C程序中的任何部分作注释
注释可以提高程序可读性,使用注释是编程人员的良好习惯。
实践中,
●编写好的程序往往需要修改、完善,事实上没有一个应用系统是不需要修改、完善的。
很多人会发现自己编写的程序在经历了一些时间以后,由于缺乏必要的文档、必要的注释,最后连自己都很难再读懂。
需要花费大量时间重新思考、理解原来的程序。
这浪费了大量的时间。
如果一开始编程就对程序进行注释,刚开始麻烦一些,但日后可以节省大量的时间。
●一个实际的系统往往是多人合作开发,程序文档、注释是其中重要的交流工具。
6、C语言本身不提供输入/输出语句,输入/输出的操作是通过调用库函数(scanf,printf)完成。
输入/输出操作涉及具体计算机硬件,把输入/输出操作放在函数中处理,可以简化C语言和C的编译系统,便于C语言在各种计算机上实现。
不同的计算机系统需要对函数库中的函数做不同的处理,以便实现同样或类似的功能。
不同的计算机系统除了提供函数库中的标准函数外,还按照硬件的情况提供一些专门的函数。
因此不同计算机系统提供的函数数量、功能会有一定差异。
1、源程序、目标程序、可执行程序的概念(补充)
●程序:
为了使计算机能按照人们的意志工作,就要根据问题的要求,编写相应的程序。
程序是一组计算机可以识别和执行的指令,每一条指令使计算机执行特定的操作。
●源程序:
程序可以用高级语言或汇编语言编写,用高级语言或汇编语言编写的程序称为源程序。
C程序源程序的扩展名为“.c”
事实上我们编写的程序,不管采用什么计算机语言,都是源程序,有几个人还会用机器语言去编程!
源程序不能直接在计算机上执行,需要用“编译程序”将源程序翻译为二进制形式的代码。
●目标程序:
源程序经过“编译程序”翻译所得到的二进制代码称为目标程序。
目标程序的扩展名为“.obj”
目标代码尽管已经是机器指令,但是还不能运行,因为目标程序还没有解决函数调用问题,需要将各个目标程序与库函数连接,才能形成完整的可执行的程序。
●可执行程序:
目标程序与库函数连接,形成的完整的可在操作系统下独立执行的程序称为可执行程序。
可执行程序的扩展名为“.exe”(在dos/windows环境下)
第二章基本数据类型
2、1C的数据类型
程序、算法处理的对象是数据。
数据以某种特定的形式存在(如整数、实数、字符),而且不同的数据还存在某些联系(如由若干整数构成的数组)。
数据结构就是指数据的组织形式(逻辑结构、物理结构)。
处理同样的问题如果数据结构不同,算法也不同,应当综合考虑算法和数据结构、选择最佳的数据结构和算法。
C语言的数据结构是以数据类型的形式体现。
也就是说C语言中数据是有类型的,数据的类型简称数据类型。
例如,整型数据、实型数据、整型数组类型、字符数组类型(字符串)分别代表我们常说的整数、实数、数列、字符串。
C语言的数据类型:
注意:
1、不同的数据类型有不同的取值范围。
如有符号整数取值范围-32768~32767,浮点数-3.4e-38~3.4e38。
2、不同的数据类型有不同的操作。
如整型数可以取余操作,实型数据却不行;整型、实型数据可以有加法,字符数组不行。
3、不同的数据类型即使有相同的操作有时含义也不同,如指针数据自增1与整数自增1含义是不同的。
4、不同的数据类型对计算机可能出现的错误不同。
如整型数的溢出错误,浮点数的精度的丢失(有效数字位数不够)。
5、C语言的数据类型可以构造复杂的数据结构。
如使用结构体数组可以构造线性表。
使用指针类型、结构体类型可以构造线性链表(栈、队列)、树、图。
(在《数据结构》课程介绍)
6、C语言中的数据有变量与常量,它们分别属于上述这些类型。
2、2常量与变量
2、2、1常量:
在程序的运行过程中,其值不能改变的量称为常量。
注意:
1、常量有不同的类型,如12、0、-3为整型常量,4.6、-1.23为实型常量,’a’、’d’字符常量。
常量可以从字面形式即可判断-字面常量或直接常量。
2、符号常量
#definePI3.1416
使用符号常量的好处:
(1)含义清楚、见名知意。
(2)修改方便、一改全改。
例2-1:
符号常量应用
#definePI3.14
main()
{
floatarea;
area=10*10*PI;
printf("area=%f\n",area);
}
结果:
area=314.000000
2、2、2变量:
在程序的运行过程中,其值可以改变的量称为变量。
注意:
1、变量名(用标识符表示)、变量在内存中占据的存储单元、变量值三者关系。
变量名在程序运行过程中不会改变,变量的值可以改变。
变量名遵守标识符准则。
2、C语言中变量:
“先定义,后使用”。
即就是说,C要求对所有用到的变量做强制定义。
1)只有申明过的变量才可以在程序中使用,这使得变量名的拼写错误容易发现。
BASIC却不是这样。
有时你会用了两个相近似变量而你根本没有发现,却当作同一个变量在使用。
2)申明的变量属于确定的类型,编译系统可方便地检查变量所进行运算的合法性。
3)在编译时根据变量类型可以为变量确定存储空间,“先定义后使用”使程序效率高。
2、3整型数据
2、3、1整型常数的表示方法
三种形式:
(+/-)
1)十进制。
例如123,-456,0。
2)八进制。
以0开头,后面跟几位的数字(0-7)。
例如:
0123=(123)8=(83)10;-011=(-11)8=(-9)10。
3)十六进制。
以0x开头,后面跟几位的数字(0-9,A-F)。
例如:
0x123=291,-0x12=-18。
4)整型常量的类型(整型常数的后缀)-在整型变量部分介绍,这里只要知道怎么表示。
整型常量后可以用:
u或U明确说明为无符号整型数
l或L明确说明为长整型数.
2、3、2整型变量
1、整型数据在内存中的存放形式
数据在内存中以二进制形式存放,事实上以补码形式存放。
例如:
定义一个整型变量i=10,
补充知识(参考《微机原理》等课程):
1)带符号数的表示,原码、反码、补码。
2)原码-补码相互转化。
正数的补码与其原码相同,负数的补码是其对应的原码数值位按位取反+1。
例题:
10,-10的计算机机内表示。
思路:
先将数值表示为二进制形式(十进制=>二进制,除2取余),即获得数值的原码。
将原码转化为补码,就是机内表示。
10=(1010)2=(0000,0000,0000,1010)原=(0000,0000,0000,1010)补。
-10=(-1010)2=(1000,0000,0000,1010)原=(1111,1111,1111,0110)补。
从10,-10的计算机机内表示可以看出正数、负数机内表示(补码表示)看上去明显不同。
2、整型变量的分类
整型变量的基本类型为int。
通过加上修饰符,可定义更多的整数数据类型。
1)根据表达范围可以分为:
基本整型(int)、短整型(shortint)、长整型(longint)。
用long型可以获得大范围的整数,但同时会降低运算速度。
2)根据是否有符号可以分为:
有符号(signed,默认),无符号(unsigned)-目的:
扩大表示范围,有些情况只需要用正整数。
有符号整型数的存储单元的最高位是符号位(0:
正、1:
负),其余为数值位。
无符号整型数的存储单元的全部二进制位用于存放数值本身而不包含符号。
归纳起来可以用6种整型变量:
●有符号基本整型:
[signed]int
●有符号短整型:
[signed]short[int]
●有符号长整型:
[signed]long[int]
●无符号基本整型:
unsigned[int]
●无符号短整型:
unsignedshort[int]
●无符号长整型:
unsignedlong[int]
例子:
保存整数13的各种整型数据类型。
n()
{
floata;
doubleb;
a=33333.33333;
b=33333.3333333333;
printf("a=%f,b=%f\n",a,b);
}
2、4、3实型常量的类型
1、许多C编译系统将实型常量作为双精度实数来处理,这样可以保证较高的精度,缺点是运算速度降低。
在实数的后面加字符f或F,如1.65f、654.87F,使编译系统按单精度处理实数。
2、实型常量可以赋值给一个float、double、longdouble型变量。
根据变量的类型截取实型常量中相应的有效数字。
2、6变量赋初值
程序中常常需要对一些变量预先设置初值,C语言允许在定义变量的同时使变量初始化。
例如:
inta=3;/*指定a为整型变量,初值为3*/
floatf=3.56;/*指定f为实型变量,初值为3.56*/
charc=’a’;/*指定c为字符型变量,初值为’a’*/
可以只对定义的一部分变量赋初值。
inta,b=2,c=5;/*指定a,b,c为整型变量,只对b、c初始化,b的初值为2,c的初值为5*/
初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的,相当于有一个赋值语句。
inta=3;
相当于:
inta;
a=3;
2、7各类数值型数据(整型、实型、字符型)的混合运算
整型(包括int,short,long)和实型(包括float,double)数据可以混合运算,另外字符型数据和整型数据可以通用,因此,整型、实型、字符型数据之间可以混合运算。
例如:
表达式10+’a’+1.5-8765.1234*’b’是合法的。
在进行运算时,不同类型的数据先转换成同一类型,然后进行计算,转换的方法有两种:
自动转换(隐式转换);强制转换。
1、自动动转换(隐式转换)
自动转换发生在不同类型数据进行混合运算时,由编译系统自动完成。
转换规则:
(参看图2-1)
(1)类型不同,先转换为同一类型,然后进行运算。
(2)图中纵向的箭头表示当运算对象为不同类型时转换的方向。
可以看到箭头由低级别数据类型指向高级别数据类型,即数据总是由低级别向高级别转换。
即按数据长度增加的方向进行,保证精度不降低。
(3)图中横向向左的箭头表示必定的转换(不必考虑其它运算对象)。
如字符数据参与运算必定转化为整数,float型数据在运算时一律先转换为双精度型,以提高运算精度(即使是两个float型数据相加,也先都转换为double型,然后再相加)。
(4)赋值运算,如果赋值号“=”两边的数据类型不同,赋值号右边的类型转换为左边的类型。
这种转换是截断型的转换,不会四舍五入。
(教材P19倒数18行“四舍五入”有异议?
)
例子:
教材P19。
算式。
(自学)
2、强制转换
强制转换是通过类型转换运算来实现。
一般形式:
(类型说明符)表达式
功能:
把表达式的结果强制转换为类型说明符所表示的类型。
例如:
(int)a将a的结果强制转换为整型量。
(int)(x+y)将x+y的结果强制转换为整型量。
(float)a+b将a的内容强制转换为浮点数,再与b相加。
说明:
(1)类型说明和表达式都需要加括号(单个变量可以不加括号)
(2)无论隐式转换,强制转换都是临时转换,不改变数据本身的类型和值。
例2-9:
强制类型转换(P.20)
main()
{
floatf=5.75;
printf("(int)f=%d\n",(int)f);/*将f的结果强制转换为整型,输出*/
printf("f=%f\n",f);/*输出f的值*/
}
结果:
(int)f=5
f=5.750000
第三章运算符与表达式
3、1C运算符简介
运算符:
狭义的运算符是表示各种运算的符号。
表达式:
使用运算符将常量、变量、函数连接起来,构成表达式。
C语言运算符丰富,范围很宽,把除了控制语句和输入/输出以外的几乎所有的基本操作都作为运算符处理,所以C语言运算符可以看作是操作符。
C语言丰富的运算符构成C语言丰富的表达式(是运算符就可以构成表达式)。
运算符丰富、表达式丰富、灵活。
在C语言中除了提供一般高级语言的算术、关系、逻辑运算符外,还提供赋值符运算符,位操作运算符、自增自减运算符等等。
甚至数组下标,函数调用都作为运算符。
C的运算符有以下几类:
本章主要介绍算术运算符(包括自增自减运算符)、赋值运算符、逗号运算符,其它运算符在以后相关章节中结合有关内容陆续进行介绍。
3、2算术运算符和算术表达式
1、算术运算符
+(加法运算符。
如3+5)
-(减法运算符或负值运算符。
如5-2,-3)
*(乘法运算符。
如3*5)
/(除法运算符。
如5/3,5.0/3)
%(模运算符或求余运算符,%要求两侧均为整型数据。
如7%4的值为3)。
除了负值运算符-单目运算符外,其它都是双目运算符。
说明:
(1)两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。
但是如果除数或被除数中有一个为负值,则舍入的方向是不固定的,多数机器采用“向0取整”的方法(实际上就是舍去小数部分,注意:
不是四舍五入)。
(2)如果参加+,-,*,/运算的两个数有一个为实数,则结果为double型,因为所有实数都按double型进行计算。
(3)求余运算符%,要求两个操作数均为整型,结果为两数相除所得的余数。
求余也称为求模。
一般情况,余数的符号与被除数符号相同。
例如:
-8%5=-3;8%-5=3
2、算术表达式
算术表达式:
用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。
运算对象可以是常量、变量、函数等。
例如,下面是一个合法的C算术表达式。
a*b/c-1.5+’a’。
注意:
C语言算术表达式的书写形式与数学表达式的书写形式有一定的区别:
(1)C语言算术表达式的乘号(*)不能省略。
例如:
数学式b2-4ac,相应的C表达式应该写成:
b*b-4*a*c。
(2)C语言表达式中只能出现字符集允许的字符。
例如,数学πr2相应的C表达式应该写成:
PI*r*r。
(其中PI是已经定义的符号常量)
(3)C语言算术表达式不允许有分子分母的形式。
例如,(a+b)/(c+d)。
(4)C语言算术表达式只使用圆括号改变运算的优先顺序(不要指望用{}[])。
可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。
3、(算术)运算符的优先级与结合性(P.233附录IV)
C语言规定了进行表达式求值过程中,各运算符的“优先级”和“结合性”。
(1)C语言规定了运算符的“优先级”和“结合性”。
在表达式求值时,先按运算符的“优先级别”高低次序执行。
如表达式:
a-b*c等价于a-(b*c),“*”运算符优先级高于“-”运算符。
(2)如果在一个运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。
例如:
a-b+c,到底是(a-b)+c还是a-(b+c)?
(b先与a参与运算还是先于c参与运算?
)
查附录IV可知:
+/-运算优先级别相同,结合性为“自左向右”,即就是说b先与左边的a结合。
所以a-b+c等价于(a-b)+c。
左结合性(自左向右结合方向):
运算对象先与左面的运算符结合。
右结合性(自右向左结合方向):
运算对象先与右面的运算符结合。
(3)在书写多个运算符的表达式时,应当注意各个运算符的优先级,确保表达式中的运算符能以正确的顺序参与运算。
对于复杂表达式为了清晰起见可以加圆括号“()”强制规定计算顺序。
3、3赋值运算符和赋值表达式
1、赋值运算符、赋值表达式
赋