C程序设计基础知识.ppt_第1页
C程序设计基础知识.ppt_第2页
C程序设计基础知识.ppt_第3页
C程序设计基础知识.ppt_第4页
C程序设计基础知识.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

现实生活中有自然数、整数、小数等概念,不同类型数的精度是不一样的。计算机也要区分所保存数据的类型,如整数、浮点数、字符数据等,不同类型数据所占用的内存空间(即占用的字节数)是不一样的。 本章从数据基本类型开始,介绍变量定义、基本运算符及表达式语法,是C语言编程中的基础知识。,1.1变量 C语言的数据类型比较丰富,整体上可划分为基本类型、构造类型以及空类型,基本类型包括整型、浮点型(进一步区分为单精度和双精度类型)、字符型、枚举类型和指针类型,构造类型有数组、结构体和共用体。本节将重点讨论最基本的整型数和实型数(即浮点型)以及定义整型和实型变量的定义方法。,1.1.1 有关内存的基础概念 内存由能存储信息的介质组成,它们划分为众多的存储单元,每个存储单元可以存储一个字节(8个二进制位)。内存包含众多的存储单元,为了识别它们,从0开始顺序为它们编号,编号称为某个存储单元的地址,表示这一存储单元在内存中的位置。存储单元的地址反映的是位置信息,存储单元的内容是8个二进制数。,1.1.2 变量的引入 程序运行过程中,经常需要保存用户输入的数据、计算的中间结果以及最终计算结果,因此在C语言中引入了变量的概念,用来存放值可以变化的数据。顾名思义,变量对应的数据可以被读出来参与计算,也可以将计算结果写入某个变量对应的存储空间。 C语言中每个变量要具备3个要素:变量的名称、变量的数据类型、变量的值。,1标识符命名规则 标识符只能由英文的字母、数字和下划线构成,标识符不能以数字打头,第一个字符只能是字母或下划线。 C语言的关键字不能作为标识符,C语言总共有32个关键字,见表1-1。需要注意的是,不同的C编译器,支持的关键字略有不同。 C语言中的标识符区分大小写,如Sum和sum是两个不同的标识符。,在C语言中,标识符长度可以不受限制,但旧的ANSI C规定,只有前6个字符有意义,也就是说编译器只看标识符的前6个字符,新的C和C+编译器打破了这一限制,但不同的编译器还是有一个长度限制。 标识符命名要养成良好的习惯和一致的风格,尽量做到“见名知义”,尤其当程序代码增多时,不好的标识符命名将使得代码难以阅读,也很难维护。这一条不是硬性规定,但应该从一开始就要养成良好的习惯。,2变量的名字 变量的名字可以根据需要由程序员指定,要遵循标识符的规定,而且一般约定俗成字母用小写,另外还应该注意以下规则。 在同一个函数体内,不要定义同名的两个变量。在Turbo C中,所有变量的定义语句必须放在函数体的最开始处,变量定义要遵循“先定义后使用”的原则,否则会出现编译错误。 尽量避免定义与库函数中函数名同名的变量,如printf、scanf等,虽然不会出现语法错误,但容易造成混乱。,3变量的定义方法 变量定义的基本语法格式为: 变量类型 变量名列表 其中变量类型确定了变量所要存储数据的类型,如整型、实型等,变量名列表列出多个需要定义的变量名称(也可以一次只定义一个),变量名之间用逗号(一定不要使用中文逗号)分隔,末尾用分号。 【例1.1】变量的定义 int english_score; int math_score, total _score; double average_score; float _height; char _myChar; 变量定义的同时还可以为变量指定初始值,如int a=5;,4变量与存储单元的探讨 程序员在源代码中定义的变量,是程序设计语言中特有的概念,经编译器编译生成的可执行程序加载到内存中时,并没有变量的概念,变量名被编译器翻译为某个存储单元的“地址”,即它在内存中的位置。 变量是为了编程的方便而提出的概念,我们只需通过变量名即可引用变量将来所对应存储单元的值,作为编程人员,可以简单地将变量和其将来所对应的存储单元等同起来。,5变量类型与占用的存储空间 变量的类型决定了在加载可执行程序时,系统将要为它在内存中开辟多少个字节的存储空间,这一工作由编译器和操作系统联合完成。同样当需要访问变量所对应的数据时,系统将根据变量的类型从某个位置开始(变量编译后的地址),连续取若干个字节的内容并解释为该类型的数据。 不同的系统、不同的编译器中,某种数据类型占用的存储空间并不一样。表1-2以Turbo C和常见的x86为例,列出常用的整型、实型和字符型变量类型将占用的存储空间。,关于不同类型数据占用存储空间的几点说明: signed(带符号型)和unsigned只能修饰char和int型,因为double和float型必须为带符号型,不能再修饰。char和int型默认情况下就是signed类型,可以说signed关键词总是可以省略。 short只能修饰int型,在Turbo C中,short修饰符也总是可以省略的。 long可以用来修饰int和double,long int用来表示更多位数的整数(长整型,可省略为long),long double表示精度更高的双精度实数。但很多编译器并没有实现long double数据类型。,int型占用存储空间在不同编译器之间变化是最为无常的,在实际编程时,虽然可以省略诸如short之类的修饰符,但最好加上,以增加程序的可移植性。 char型变量用于存储一个西文字符。但读者要注意,char变量中存储的是对应字符的ASCII码。 某种类型的数据所能表示的数值范围是一定的,如int型变量占两个字节(16位二进制),最高位为符号位,所能表示的整数范围为-3276832767,如果将大于32767或小于-32768的整数赋值给某个int整型变量,则会发生错误,称为溢出。 例1.2展现了整型变量的溢出。,1.2常量 程序还需要一些在运行过程中保持不变的数据,如一般常数0、128、-23以及圆周率3.1415926、税率、万有引力常数等等,常量也有数据类型,常量的类型也决定了该常数占用的存储空间。 常量可区分为字面常量、符号常量和const常量,字面常量是程序代码中直接书写的数值,经编译后被嵌入在代码中,称为立即数,程序运行时直接参与运算;符号常量与字面常量类似,但有一个易于理解的符号名称;const常量与变量类似,程序加载时,需要为const常量开辟存储空间,const常量有特定的数据类型,有符号化的名称,只是在程序运行过程中,常量的值不能被修改。,1.2.1字面常量 1整型常量 默认方式为十进制,可以包含09的数字以及表示负数的“-”号,不能以0开头。如0、128、-23等。 八进制整型常量,在正常数值前加上0作为前缀,数字由07构成,如012(相当于十进制的10)、-048(相当于十进制的-40)。 十六进制整型常量,在正常数值前加上0x或0X作为前缀,数字由09、AF、af构成,如0x12(表示十进制的18)、-0X7B(表示十进制的-123)。,整型常量默认的类型为int型,如果要表示长整型整数常量,可以在正常数字后加一大写或小写的L作后缀,如129L、139l、0x7AL等。 默认情况下,整型常量为带符号常量,如果要表示无符号整型常量,可以在数据后面加上大写或小写的U作为后缀。如123u、3456UL等。,2实型常量 小数方式,与正常书写的小数类似,如3.1415、-2.、.345、0.0等。 指数方式,由小数部分、代表指数的e或E、指数三部分构成,指数为带符号整数,E或e之前必须有数字。合法的科学表示小数有1.23456E4、12.3456e3,它们均表示十进制的12345.6。而1.2e2.3、.e2、E4均不是合法的常量。 默认情况下,实型常量为双精度类型,在实型常量之后加上F或f作为后缀表示数据类型为单精度类型,在实型常量之后加上L或l作为后缀表示数据类型为长双精度类型,但这一类型在很多编译器中并未实现。,3字符常量 C语言中的字符常量是由一对单引号括起来的一个字符,如a,A,#等。字符常量两侧的单引号是必须的,注意5和5两个不同的对象,5表示字符5,而5表示整数的数字5,请读者不要混淆。 大多数字符常量都可以通过加单引号的方式表示,但有些特殊字符,如单引号本身和有些不可见的特殊字符,就无法通过这种方式表示。为了解决这一问题,C语言引入“转义字符”,用“”加若干字符的形式来表示有些特殊的字符,常见的转义字符如表2-3所示。,4字符串常量 字符串常量是由一对双引号括起来的多个字符,如”hello”、”a”。同学们一定要区分字符串和字符的概念,在C语言中字符串常量除了包含双引号中的所有字符,末尾还隐含一个特殊字符0,如”a”实际包含a和0两个字符,其中0用来标识一个字符串的结束,输出时没有任何显示。请同学们思考以下,0、0、”0”的区别。,1.2.2 符号常量 字面常量可以在程序中直接书写,没有名称,如果要再次使用该常量必须重新书写一遍。对于经常引用的数值常量,可以将它们“定义”为符号常量,它们有名称(命名规则同样遵循标识符的命名规则,但一般约定俗成字母全用大写,以有别于变量),可以在程序中引用。在多处重复使用某些常量数值的场合下,符号常量提高了程序的可维护性和可读性,比如该常量需要修改时,只需修改常量的定义,多处引用的地方不用修改。 “定义”符号常量使用编译预处理指令#define,如: # define PI 3.1415926。将提前在编译预处理时把PI后的内容替换掉程序中对应的PI符号。 【例1.3】 计算圆的面积,1.2.3 const常量 新的C语言规范中,允许在定义变量之前加上const修饰符,将定义一个具有特定数据类型、具有符号化名称的常量。将来加载运行程序时,系统在内存中为const常量分配存储空间。const常量的定义如下所示。 const float PI=3.1415926; const常量通过C语句来定义,只能在定义的时候赋初值,在程序运行过程中,不能修改该常量的值。,1.3 算术运算符与算术表达式 1.3.1 运算符概述 C语言中的运算符非常多,总体可以分为以下几类: 算术运算符:有加+、减-、乘*、除/、取余%、自增+、自减-。 关系运算符:大于、小于=、小于等于。,赋值运算符:简单赋值=、复合算术赋值+=、-=、*=、/=、%=、复合位运算赋值&=、|=、=、=、=。 条件运算符:? :。 逗号运算符:,。 指针运算符:取指针所指内容*、取地址&。 求字节数运算符:sizeof。 特殊运算符:括号()、下标、成员、.。,1.3.2算术运算符 1加法运算符:+ 加法运算符为双目运算符,也就是说要有两个运算对象参加运算。参加加法运算的对象可以是常数、常量、变量或其它运算的结果。 2减法运算符:- 减法运算符也是双目运算符,如8-3、a-3.4等。-也可以作为负号,此时是单目运算符。,3乘法运算符:* 乘法运算符也是双目运算符,如a*b,3.5*GetMax(1.5,-2)等。 4除法运算符:/ 除法运算符也是双目运算符,但和数学中的有区别,当参与运算的两个数据都是整型数据时,会产生整除,如30/7的结果为4。参与运算的数据只要有一个为实型数,则计算结果为双精度数,即保留若干位小数,如30/7.0和30.0/7的计算结果都是4.285714。,5取余运算符:% 取余运算符也是双目运算符,但参加计算的数据必须是整数,运算结果为整除后的余数。当被除数与除数的符号不同时,余数如何计算不同的编译器有不同的实现,多数编译器取余数的符号与被除数相同。如: 10%7=3,10%-7=3,-10%7=-3,-10/-7=-3,1.3.3算术表达式 用运算符(可以是多个运算符)将运算对象连接起来的运算式称为表达式,反映的是一个计算过程,每个表达式都有一个计算结果。 表达式处理时,必须要考虑运算符的优先级和结合性。优先级指一个运算对象的前后都有运算符时,应该优先运算哪个。结合性指一个运算对象的前后两个运算符优先级相等时,应该遵循的运算顺序。多数运算符的结合性为左结合,也就是从左向右计算,算术运算符都是左结合。可以通过括号()改变它们的优先级关系 已知三角形的三个边长为a、b、c,则计算三角形面积的公式为: 其中,s=(a+b+c)/2 运算符的简单示例 【运算符优先级和结合性】,1.4 赋值运算符与赋值表达式 赋值运算符将一个数据或运算结果赋给一个变量。由赋值运算符及操作数组成的表达式称为赋值表达式。 1.4.1 简单赋值运算符 简单赋值运算符=,其基本应用形式为: 变量名 = 表达式 =左侧必须为某个变量,而不能是表达式,因为=的目的是将数据写入存储单元。=的右侧可以是一个表达式,也可以是某个变量或常量。 赋值运算符的优先级低于算术运算符,因此会先计算=右侧的表达式,再将计算结果存入=左侧的变量中。赋值运算符结合性为右结合性,所以C语言中支持诸如a=b=c=5的多重赋值形式。,1.4.2复合算术赋值运算符 复合算术赋值运算符是算术运算符与赋值运算符的组合,共有5个,分别为+=、-=、*=、/=、%=,基本使用格式为: 变量 算术运算符= 表达式 它等价于: 变量 = 变量 算术运算符 (表达式) 例如,表达式a*=3+5,由于+的优先级比*=高,所以先计算3+5,得到结果8,再计算a*8,最后将计算结果存入a所对应的单元中,相当于计算a=a*(3+5),而不是计算a=a*3+5。,非逗号表达式,1.4.3赋值运算时的数据类型转换 原则上,赋值运算符右侧表达式的类型和左侧变量的类型应该一致。当两侧的数据类型不一致时,需要进行数据类型转换。 1表达式的数据类型 在进行表达式计算时,相同类型的操作数运算结果类型与操作数类型相同。如果表达式中存在类型不同的运算数,要进行适当的转换。C语言中对数据类型的级别由高到低进行排序依次为:doublelongunsignedint。一般情况下会强行将char和short型转换为int型,将float型转换为double型。,混合运算中类型转换规则: 说明 1. 图中向下箭头表示必定进行的转换。 2. 横向箭头表示当参加运算的对象类型不同时转换的方向。 3.不同类型的数据转换是从低级向高级类型转换的。 4.多个数据运算时,转换是按照运算顺序一步一步进行的。,2赋值时的自动类型转换 如果赋值运算符左右两侧的数据类型不一致时,会发生自动类型转换,首先将右侧表达式的值转换为左侧的数据类型,再赋值给左侧的变量。 例如,有如下的变量定义: int a=2; float b=3.5f; double c=4.4; long d=100L;,3强制类型转换 为了解决自动类型转换所带来的“不确定性”,我们可以采用强制类型转换,将表达式的计算结果强制转换为某种类型,再参与运算或赋值给某个变量。强制类型转换的语法为: (类型) 表达式 例:比较下列表达式结果 5/2 (float)5/2 (float)(5/2),5/2 =? 会发生整除,结果为2。 (float)5/2 =? (float)优先和5结合,将5转换为5.000000,所以整个计算结果为2.500000。 (float)(5/2) =? 先整除,结果为2,将2转换为2.000000,1.5 自加、自减、逗号运算符 C语言中的自加+和自减-是独特而高效的运算符,也是容易混淆的运算符。逗号运算符是一个比较特殊的运算符,也是C语言中仅有的一个优先级比赋值运算符优先级低的运算符(最低)。 1.5.1自加和自减运算符:+、- C语言中特有的自增+和自减-运算符,它们是单目运算符,操作的对象只能是变量,不能是表达式或常量。自增和自减运算符可区分为前缀方式和后缀方式,它们的运算方式是不同的。自增、自减运算符常用于整型数据的运算,但也可以用于实型数运算。,1前缀方式 将+或-放在变量的前面,即是前缀方式。在此方式下,先执行变量与1相加或相减的运算,将运算结果写回变量,最后取该变量的值参与运算。 即 +变量(-变量) 变量先自加1(减1),后用 比如,有整型变量x,其值为8,有整型变量y,其值为3,则执行下面的语句时, x=+y; 先计算y+1,计算结果为4;然后将4写回y变量中,y变量值变为4;最后执行=运算符,将y中的4取出赋给x。最终x、y中的值均为4。通俗讲,前缀方式先对变量执行增1或减1运算,然后再取出其中的值参与其它运算。,2后缀方式 将+或-放在变量的后面,即是后缀方式。在此方式下,先取出变量的值参与运算,运算完成后,再执行变量与1相加或相减的运算,最后将运算结果写回变量中。 即 变量+(变量-) 变量先用,后自加1(减1) 比如,有整型变量x,其值为8,有整型变量y,其值为3,执行下面的语句时, x=y+; 先取出y中的值3,完成=运算,将3赋值给变量x,x变量值变为3,之后执行y+1,计算结果为4,最后将4写回y变量中。最终x变量值为3,y变量值为4。通俗地讲,后缀方式先取变量的值参加运算,然后再执行变量增1或减1的运算。,3自增自减运算符的结合性 自增自减运算符是单目运算符,结合性为右结合,实际上C语言中所有的单目运算符都是右结合。 假设x为整型变量,值为3,则执行以下语句后,x和y的值各为多少? y=-x+; -和+的优先级相同,结后性都是右结合,所以“y=-x+;”等价于“y=-(x+);”,+为后缀方式,所以先取x的值3,与-结合,得到-3赋值给y,所以y最后的结果为-3,之后x自增1,x最后为4。 自增和自减运算符是一把双刃剑,它的执行效率比x=x+1或x=x-1要高,但在一个表达式中过多使用自增或自减运算符,会产生许多难以理解的错误。 【例1.5】自增自减运算符的造成的混乱,1.5.2 逗号运算符 逗号运算符用于连接多个表达式组合成一个表达式,整个表达式称为逗号表达式,逗号表达式的一般形式为: 表达式1, 表达式2, 表达式3 逗号表达式的优先级是所有运算符中最低的,是唯一一个比赋值运算符优先级还要低的运算符,结合性是左结合。逗号表达式从左至右,逐个计算每个表达式的值,直到完成最后一个表达式的计算,最后一个表达式的值作为整个逗号表达式的值。【例1.6】逗号运算符的应用,1.6 位运算 C语言特有的位运算符是C语言既具有高级语言特点,又具有低级语言的功能的具体体现。位运算是对某个字节内的二进制位进行操作,位运算的操作对象只能是int型和char型数据,而不能是float、double等类型。 1.6.1 位运算的基本规律 C语言共有6个位运算符,其中按位取反为单目运算符,其余的均为双目运算符,按优先级由高到低为:按位取反左移位按位与&按位异或按位或|。位运算是对存储单元中的二进制位进行逐位运算,运算规则遵循位运算的规则,基本规则如表1-3所示(假定a、b是两个二进制位)。,1.6.2 位运算符 下面逐个介绍几个位运算符计算方法及应用场合。 1按位与运算符:& 常用于将某些二进制位保留不变,而将其它二进制位清零。例如11&7的结果是保留11的最低3位不变,将其余各位清零,结果为3。 00001011 & 00000111 所以11&7结果为3 00000011,清零 xxxxxxxx & 00100101 00x00x0x,2按位或运算符:| 常用于将某些二进制位保留不变,而将其它二进制位置1。例如10|3的结果是将最低2位置1,保留10的高14位不变,结果为11。 00001010 | 00000011 所以10|3结果为11 00001011,置1 xxxxxxxx | 01001001 x1xx1xx1,3按位

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论