C程序设计教程(上)林小茶编247_第1页
C程序设计教程(上)林小茶编247_第2页
C程序设计教程(上)林小茶编247_第3页
C程序设计教程(上)林小茶编247_第4页
C程序设计教程(上)林小茶编247_第5页
已阅读5页,还剩242页未读 继续免费阅读

下载本文档

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

文档简介

C程序设计教程(上)林小茶第一章1.1程序设计语言1.2通过实例认识C程序的结构1.3C语言的标准和编译器

1.4程序的调试

1.1程序设计语言程序计算机程序是由计算机指令构成的序列。计算机程序的操作对象是“数据〞。程序设计语言低级语言机器语言汇编语言movax,1000

高级语言a=1000a=a+1编译程序高级语言到机器语言要经过编译程序进行“翻译〞。编译程序的种类解释系统对高级语言编写的程序翻译一句执行一句。编译系统将高级语言编写的程序文件全部翻译成机器语言,生成可执行文件以后再执行。1.2通过实例认识C程序的结构

问候界面

例1.1在屏幕上显示welcome字样。/*---------------------------------------------------------*//*Aprogramtoprintwelcome-------------------*/#include"stdio.h"voidmain(){printf("welcome");}用/*和*/括起来的是注释行。注释行用于说明程序的功能和目的,编译系统会跳过注释行,不对其进行翻译。使用/*和*/括起来的语句并不一定在一行,可以是多行。以#开始的语句是预处理命令。这些命令是在编译系统翻译代码之前需要由预处理程序处理的语句。每个C程序都必须包含一个主函数main(),也只能包含一个主函数。用{}括起来的局部是一个程序模块,在C语言中也称为分程序,每个函数中都至少有一个分程序。C程序的执行是从主函数中的第一句开始,到主函数中的最后一句结束。分号“;〞是C语言的执行语句和说明语句的结束符。C语句在书写上采用自由格式。但是好的程序员应该学会使用缩进格式。C语言的关键字和特定字使用小写字母。printf是C语言提供的标准输入输出库函数。计算两个整数的差

例1.2计算两个整数30与20的差,并将结果在屏幕上。/*------------Thedifferencebetweenaandb.*/#include"stdio.h"voidmain(){inta,b,difference;a=30;b=20;difference=a-b;printf("Thedifferencebetweenaandbis%d.\n",difference);}运行结果:Thedifferencebetweenaandbis10.分析与说明:变量的数据类型定义。变量是由程序命名的一块计算机内存区域,用来存储一个可以变化的数值。每个变量保存的是一个特定的数据类型的数值。在C语言中规定,任何变量都要经过数据类型的定义,以便在程序运行时分配相应的存储空间。直接常量〔又称无名常量或文字常量〕。常量是在程序执行过程中不会变化的数值,直接常量就是在代码中直接书写的数值,没有名字。赋值运算符=。注意,这里的=与数学上的等号在概念上完全不同。赋值运算符号最简单的用法是:赋值运算符的左边是一个变量,右边是一个常量。其功能是将右边常量的值送到左边的变量中,使变量中的内容与常量相等。例如a=30;就表示使a中的内容变为30。运算符-。

difference=a-b;表示将a的内容与b的内容相减以后,赋值到difference变量中。printf使用初步printf是一个标准输出函数。它执行格式化输出,调用格式是:printf("格式信息",数据参数1,数据参数2,…);数据参数可有可无。格式信息用于控制数据参数的输出格式。格式信息中字符除了冠以斜杠“\〞和“%〞的字符,其它字符原封不动按照原样输出到屏幕上。格式信息中的%d是转换说明,它指定了显示数据参数的格式。printf(“%d〞,i);表示将参数i按整型十进制输出。C语言规定,转换说明符的个数应与参数的个数相等。例如:printf(“%d%d%d\n〞,x,y,z);格式信息中的\n是字符转义序列。\n表示换行。使用自定义函数计算两个整数的差例1.3/*------------Thedifferencebetweenaandb(usingFunction)*/#include"stdio.h"voidshow(intx,inty);/*〔自定义〕函数说明*/voidmain()/*main函数定义*/{inta,b;a=30;b=20;show(a,b);printf("Seeyou!\n");}voidshow(x,y)/*〔自定义〕函数定义*/intx,y;{intdifference;difference=x-y;printf("Thedifferencebetweenaandbis%d.\n",difference);return;}运行结果:Thedifferencebetweenaandbis10.Seeyou!1.3C语言的标准和编译器

C语言的标准

83ANSIC

87ANSIC

ANSI/ISOstandardC

ISOC

C99

常用的C语言编译器

TurboC2.0

TurboC++3.0

VisualC++

1.4C程序的调试调试步骤编辑源程序编译源程序连接目标程序运行可执行程序第二章C语言的根底知识2.1标识符、变量与常量

2.2

C语言的数据类型2.3运算符和表达式2.4指针类型与指针运算符2.1标识符、变量与常量字符集字符集是高级语言的编译系统所能识别的字母、数字、和特殊符号。每种高级语言都有自己特定的字符集合。标识符标识符是用来标识在C程序中的变量、常量〔指符号常量〕、数据类型和函数的。通俗一点说,标识符是程序员为变量、常量或者函数起的名字,它实际上是一个字符序列。2.1.1标识符(1)大、小写英文字母:A,B,…,Z,a,b,…z(2)数字:0,1,2,…,9(3)运算符:+–*/%><=&|?!^~(4)括号:〔〕{}[](5)标点符号:'":;(6)特殊符号:\_$#(7)空白符:空格符、换行符、制表符。C语言的字符集合包括:(1)字母或下划线中的任一字符打头。(2)在第一个字符后,可以是任意的数字、字母、下划线组成的序列。长度不超过8个。关键字〔保存字〕标识符的分类:特定字用户定义字任何一个标识符必须符合以下语法规那么:关键字:又称保存字,一般为小写字母。关键字是C编译程序预先登录的标识符,它们代表固定的意义,用户不能随便使用。假设随便使用,可能出现意想不到的错误,编译能通过,但运行结果不对,且不容易检查错误之所在。关键字〔保存字〕

特定字特定字:具有特殊含义的标识符。它们虽然不是关键字,但是在习惯上把它们看成关键字。所以一般用户定义的标识符也不要使用它们。特定字包括:defineundefincludeifdefifndefendifline用户按照语法规那么定义的标识符。用户定义字可以用来标识用户自己使用的变量,符号常量、数据类型以及函数等。注意(1)不能使用关键字和特定字。(2)用户定义字为了标识不同的对象,标识符的前8个〔甚至7个〕字符要有区别。(3)标识符最好有含义。(4)防止使用容易混淆的字符。如l与1,0与o,z与2等。(5)大、小写代表不同的意义。(6)尽量不要与某个库函数同名。用户定义字2.1.2变量变量变量是由程序命名的一块计算机内存区域,是用来存储一个可以变化的数值。

在使用一个变量之前,程序员必须为每个变量起个名字,同时还要声明它的数据类型,以便编译系统根据不同的数据类型为其静态地分配内存空间。我们称之为定义变量。定义变量的格式为:

类型说明符变量名表;关于不定值

定义变量2.1.3常量常量在程序的执行过程中数值不会发生改变的量。无名常量〔或称文字常量〕a=100;100是无名常量

符号常量〔用预处理命令#define为常量命名〕#deineMAX1002.2C语言的数据类型

整型int根本数据类型浮点型floatdouble字符型char

数组以[]为标志结构struct构造类型复杂数据类型联合union枚举enum指针类型以*为标志

C语言的数据类型整型

短整型shortint

长整型longint

普通整型int浮点型

普通浮点型float

双精度浮点型double字符型char

不同数据类型的数据由于其在内存的存储方式不同,存储所占的二进制位〔bit〕大多不相同。即使是相同类型的数据在不同种类的计算机所占位〔bit〕数也不完全相同。2.2.2问题的提出问题一:从键盘接收一个字符,输出该字符的按字典排列顺序的下一个字符,例如,输入a,输出b。问题二:从键盘接收两个整数,输出它们的和。问题三:从键盘接收两个浮点数,输出它们的乘积。2.2.3整型数据

整型数据在内存中的存储方式整型变量整型常量整型数据的输出整型数据的输入

在IBMPC机上,普通整型占16位〔bit〕,短整型也占16位〔bit〕,而长整型占32位〔bit〕。根据整型数据所占的位数,计算一个整型数据能表示的数据的取值范围。第0位是符号位,如果符号位为0,表示是正整数,从0到15位全为1时表示的数最大。0111……1+1=21515个1那么16bit能表示的最大整数是215–1,即32767。整型数据在内存中的存储方式如果符号位为1,表示是负整数,从0到15位都为0时表示的数最小。10……00

15个0

在计算机中,这个数是-215的补码表示。因此,最小整数是-215,即-32768。

按照整型变量所占的二进制位数来分类:short〔短整型〕int〔普通整型〕long〔长整型〕根据整型变量是否带符号位来分类:不带符号的整型变量带符号的整型变量无符号用关键字unsigned表示说明整型变量的语法是:限定词int变量名表;整型变量整型常量表示:十进制表示八进制表示以数字0开头十六进制表示以数字0和x开头。inta,b,c;a=10;b=010;c=0x10;长整型:要在数字后加上字母L。longs;s=10L;整型常量需要注意的是:如果整型常量超过机器所能表示的范围,那么会发生溢出,而在C语言中的整数溢出并不会使程序出错,而是得到一个非正确的值。

inta,b;a=10000;b=10000000;变量b的值会被系统认为是-27008。%d表示把数据按十进制整型输出;%o表示把数据按八进制整型输出;%x表示把数据按十六进制整型输出;%u表示把数据参数按无符号整型输出。注意:除了%d,其余的格式都将数据作为无符号数输出。printf("%ld",100000L);正确printf("%d",100000L);结果-31072整型数据的输出例2.1#include"stdio.h"voidmain(){intx,y,z;x=12,y=012,z=0x12;printf("%d,%d,%d\n",x,y,z);printf("%o,%o,%o\n",x,y,z);printf("%x,%x,%x\n",x,y,z);}运行结果:12,10,1814,12,22c,a,12例2.2输出负数。#include"stdio.h"voidmain(){intx,y,z;x=-12,y=-012,z=-0x12;printf("%d,%d,%d\n",x,y,z);printf("%o,%o,%o\n",x,y,z);printf("%x,%x,%x\n",x,y,z);}运行结果:-12,-10,-18177764,17766,177756fff4,fff6,ffee说明:本程序中的-012和-0x12并不是八进制和十六进制常量,“-〞实际是运算符,y=-012,是取012的负数,使用%o和%x格式显示的数据是无符号数。scanf是格式输入函数,其功能是按指定的格式将标准输入设备〔例如键盘〕输入的内容送入变量中。scanf函数的使用格式:scanf("格式信息",输入项1,输入项2,…);其中,“格式信息〞与printf的用法相似,可以在其中使用%和转换字符来指定数据的输入方式。需要注意的是,输入项必须使用地址,普通变量的地址是在变量名前加取地址符&。整型数据的输入

输入整型数据的转换字符有d,o,x,u%d表示把数据按十进制整型输入;%o表示把数据按八进制整型输入;%x表示把数据按十六进制整型输入;%u表示把数据参数按无符号整型输入。

与printf函数类似,如果希望输入的数据是长整型,需要在转换字符前加l。例2.3输入两个普通整型数,计算并输出它们的和。#include"stdio.h"voidmain(){intx,y,sum;printf("\nPleaseentertwointegers:\n");scanf("%d%d",&x,&y);sum=x+y;printf("%d+%d=%d\n",x,y,sum);}运行情况:Pleaseentertwointegers:1020↙〔回车符〕10+20=30注意(1)scanf读入一组整数时,scanf扫视输入信息,跳过空格、tab或换行,寻找下一个输入域。一个输入域就是一个连续的非空白字符的数字串。例如,假设输入为:78231920↙〔回车符〕38那么输入域有四个。(2)格式信息中除了有%开始的转换说明,还可以有普通字符,只是这些字符不是显示在屏幕上的,而是要求使用者在输入数据时,要在相应位置输入相同的字符〔除了空格、tab或换行符〕。例2.4输入格式与键盘输入的匹配。#include"stdio.h"voidmain(){intx,y,sum;printf("\nPleaseenterexpressionLikea+b=:\n");scanf("%d+%d=",&x,&y);sum=x+y;printf("%d\n",sum);}运行程序:PleaseenterexpressionLikea+b=:10+20=↙〔回车符〕30假设输入的内容是:10

20将会得到一个意想不到的结果,例如可能是:510scanf(“%d+%d=〞,&x,&y);一句要求在两个整数之间输入“+〞号,并在第二个整数后面输入“=〞;否那么,x和y接收的数据就不正确,也就是说,并没有将10和20正确地送到x和y这两个变量中,从而得出一个奇怪的结果510。例2.5输入两个普通八进制整数,计算并输出它们的和。#include"stdio.h"voidmain(){intx,y,sum;printf("\nPleaseentertwooctalintegers:\n");scanf("%o%o",&x,&y);sum=x+y;printf("0%o+0%o=0%o\n",x,y,sum);printf("%d+%d=%d\n",x,y,sum);}Pleaseentertwooctalintegers:1020↙〔回车符〕010+020=0308+16=24通过在%和转换说明符之前加整数数字就可以控制显示数字的域宽。在%后面加符号“-〞,规定显示数据在显示区域内左对齐;没有符号“-〞,数据显示时右对齐。通过控制域宽和对齐方式的目的是为了使输出的数字格式清晰明了,容易看懂。例2.6显示时整数增加域宽和左对齐。#include"stdio.h"voidmain(){intx,y,sum;printf("\nPleaseentertwointegers:\n");scanf("%d%d",&x,&y);sum=x+y;printf("%4d+%4d=%4d\n",x,y,sum);printf("%-4d+%-4d=%-4d\n",x,y,sum);}Pleaseentertwointegers:1020↙〔回车符〕10+20=3010+20=302.2.4字符型数据

字符变量与字符常量使用getchar和putchar函数对字符型数据进行输入和输出使用printf和scanf函数对字符型数据进行输入和输出字符串常量字符变量数据类型说明符char例如,charaloha,beta,c;一个字符变量能存储一个字节的信息,每个字符有固定的编码,最常用的就是ASCII编码。标准ASCII编码是把每个字符和与0~127的数值联系起来,用7位二进制表示,再将最高位充0,就是一个字节了。例如,在ASCII编码表中,A用数值65表示,其8位二进制表示是:01000001字符常量C语言中的字符常量是用单引号将一个字符括起来。例如'a'、'b'。可以用字符常量为字符变量赋值:charalpha='a';charbeta='b';注意:(1)引号中的字符只能是一个字符。(2)不能用双引号括起一个字符表示单个字符常量。(3)非图形字符,如退格,换行等,也可以表示成字符型常量。表示方法是使用转义符\与一些特殊字符构成转义序列。例如‘\n’就是一个转义序列,表示“回车换行〞。(4)字符型数据可以像整型数据一样参与四那么运算。'b'-'a'=198-97=1用getchar输入字符和用putchar输出字符putchar()函数的用法putchar()是向标准输入输出设备上输出一个字符,一般的标准输出设备是屏幕终端。注意,参数是不能缺省的。另外,尽管参数可以是整型数,但参数的值最好在0~127之间,否那么,输出可能是一些乱码。例2.7输出字符a。#include"stdio.h"voidmain(){intc='a',i;putchar(c);}getchar()函数的用法

getchar()是接收一个从标准输入输出设备上输入的字符。一般的标准输入设备是键盘。该函数没有参数,函数返回的数据类型为整型,值为字符的ASCII码值。

例2.8getchar函数的用法。#include"stdio.h"voidmain(){charc;printf("\nPleaseenteronechar:\n");c=getchar();putchar(c);}运行情况1:Pleaseenteronechar:a↙〔用户输入〕a运行情况1:Pleaseenteronechar:abc↙〔用户输入〕a例2.9从键盘接收一个字符,输出该字符的按字典排列顺序的下一个字符,例如,输入a,输出b。#include"stdio.h"voidmain(){charc;printf("\nPleaseenteronechar:\n");c=getchar();putchar(c+1);}或者#include"stdio.h"voidmain(){printf("\nPleaseenteronechar:\n");putchar(getchar()+1);}运行情况:Pleaseenteronechar:a↙〔用户输入〕b使用printf和scanf函数对字符型数据进行输入和输出例2.10修改例2.9,使用printf和scanf函数完成操作。#include"stdio.h"voidmain(){charc;printf("\nPleaseenteronechar:\n");scanf("%c",&c);c=c+1;printf("%c\n",c);}运行情况:Pleaseenteronechar:a↙〔用户输入〕b注意:使用scanf函数时,尽量不要将%c与其它转换说明一起使用。当scanf读入一组数据时,如果不使用%c做转换时,scanf扫视输入信息,跳过空格、tab或换行,寻找下一个输入域。但是假设使用%c做转换时,情况那么不同,scanf不会跳过空格、tab或换行,而是直接把下一个字符输入给参数,不管它是什么。例如,scanf("%d%c",&i,&c);键盘输入29wc的内容不是字符‘w’,而是空格。

解决的方法是在控制字符串中加空格分隔。scanf("%d%c",&i,&c);字符串常量用双引号括起来的字符序列是字符串常量。"howareyou""1234.5"字符串的存储与字符不同。C编译程序在存储字符串常量时自动采用\0作为字符串结束标志。"how"实际上所占的字节数是4。“a〞与‘a’是完全不同的,前者是字符串常量,占的字节数是2,后者是字符常量,占的字节数是1。字符串常量的输出printf("howareyou");printf("%s","howareyou");2.2.5浮点数

浮点数据在内存中的存储方式浮点变量与浮点常量浮点数据的输入和输出

浮点数在机器中的表示一般分为三局部:符号位、阶码、尾数。32位浮点数的有效数字的个数是7位十进制数字,取值范围为10-38~1038,64位浮点数的有效数字的个数是15位十进制数字,取值范围为10-308~10308。不同的机器可能会有一些微小的差异。浮点数据在内存中的存储方式浮点变量单精度浮点数〔float〕双精度浮点数〔double〕longdouble定义浮点变量:floata,b;doublec,d;单精度浮点数和双精度浮点数两者在计算机上的表示方式是完全相似的,只是所占的二进制位数不同,单精度浮点数的有效数字〔或称精度〕和取值范围与双精度浮点数不同。浮点常量小数表示法127.3科学计数法1.273×102在C语言中,实际上也是用这两种方式,只不过102用E+2表示。C程序中的浮点常数由整数局部、小数局部、指数局部构成。浮点常量构成规那么是:(1)整数局部可以不写,小数局部也可以不写,但不能同时不写。(2)指数局部可以省略〔相当于使用小数表示法〕(3)假设有指数局部,e〔或E〕两边都至少有一位数。(4)指数的数字必须是整数〔范围为1到3位的整数〕,可以为负或正,正号可以省略。例如,4.50E3、1.0、1.、.1234、123.4都是合法的浮点常量。

注意:浮点常量在存储时按double类型存储,即占32位〔bit〕。浮点常量也象整型常量一样,如果浮点常量超过机器所能表示的范围,那么会发生溢出。浮点溢出也不会使程序出错,而是得到一个非正确的值。%f显示小数表示的普通浮点数%e显示科学记数法表示的浮点数输出双精度〔double〕类型时,还需要在转换字符前加上字母l。输出浮点数时控制输出域宽和有效位:在%与f〔或e〕之间加上两个数字并在两个数字之间加一个句点“.〞。例如,%10.3f表示输出格式是域宽10,有效位3。注意:域宽的含义、缺省有效位、与数据本身的域宽的关系浮点数据输入与输出

例2.11输入两个浮点数,输出它们的和。#include"stdio.h"voidmain(){floatx,y;floatsum;printf("\nPleaseentertworeals:\n");scanf("%f%f",&x,&y);sum=x+y;printf("%f+%f=%f",x,y,sum);}运行情况:Pleaseentertworeals:1.2345671.234567↙〔用户输入〕1.234567+1.234567=2.469134输出浮点数时不仅可以控制输出域宽,还可以控制有效位的输出位数。例2.12输出浮点数据。#include"stdio.h"voidmain(){floatx;doubley;x=12.3456789;y=987654.321098;printf("\n%e,%le",x,y);①printf("\n%f,%lf",x,y);②printf("\n%.3f,%.3lf",x,y);③printf("\n%14.3f,%14.3lf",x,y);④printf("\n%-14.3f,%-14.3lf",x,y);⑤printf("\n%8.3f,%8.3lf",x,y);⑥printf("\n%14f,%14lf",x,y);⑦}2.3

运算符和表达式

2.3.1

表达式与简单语句2.3.2算术运算符2,3.3赋值运算符2.3.4增1/减1运算符2.3.5位逻辑运算符2.3.6逗号运算符2.3.7求字节运算符2.3.8不同数据类型数据间的混合运算2.3.9赋值表达式的类型转换2.3.1表达式与简单语句表达式的概念表达式是用运算符与圆括号将操作数连接起来所构成的式子。C语言的操作数包括常量、变量、函数值等。根据表达式进行运算,得到的数值即为表达式的解。表达式与简单语句在C语言中,在一个表达式的后面加上分号“;〞就构成了简单语句。有意义的简单语句无意义的简单语句2.3.2算术运算符

种类及运算+-*/%注意:

两个整数相除,结果仍为整数,商向下取整。取模运算符%实际上是数学运算的求余数运算,其两个操作对象都必须是整数。减法运算符还可以用做单目运算符,是取负运算。其余操作符均为双目运算符。

算术表达式及算术运算符的优先级

算术表达式就是用算术运算符和圆括号将操作数连接起来的式子。算术表达式的解就是经过算术运算得到的表达式的值。算术运算符的优先级与数学根本相同,即先乘除,后加减。取模运算的优先级与乘除相同。函数和圆括号的优先级最高。

注意:

算术表达式应能正确的表达数学公式。例如:数学表达式是3+x

2a相应的C语言表达式应该是什么呢?算术表达式的结果应该不超过其所能表示的数的范围。例如,最大的整型数是32767,那么,32767+3就不会是正确的结果。而

32767L+3的结果是正确的,因为32767L是长整型数。算术运算符的结合性

运算符的结合性是指如果一个操作数左边和右边的两个运算符的优先级相同,应该优先计算的操作符。例如:a+b-c操作数b左右的运算符+和-的优先级相同,那么,是先计算b-c,还是先计算a+b呢?C语言规定双目算术运算符的结合性是自左至右,也就是b先与左边a结合,再与右边c结合。所以是先计算a+b,然后用a+b的结果减c。双目运算符的结合性与数学运算并无不同。2.3.3赋值运算符

普通赋值运算符

赋值表达式的一般形式是:变量名=表达式赋值语句的一般形式是:变量名=表达式;

赋值运算符的优先级小于算术运算符。赋值运算符的结合性是自右至左,

以a=b=2为例

复合赋值运算符

把赋值运算符与算术、位逻辑、移位运算符放在一起,就构成复合赋值运算符。复合算术赋值运算符有5个+=、-=、*=、/=、%=。还有与移位和位逻辑结合的复合赋值运算符5个〔<<=、>>=、&=、^=、|=〕。复合赋值运算符的使用规那么是:Xop=Y与X=XopY等价。2.3.4增1/减1运算符

++和--。这两个运算符都是单目运算符,其功能分别是将变量自身的内容增1和减1。++i和--i是前缀表示法,i++和i--是后缀表示法。如果直接在++i和i++的后面加上分号构成C的执行语句,即++i;和i++;前缀与后缀并无区别〔减1符号也一样〕。但是,将它们用在表达式中那么前缀与后缀是有区别的。前缀表示法是先将i值增/减1,再在表达式中使用;而后缀表示法是先在表达式中使用i的值,再将i值增/减1。例如:i=3;i=3;j=i++;j=++i;

结果j的内容为3j的内容为4i的内容为4i的内容为4

注意:增1/减1运算符的操作对象是一个变量2++、--2以及(x/y)++均为非法增1/减1运算符的优先级高于算术运算符,与单目运算符-〔取负〕、!〔逻辑非〕的优先级相同,结合方向自右至左。例如表达式-i++等价于-(i++)副作用:printf(“%d,%d〞,i,i++);在不同的编译环境下结果有可能不同。尽量不要在一般的表达式中将增1/减1运算符与其它运算符混合使用。2.3.5位逻辑运算符~<<>>&|^按位取反左移右移按位与按位或按位异或操作数在实现位操作时按二进制进行运算,7一般应为无符号型整数。

按位与&按位与的运算规那么是:0&0=00&1=01&0=01&1=1例如:charw1,w2,w3;w1=10;w2=8;w3=w1&w2;w3的内容可以通过下式运算:0000101000001000〔按位与&〕00001000〔结果〕

&运算经常用于把特定位清零〔屏蔽〕。例如,a的值为11011010,b的值为11110000,a&b11011010&1111000011010000相当于把a的低4位屏蔽,高4位不变。按位或|按位或的运算规那么是:0|0=00|1=11|0=11|1=1例如:charw1,w2,w3;w1=10;w2=8;w3=w1|w2;w3的内容可以通过下式运算:0000101000001000〔按位或|〕00001010〔结果〕按位异或^按位或的运算规那么是:0^0=00^1=11^0=11^1=0例如:charw1,w2,w3;w1=10;w2=8;w3=w1^w2;w3的内容可以通过下式运算:0000101000001000〔按位异或^〕

00000010〔结果〕按位取反~按位取反的规那么是:~0=1~1=0注意:对于位逻辑反来说,~0x7在16位机上的表示是即0xfff8,但在32位机上的表示是0xfffffff8,所以通常用~0x7来表示7的逻辑非,而不用0xfff8或oxfffffff8。移位运算符 左移<<右移>>双目运算符,运算符右边的表达式表示移位的位数。x=x<<2表示把x进行左移以后赋值给x,注意不能只用x<<2左移可以扩大原数的倍数,左移1位扩大2倍,左移2位扩大4倍,…。右移可以缩小原数的倍数。右移时,假设符号位为0,那么右边填零。假设符号位为1,根据机器不同分为算术移位〔填充1〕逻辑移位〔填充0〕。2.3.6逗号运算符表达式1,表达式2逗号表达式的求值过程是:先求解表达式1,再求解表达式2,并将表达式2的解作为逗号表达式的解。例如5,6的值是6

z=(y=3,x*y)与z=x*(y=3)是等价的逗号运算符一般用于循环for语句,不提倡使用在其它的表达式中。

2.3.7求字节数运算符sizeof是一个比较特殊的单目运算符,也是一个非常有用的运算符,经常用于动态分配空间。其语法格式为:sizeof(表达式)表达式可以是变量名、常量、以及数据类型名。

它的功能是:求表达式中变量名所代表的存储单元所占的字节数;或是求表达式中常量的存储单元所占的字节数;或是求表达式中的数据类型表示的数据在内存单元中所占的字节数。sizeof(int)的结果是2,sizeof运算符比较灵活,同样是求整型int数据所占的字节数,可以使用三种方法:(1)求sizeof(int)(2)求sizeof(10)(3)使用inta;求sizeof(a)例2.13求各种数据类型在内存中所占的字节数。

#include"stdio.h"voidmain(){printf("char=%dbyte\n",sizeof(char));printf("shortint=%dbyte\n",sizeof(shortint));printf("int=%dbyte\n",sizeof(10));printf("longint=%dbyte\n",sizeof(10L));printf("float=%dbyte\n",sizeof(float));printf("double=%dbyte\n",sizeof(2.3));printf("\"china\"=%dbyte\n",sizeof("china"));}2.3.8不同数据类型数据间的混合运算自动转换所谓“自动转换〞就是系统根据规那么自动将两个不同数据类型的运算对象转换成同一种数据类型的过程。而且,对某些数据类型,即使是两个运算对象的数据类型完全相同,也要做转换,例如float。强制转换在C语言中,允许程序员根据自己的意愿将一种数据类型强制转换成另一种数据类型。强制转换的格式为:(数据类型名)操作对象注意,强制转换并不改变操作对象的数据类型和数值。例如,(int)f确实切含义是将f转换成为整型值参与运算,而f本身的数据类型和数值都没有任何改变。2.3.9赋值表达式的类型转换当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型相同时,不需要进行数据类型的转换。当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型不相同时,系统负责将右边的数据类型转换成左边的数据类型。此时,会有两种情况产生,一种是转换以后会丧失数据,另一种是转换以后不会丧失数据。这与赋值号两边的表达式的数据类型所占的字节数及存储表示方式有关。(详细内容自学〕例2.15字符赋值给整型变量。#include"stdio.h"voidmain(){intc;/*charc;*/c='B';printf("\nc=%c",c+'a'-'A');}

运行结果:c=b例2.16整型变量赋值给长整型变量。#include"stdio.h"voidmain(){longc;inta;a=32763;c=a;printf("\nc=%ld",c);}运行结果:c=32763例2.17float类型的数赋值给double类型的变量。#include"stdio.h"voidmain(){floatx;doubley;x=1.234567E+37;y=x;printf("\ny=%le",y);}运行结果:y=1.234567E+37例2.17float类型的数赋值给double类型的变量。#include"stdio.h"voidmain(){floatx;doubley;x=1.234567E+37;y=x;printf("\ny=%le",y);}运行结果:y=1.234567E+372.4指针的根本概念和运算2.4.1指针概念内存是以一个字节为单位的连续的存储空间,每个内存单元都有一个编号,称为内存地址。请看以下图,变量i的地址是1000,变量i的内容是30。301000i用另一个变量记住i的地址,这个变量就是指针类型的变量,一般称为指针变量。因此,一个指针变量的值就是某个内存单元的地址,称为某内存单元的指针。301000i1000p用p变量记住了i的地址,p的数据类型就是指针类型。

这时,我们可以称p指向变量i,或者说p是指向变量i的指针。严格地说,一个指针是一个地址,是一个常量,例如1000,2000都是指针。而一个指针变量的内容是可以变化的,是变量。但实际上为了方便,在不会引起混淆的情况下,经常把指针变量简称为指针。变量就需要在使用之前事先定义,然后才能使用。指针变量的定义格式:指针所指对象的数据类型*指针变量名1,*指针变量名2,…;定义格式中的“*〞表示变量是一个指针变量。int*p;表示p是一个指针变量,p指向的存储单元是整型的。

注意,指针变量与其他变量一样,如果是自动变量并且未赋值,指针变量的值将是不定值。如果想让p的内容是i的地址,需要做一个取地址运算。inti;/*定义整型变量i*/int*p;/*定义指针变量p*/p=&i;/*p指向i*/定义指针的目的是为了通过指针去访问内存单元。运算符“*〞写在指针变量的前面,就是通过该指针访问它所指向的存储单元。我们在上面三条语句后面,再加上一条执行语句,变成:inti;/*定义整型变量i*/int*p;/*定义指针变量p*/p=&i;/*p指向i*/*p=3;/*使i的内容为3*/最后一句是将p指向的存储单元i的内容赋值为3。要点(1)如果有了定义int*p,说明p是指针变量〔也可以简称指针〕,p的值应该是地址,可以通过取地址运算符&指向一个存储单元,p本身要占一个存储单元〔这一点经常被初学者忽略〕。要点(2)指针变量可以指向任何一种根本数据类型的存储单元,指向何种类型的存储单元,定义时要明确地指出,并且不能随便指向其他数据类型的变量。例如,如果有定义float*q;那么q只能指向单精度浮点型的数据单元,而不能指向整型数据。inti;float*p;p=&i;/*错误*/上述程序段可能会引起预想不到的结果。要点(3)注意“*〞号的不同含义,它可以作为算术运算符乘号,可以定义指针,还可以存取指针所指的存储单元的内容。例如:inti;/*定义整型变量i*/int*p;/*定义指针变量p*/p=&i;/*p指向i*/*p=3*6;/*使i的内容为3*6=18*/要点(4)指针只是概念上的地址,不需要关心它的具体数值,是2000还是3000,都无关紧要。因为对某个变量来说,由系统为它申请动态或静态内存,在C程序中不可直接将内存地址值赋值给一个指针变量。int*p;p=2000;/*错误*/要点(5)

指向相同的数据类型的指针变量可以相互赋值,指向不同类型对象的指针一般不要做相互赋值,除非做强制转换。而且有时候,强制转换也可能不能完全移植。inti;int*py=&i;int*px;px=py;上面程序段执行以后,px也指向i。

2.4.2指针运算符&和*的使用前面已经介绍了指针运算符&和*。&是取地址符,*是取内容符,通过*,可以存取指针所指的存储单元的内容。例2.23分析下面两个程序的运行结果。#include"stdio.h"voidmain(){longdata,y,*pointer;data=7;pointer=&data;y=*pointer;printf("\ny=%ld",y);}运行结果:y=7注意:(1)使用指针运算符*和&时,必须注意运算符之间的优先级。*和&是同级的,单目运算符与操作数结合方式是从右至左。*&d的结果就是d。(2)运算符&只能用于变量或数组元素。所以&(d+1)、&4、&A〔A为数组名〕均为非法。(3)不能用运算符&取存放器变量的地址,因为存放器变量没有地址。(4)&x不能出现在赋值号的左边。例2.24分析下面程序的运行结果。#include"stdio.h"voidmain(){intbeta=10;int*pointer,*q;pointer=β*pointer=20;beta=*pointer+30;q=βprintf("\n*q=%d",*q);}运行结果:*q=50例2.25指针作为scanf函数的参数。#include"stdio.h"voidmain(){intx,y,sum,*p;p=&x;printf("\nPleaseentertwointegers:\n");scanf("%d%d",p,&y);sum=x+y;printf("\n%d+%d=%d",x,y,sum);}第3章结构化程序设计

3.1结构化程序设计思想3.2语句与分程序3.3顺序结构程序设计3.4关系运算符与逻辑运算符3.5选择结构程序设计3.6循环结构程序设计3.1结构化程序设计思想3.1.1结构化程序设计思想的产生20世纪60年代“软件危机〞的产生是否在程序设计中使用“goto〞语句的争论CorradoBÖhm和GuiseppeJacopini.就证明了只要有顺序、选择和循环三种形式的控制结构,就足以导出其它各式各样的程序结构,从而在理论上奠定了结构化程序设计的根底。3.1.2结构化程序设计的三种根本结构(1)顺序结构顺序结构就是一组逐条执行的可执行语句。按照书写顺序,自上而下的执行。(2)选择结构〔分支结构〕选择结构是一种先对给定条件进行判断,并根据判断的结果执行相应命令的结构。(3)循环结构循环结构是指屡次重复执行同一组命令的结构。具有循环结构的程序一般必须指定循环的终止条件,以便对程序的循环进行有效的控制,以免进入无限循环〔或称死循环〕的状态。C程序的执行局部由执行语句构成。执行语句的种类

表达式语句函数调用语句控制语句复合语句〔或称分程序〕空语句3.2语句与分程序

最简单的可执行语句。只要在表达式后面加上分号就可以了。例如:++i;x=y;有效的表达式语句一般都要有赋值运算,否那么,不做任何赋值运算的表达式大多数是无意义的。表达式语句

函数调用语句由函数名、实际参数以及分号构成。例如:printf("welcome");printf是函数名,“welcome〞是实际参数。函数名既可以是C语言提供的库函数名,也可以是我们自己定义的函数名。

控制语句控制语句是用于控制程序流程的语句,控制语句一般指那些改变了顺序结构的语句。C语言的控制语句分支语句〔if和switch〕循环语句〔while、do-while、for〕转向语句〔break、goto、continue、return〕。熟练掌握控制语句是学会程序设计的根底。

复合语句和分程序结构复合语句是用{和}把数据说明语句和假设干个有序的执行语句组合在一起而构成。其一般格式为{[数据说明];[语句];}复合语句在语法上相当于一个简单语句,在程序中可以作为一个独立语句来看待,因此又称为分程序。

空语句

C语言中有一个很特殊的语句,即空语句。空语句,顾名思义,就是什么也不存在的语句,只有一个分号:;尽管空语句不会有任何命令执行,但仍然是一个有用的语句。常用于循环语句中,使循环体为空。例如:for(sum=0,i=0;i<=9;i++;sum=sum+i);

3.3顺序结构程序设计

顺序程序设计的步骤可以归纳为:(1)用预处理命令包含文件或进行宏定义〔不是必须的,根据具体情况〕;(2)定义变量〔分配内存空间〕;(3)为变量赋初值〔可以用赋值语句或输入函数〕;(4)计算;(5)输出结果〔用输出函数〕。

例3.1编写程序输入长方形的长和宽,求长方形的面积和周长并输出,用浮点数据处理。#include"stdio.h"voidmain(){

doublelength,width,area;/*定义变量*/

printf("\nEnterlengthofrectangle:");/*提示用户输入长方形的长*/

scanf("%lf",&length);/*接收输入*/

printf("Enterwidthofrectangle:");/*提示用户输入长方形的宽*/

scanf("%lf",&width);/*接收输入*/

area=length*width;/*计算长方形的面积*/

printf("\nAreaofrectangleis%lf",area);/*输出长方形的面积*/

printf("\nPerimeterofrectangleis%lf",2*(length+width));

/*输出长方形的周长*/}

例3.2编写程序,输入x和y,交换它们的值,并输出交换前后接收输入。

/*----------------------------swapxandy--------------------------------*/#include"stdio.h"voidmain(){intx,y,temp;printf("\nPleaseinputtwointnumber:");/*提示用户输入两个整数*/scanf("%d%d",&x,&y);/*接收输入*/printf("\nbeforechangedx=%3dy=%3d",x,y);/*输出交换以前x和y的内容*/temp=x;x=y;y=temp;printf("\nafterchangedx=%3dy=%3d",x,y);/*输出交换以后x和y的内容*/}3.4关系运算符与逻辑运算符

3.4.1关系运算符所谓关系运算,实际上就是比较两个数值的大小。那么,比较两个数值的大小的运算符就是关系运算符。关系运算符有六个>、>=、<、<=、==、!=。由关系运算符连接起来的表达式就是关系表达式。关系表达式的解一般应为真或假,C语言用整数1表示真,整数0表示假。初学者经常会混淆关系运算符“==〞和赋值运算符“=〞,因此要注意区分这两个运算符。例3.3#include"stdio.h"voidmain(){intx,y,z1,z2;x=2;y=2;z1=(x=y);z2=(x==y);printf("%d,%d\n",z1,z2);}六个关系运算符中的“!=〞和“==〞的优先级小于其余四个运算符。

关系运算符的优先级小于算术运算符,大于赋值运算符。关系运算符的结合性均为自左至右。

当多种运算符在一个表达式中同时使用时,要注意运算符的优先级,防止记错运算符优先级的最好方法是加圆括号。3.4.2逻辑运算符

如果将“与、或、非〞运算应用于逻辑值〔逻辑真和逻辑假〕那么称为逻辑运算。

C语言中的逻辑运算符有三个:逻辑与&&、逻辑或||和逻辑非!

其中逻辑与和逻辑或是双目运算符,而逻辑非是单目运算符。逻辑运算的规那么与二进制的位逻辑是相似的。逻辑运算的规那么下表:C语言系统对任何非0值都认定为是逻辑真,而将0认定为逻辑假。如果一个表达式参与逻辑运算,只要这个表达式的解为非0,那么系统就认为这个表达式的结果是逻辑真。但是要注意,系统逻辑运算的结果仍然只有两个:1〔逻辑真〕和0〔逻辑假〕。

逻辑运算符经常与关系运算符一起使用。C语言表达式(x>=10)&&(x<=100)的数学含义是:10≤x≤100逻辑运算符的优先级!&&||高低!

温馨提示

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

评论

0/150

提交评论