C语言入门:认识程序的基本结构
01
C语言程序的结构认识
举一个简易的c程序示例,来阐述c语言的基础部分构成,以及其格式,还有良好的书写风格,以此让小伙伴们对c语言拥有初步的认知。
例1:计算两个整数之和的c程序:
#include main()
int a,b,sum;
a=20; /*定义变量a,b,sum为整型变量*/
b=15; /*把整数20赋值给整型变量a*/
sum=a+b; /*把整数15赋值给整型变量b*/
这个句子不完整且存在格式问题。请提供完整句子,确保格式正确,以便我按照要求进行改写。还可以另外提供其他正确示例供改写练习。
重点说明
2、main(),在c语言里有着“主函数”这样的称呼,一个c程序存在且绝对只有一个main函数,任何一个c程序无一例外都是从main函数开始启动执行,main函数紧跟的那一对且不能省略的圆括号。
3、称为main函数函数体的,是被大括号{ }括起来的内容,这部分内容是计算机要执行的内容。
4、每个在{ }里面的句子后面,都跟着一个分号();在c语言里,以单个分号作为结尾的句子,被称作一个c语言的语句;分号是语句结束的标识。
5、借助执行这条,由c语言系统提供给我们,能直接使用的屏幕输出函数,用户便可看到运行结果,本程序运行完毕后,会在显示器上呈现如下结果:a等于20,b等于15,sum等于35。
6、包含头文件时使用#include,要这样留意,它能以#号作为开头,且不以分号结尾。那这一行是没有分号的,所以它并非语句。在c语言这个范畴里,它被称作命令行,或者也被叫做“预编译处理命令”。
7、程序里,那从 /* 启始且以 */ 告终的部分,意味着是程序的注释部分,注释能够加在程序的任一位置,是为提升程序的可读性才添加的,然而计算机在执行主函数内容之际,会全然无视注释部分,换句话说,就是计算机把注释部分当作在主函数里不存在。
02
C程序的生成过程
源文件经编译会先生成目标文件,之后目标文件经过连接才生成可执行文件,这是C程序的过程。
对于源程序而言,其扩展名是.c。目标程序呢,它的扩展名是.obj。可执行程序的扩展名则是.exe。
03
标识符
进行程序编写期间,针对函数、变量之类的,是一定要赋予其名称的,而这个所赋予的名称就被称作标识符。在C语言里,标识符的命名有着这样的规则:
标识符不可以跟程序里有着特殊意义的关键字一样,不可以和用户所编制的函数名、C语言库函数相同,在程序当中各式各样的标识符最好别重复,以此来进行区分。挑选变量名以及其他标识符的时候,应该留意做到“见名知义”。
标识符分为如下三类
1、关键字
在C语言里能专门用来对特定成分进行说明的一类标识符,是有着特定含义的,被称作关键字,它是不可以用作用户标识符的。
2、预定义标识符
预定义标识符于c语言里同样存有特定的含义,然而能够被用作用户标识符,预定义标识符划分成两类:
1),像printf这样的,scanf这样的,sin这样的,还有isdigit这样的,这些都是库函数名字。
2)、编译处理命令名,比如define,include
3、用户标识符
被用户依据所需自行定义的标识符,被称作是用户标识符了呀。不管以怎样的方式出自用户自身进行定义的标识符,它都是必定要去符合标识符的那三条命名规则的哟。
04
常量
在程序运行这个过程当中,存在着其数值不能被加以改变的量,这样的量被称作常量。常量具备5种类型,分别是整型常量,实型常量,字符常量,字符串常量以及符号常量。
4.1 数值转换
数值的四种表现形式:
在计算机里面,数字都是以二进制的形式去表示以及存放的,用户所输入的寻常十进制数字,都得被计算机转变成二进制之后,才能够在计算机内部进行存储,同样的,计算机的运算结果也是二进制,一般情况下,要把它转变成十进制数,然后再输出给用户去阅读,这种转换通常是由计算机自行实现的。
1)将十进制转换二进制、八进制和十六进制
除法,把十进制的数除以二,把余数记录下来,让得到的商持续除以二,一直到商变成零,随后把每次相除所获得的余数从后往前反过来排列,最终所得出的余数数字序列就是该十进制数契合的二进制数。八进制以及十六进制的转换方法跟上面所说的一样。
数值为十进制的13,将其转换成为二进制数的时候,所得到的值是1101,把它转换为八进制,结果是015,而转换成十六进制的话,得到的是D。
2)将二进制、八进制和十六进制转换成十进制
数之乘积进行求和操作:把二进制之中的每一个数位,自低位朝着高位的方向进行(右边界定为低位,左边界定为高位),分别去乘上20,再乘上21,接着乘上22等等,之后把这些所得到的值予以求和。
3)二进制与八进制、十六进制数之间的相互转换
4.2 数形常量
整型常量存在着三种形式,一种是十进制整型常量,一种是八进制整型常量,还有一种是十六进制整型常量。
注意,在c语言里边,并不存在直接用来表示二进制的整型常量,于c语言源程序当中,是不会出现二进制的。
书写方式如下:
十进制整型常量有123 ,它是其一种表现形式 ;还有0 ,是以十进制呈现的 ;再者-24 ,属于十进制整型常量类别 ;然后85L(长整型常量) 等 八进制整型常量有051 ,这是八进制的一种常量 ;还有-026 ,属于八进制整型常量范畴 ;再者0773 等 十六进制整型常量有0x55 ,它是十六进制的常量形式 ;还有0x1101 ,属于十六进制整型常量类型 ;再者0x ,也是十六进制里的一种情况 ;然后0x5AC0 ,是十六进制整型常量 ;还有-0xFF。其中L为长整型。
4.3 实型常量
实型常量有两种表示形式:小数形式和指数形式。
以小数形式呈现的数分别是:5.4,0.074, -23.0 ;以指数形式呈现的数分别是:5.4e0,4.3e - 3, - 3.3e4。
1)小数部分为0的实型常量,可以写为453.0 或453。
2)把它用小数来进行表示的时候,小数点的两侧都必然得有数才行,绝对不可以写成“ .453“以及“453.“这样的形式,倒是而应当写成“0.453“以及“453.0“这样的样子。
3)采用指数写法之际,e之前必定得有数字,e之后的指数务必是整数,要留意,整数阶码能够是正数,能够是负数,还能够是八进制数、十六进制数,然而必须是整数。
4.4 字符常量
标识字符常量的是一对单引号‘ ’,在c语言里字符常量存在两类。
1)由一对单引号包起来的一个字符,像‘a ’那种,还有‘r’ ,以及‘#’。留意: ′a′ 跟 ′A′ 是俩不一样的字符常量。
2)被一对单引号给括起来,是以反斜杠\作为开头,紧接着是若干数字或者是字母,就像‘\n’这样,其中“\“有着转义的含义,后面跟着不一样的字符意味着不同意思,这种字符常量称作转义字符。
4.5 字符串常量
在C语言里,被双引号包围起来的,由好些个字符构成的序列,就是字符串常量。
例:“ni hao” “happy”等等。
4.6 符号常量
由宏定义“#define”所定义的常量是符号常量,在C程序里,可用标识符去代表一个常量。
例:计算圆的面积的c程序。
#include
#define PI 3. main()
float r,s;
r=12.5;
S=PI *r*r;
printf(“s= %f ”,s);
说明:
# define是用于宏定义的,在此程序里,所有出现PI的地方,都代表3. ,并且PI被称作符号常量。在习惯方面,我们运用大写字母去表示符号常量,使用小写字母来表示变量,如此这般,比较容易进行区别。
05
变量
那个其值能够发生改变的量被称作变量,变量得有个变量名,它在内存里会占据一定的存储单元,而存储单元当中存放的是该变量的值,不同类型的变量,其存储单元的大小是不一样的,变量在使用之前必须进行定义。
5.1 整型变量
整型变量被划分成4种,分别是,基本型,也就是int,短整型,即short int或者short,还有长整型,是long int或者long,以及无符号型,包括unsigned int ,unsigned short,unsigned long。
上述四种整型数据,对于不同的编译系统,其所占用的位数存在不同规定,数值范围也有不同规定。
类型说明符
说起单词signed呢,它是用来表明“有符号”这种情况的,也就是存在正负数的区分,要是不写上signed的话,同样在一定程度上隐含着被说明为有符号,而unsigned这个词呢,则是被用来阐述“无符号”意思的,就是仅仅表示正数。
5.2 实型变量
在C语言里头,实型变量被划分成了单精度类型,也就是float ,以及双精度类型,也就是double ,这两种类型。
如:float a , b ; double m ;
在vc中,float型数据于内存里占4个字节,也就是32位,double型数据占8个字节。单精度实数给出7位有效数字,双精度实数给出15至16位有效数字。实型常量不区分float型与double型,一个实型常量能够赋给一个float型变量或者double型变量,不过变量依据其类型截取实型常量里相应的有效数字。
注意,实型变量,仅能够存放实型值,不可以用整型变量去存放实型值,并且也不能够使用实型变量来存放整型值。
5.3 字符变量
字符变量用来存放字符常量,定义形式:
char 变量名;
其中,关键字char,用于定义字符型数据类型,其所占用的是一个字节的存储单元。
定义字符型变量cr1和cr2,将字符A赋值给cr1,把字符B赋予cr2。
当把一个字符赋予一个字符变量之际,并非是把该字符亲自存储到内存里,而是把该字符所对应的ASCII码存储到内存单元之中。
因为在内存里字符是以ASCII码来存放的,其存储形式跟整数的存储形式相类似,故而C语言当中字符型数据与整型数据之间能够通用,一个字符能够用字符的形式予以输出,还能用整数的形式进行输出,字符数据也能够开展算术运算,这时就相当于针对它们的ASCII码开展运算。
06
类型的自动转换和强制转换
当处于同一表达式里各数据的类型不一样的时候,编译程序会自动加以转变,把它们变为同一类型之后再开展计算。转换的优先级是这样的:char 小于 int,int 小于 float,float 小于 double,也就是左边级别“低”的那种类型朝着右边去转换。
进一步来讲,要是在表达式里优先级处于最高位置的数据属于double型,那么此表达式当中的其他数据都会被转化成double型,并且计算得出的结果同样是double型;要是在表达式里优先级处于最高位置的数据属于float型,那么此表达式当中的其他数据都会被转化成float型,并且计算得出的结果同样是float型。
于进行赋值运算之际,要是赋值号左右两边的类型不一样,那么赋值号右边的类型会朝着左边的类型转变;当右边的类型比左边的类型高的时候,就在转换之时针对右边的数据予以截取。
除了自动进行的那种转换之外,另外存在着强制进行的转换,其表示的形式是这样的:( 类型 )(表达式)。
例:(int)(a+b)
探讨:当把a的值设定成赋值为3.4,将b的值设定成赋值为2.7时,(int)(a+b)的值以及(int)a+b的值各自是多少呢?
07
C运算符认识
C语言的运算符范围很广,可分为以下几类:
此外,依据参与运算的对象数量,C语言运算符能够划分成:单目运算符(像),双目运算符(比如 +,-),以及三目运算符(例如?:)。
08
算术运算符和算术表达式
8.1 基本的算数运算符
(1)+(加法运算符或正值运算符,如2+5)。
(2)-(减法运算符或负值运算符,如4-2)。
(3)*(乘法运算符,如3*8)。
(4)/(除法运算符,如11/5)。
/的运算分为两种情况:
a、当呈现“除”这种情况的作用期间,在其左右两边都属于整数范畴的时候,最终获取到的那一结果必定是整数哟(这里要特意留意一下呢:仅仅只是取用整数所涵盖的部分,并非采取四舍五入这种方式),举例说明如下:5除以2所获得的值是2,并非2.5,1除以2所得到的数值则是0。
b、当“除”字左右两侧之中,至少存在一个属于实型数据(也就是带有小数部分的数据)的情形下,所获得的结果将会是实型数据,举例来说:5除以2.0所得到的值是2.5,7.0除以2.0所得到的值是3.5。
(5)(模运算符号,或者叫做求其余数的运算符号,其中百分之符号两侧本来都是应该能够满足的整数类型数据,就像是9模之以7所得到的值是2)。
特别要说明的是,当进行运算的对象是负数的时候,所得到的结果会因为编译器的不一样而有所不同,在vc这个环境里,结果的符号是和被除数相一致的,举例来说,13除以-2得到的值是1,而-15除以2得到的值是-1。
8.2 算术表达式和运算符的优先级与结合性
算数表达式,是凭借算数运算符以及括号,把运算量(也被称作操作数)连接而成的,符合C语言语法规则的表达式。运算对象涵盖了函数、常量以及变量等。
于计算机语言里头,算术表达式求值的规律跟数学里四则运算的规律相类似啦,其运算的规则以及要求是这样的哟。
8.3 自增自减运算符
作用:使变量的值增1或减1。
比如说,++i,--i,这是在使用i之前,先让i的值进行加1操作、减1操作。而像i++,i--,则是在使用i之后,使得i的值进行加1操作、减1操作。
(1)唯独变量能够运用自增运算符 (++) 以及自减运算符 (--),然而常量或者表达式是不可以运用的,就像 10++ 或者 (x+y)++ 这种情况都是不符合规定的。
(2)加加和减减的结合方向是“自右向左”,比如说减i加加,i的左边是负号运算符,i的右边是自增运算符,负号运算以及自增运算都是“自右向左”结合的,这就等同于负的括号里i加加。
在循环语句里头时常会用到自增或者自减运算符,于指针之中同样常常会用到这个运算符,考生务必要搞明白“i++”跟“++i”以及“i--”跟“--i”的差异,尤其要搞明白表达式的值以及变量的值。
09
赋值运算符与赋值表达式
9.1 赋值运算符与赋值表达式
赋值符号“=“属于赋值运算符,其作用在于把一个数据给予一个变量,或者把一个变量的值给予另一个变量,由赋值运算符构成的表达式称作赋值表达式,一般形式是:变量名 = 表达式。
于程序里,能够多次针对一个变量予以赋值,每进行一次赋值操作,与之对应的存储单元当中的数据便会被更新一回,在内存里当下的数据即为最后一次所赋予值的那个数据。
例:a=12; 此表达式读作“将10的值赋值给变量a”。
a、一旦赋值号两边的运算对象类型不一样,系统就会自动开展类型转换,转换有着这样的规则:把赋值号右边表达式的值的类型转变成赋值号左边变量的类型。
例:int y=3.5;在变量y中最终存储的是整数3。
b、 可以将复制表达式的值再赋值给变量,形成连续赋值。
x等于y等于25,这是一个连续赋值表达式,x等于y等于25等同于x等于括号括起来的y等于25的情况,所以表达式x等于y等于25最终得出的值是25。
9.2 复合的赋值运算符
构成复合赋值运算符的方式是,在赋值运算符之前加上其他运算符。其中,与算术运算有关的复合运算符分别是:+=,-=,*=,/=,%=。
从两个符号之间是绝对不可以存在空格去看一,作为复合类赋值方面运算符号的优先级那是跟赋值类运算符的优先级等同的。就表达式n += 1而言,它等同于n = n + 1,其作用在于先获取变量n里面的值,将那个值增加1之后再把增加1之后的值赋予变量n,而其他复合的赋值运算符所归属的运算规则均都是如此依次类推的。
如求表达a+=a-=a*a 的值,其中a的初值为12 。
步骤:
先开展“a-=a*a“这种运算,这意味着a等于a减去a乘以a,也就是12减去144,结果是-132。(2)接着开展“a+=-132“这种运算,这意味着a等于a加上-132,得出的结果是-264。
9.3 逗号运算符和逗号表达式
在c语言里头,逗号除了当作分隔符之外,还能够用作一种运算符,这种运算符称作逗号运算符、用逗号运算符把几个表达式连接到一起,像a=b+c这样,还有a=b*c等,都被叫做逗号表达式。
一般形式为:
表达式1 ,表达式2 ,表达式3 , …,表达式n
例:x=2,y=3,z=4
逗号表达式有从左至右的结合性,先是求解表达式1,接着依次求解表达式2,一直到表达式n的值,表达式n的值便是整个逗号表达式的值,上述逗号表达式的值便是z等于4时表达式z = 4的值4,要注意逗号运算符是所有运算符里级别最低的。
例:有如下程序段:
main()
int a=2,b=4,c=6,x,y;
y=(x=a+b),(b+c);
printf("y=%d,x=%d",y,x);
程序显示结果为:y=6,x=6
来探讨一下,把y=(x=a+b),(b+c);改成y=((x=a+b),b+c)之后,程序所呈现的结果会是怎样的呢?
10
关系运算符和关系表达式
10.1 C语言中的逻辑值
在C语言里,逻辑值总共存在两个,分别是真(true)以及假(flase),借助非零来表示真,利用零来表示假,所以,针对任意一个表达式而言,要是它的值是零,那就代表一个假值,要是它的值为非零,那就代表一个真值,只要其值并非零,不管是正数,还是负数,亦或是整数,又或者实数,均代表一个真值,比如-5的逻辑值是真。
10.2 逗号运算符和逗号表达式
“&&”的运算对象存在两个,所以它归属于双目运算符,“||”运算对象同样有两个,故而它也是双目运算符!的运算对象仅仅有一个,为此它是单目运算符。逻辑运算所举例子如下:
(1)若 a 且 b,那么只有当且连接的两边均为“真”的情况下,表达式 a 且 b 的值才会是真的。
值得注意的是:在数学中,关系式0
(2)情况是这样的,a||b这种情形表示, ||的两边之中只要有一个呈现为“真”的状态,那么表达式a||b的结果所具有的值就是真。
(3)a取反,用!a表示,若a是真的,那么!a就是假的,反过来,若a是假的,那!a就是真的,比如! -5的值是0。
在C语言里头,被&&或者||所构成的逻辑表达式,于某些特定情形之下会出现“短路”这一现象。
(1)具有这样一种情况,当存在状况x且状况y且状况z时,仅在x呈现为真也就是不为0的情形下,才会需要去判断y的具体数值情况;仅仅只要x以及y均呈现为真的时候,才会需要去判断z的数值情况当,只要x呈现为假,即不会去判断y以及z,整个所表达的数值为0,存在这样一个口诀叫做“一假必假”。
例:
在计算机运行过程中,由于(!5==1)这个表达式的值是0 ,所以就会跳过(++i==0)这个表达式 ,进而(!5==1)&&(++i==0)这个表达式的值是0。
(2)要是存在x||y||z这种情况,一旦x的值呈现为真也就是非零状态,那么就没必要去判别y以及z的值,此时整个表达式的值会是1,然而只有当x的值为假的时候,才会需要去判别y的值,并且只有当x和y的值同时都为假的时候,才需要去判别z的值,有个口诀是:“一真必真”。
11
位运算
11.1 位运算符
在计算机里头,数据全是以二进制数的形式来存放的,位运算所指的就是针对存储单元当中二进制位的运算,C语言给出6种位运算符。
11.2 位运算
位运算符 & |~> ∧ 按优先级从高到低排列的顺序是:
在位运算符里头,求反运算“~”的优先级是最高的,左移以及右移它们的优先级是一样的,处于第二的位置,紧接着往后的顺序是按位与“&”、按位异或“∧”还有按位或“|”,顺序就是~ > & ∧ |。
例1:左移运算符“”右边的数指定移动的位数。
例如:设 a=15, a>>2 表示把右移为十进制3)。
需要说明的是,对于有符号数而言,在进行右移操作时,符号位会随着一起移动。当该数是正数的时候,其最高位要补0。而当这个数是负数时,符号位是1。对于负数情况,最高位之所以补0或者补1,这是由编译系统的规定来决定的。
设二进制数a为00 ,要是借助异或运算a∧b 确保a的高4位进行取反操作,而低4位维持不变 那么二进制数b是。
解析:异或运算常常被用来让特定的位进行翻转,只需要让需要翻转的位跟1开展异或操作就行,这是由于原数里值是1的位和1进行异或运算会得到0 ,原数里值是0的位跟1进行异或运算结果会得到1。然而和0进行异或的位会维持原值。异或运算还能够用来交换两个值,不需要借助临时变量。
遍布全球各地,不管是在咱们中国这儿,还是世界范围内各个国家,C语言都作为高等院校里一门基础的计算机课程而存在,并且C语言于计算机领域当中也起着关键的作用 ,存在着广泛的普及推广。
