收藏 分享(赏)

C语言程序结构和语法规则.doc

上传人:eukav 文档编号:9478767 上传时间:2019-08-09 格式:DOC 页数:16 大小:122KB
下载 相关 举报
C语言程序结构和语法规则.doc_第1页
第1页 / 共16页
C语言程序结构和语法规则.doc_第2页
第2页 / 共16页
C语言程序结构和语法规则.doc_第3页
第3页 / 共16页
C语言程序结构和语法规则.doc_第4页
第4页 / 共16页
C语言程序结构和语法规则.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、C 语言11C 语言程序结构和语法规则一、C 语言程序的基本结构下面通过几个简单的示例,介绍 C 语言程序的基本构成和书写格式,使读者对 C 语言程序有一个基本的了解。在此基础上,再进一步了解 C 语言程序的语法和书写规则。 【例1.1】求三个数的平均值的 C 语言程序。/*功能:求三个数的平均值 */main() /* main()称为主函数*/float a,b,c,ave; /* 定义 a,b,c,ave 为实型数据*/a=7;b=9;c=12;ave=(a+b+c)/3; /*计算平均值*/printf(“ave=%fn“,ave); /* 在屏幕上输出 ave 的值 */程序运行结果

2、:ave=9.333333【例1.2】输出两个数中的较大值的 C 语言程序。/*功能:输出两个数中的较大值 */main() /*主函数*/int num1,num2,max; /*定义 num1、num2、max 为整型变量*/scanf(“%d,%d“, /*由键盘输入 num1、num2的值*/printf(“max=%dn“,max(num1,num2); /*在屏幕上输出调用 max 的函数值*/*用户设计的函数 max()*/int max(int x,int y) /* x 和 y 分别取 num1和 num2传递的值*/if(xy) return x; /* 如果 xy,将 x

3、 的值返回给 max */else return y; /* 如果 xy 不成立,将 y 的值返回给 max */程序运行情况:5,8(“”表示按回车键,以下相同 )max=8在以上两个示例中, 【例1.1】所示的 C 语言程序仅由一个 main()函数构成,它相当于其他高级语言中的主程序;【例1.2】所示的 C 语言程序由一个 main()和一个其他函数max()(用户自己设计的函数)构成,函数 max()相当于其他高级语言中的子程序。由此可见,一个完整的 C 语言程序结构有以下两种表现形式:(1)仅由一个 main()函数(又称主函数)构成,如图1-1(a)所示。(2)由一个且只能有一个

4、main()函数和若干个其他函数结合而成,如图1-1(b)所示。其中,自定义函数由用户自己设计。C 语言22图1-1 C 语言程序结构示意图结合以上示例,可以看出 C 语言程序结构有以下基本特点:(1)C 语言程序是由函数(如:main 函数和 max 函数) 组成的,每一个函数完成相对独立的功能,函数是 C 语言程序的基本模块单元。 main 是函数名,函数名后面的一对圆括号“()”是用来写函数的参数的。参数可以有,也可以没有(本程序没有参数) ,但圆括号不能省略。(2)一个 C 语言程序总是从 main()函数开始执行。主函数执行完毕,程序执行结束。(3)C 语言编译系统区分字母大小写。

5、C 语言把大小写字母视为两个不同的字符,并规定每条语句或数据说明均以分号(;)结束。分号是语句不可缺少的组成部分。(4)主函数 main()既可以放在 max()函数之前,也可以放在 max()函数之后。习惯上,将主函数 main()放在最前面。(5)C 语言程序中所调用的函数,既可以是由系统提供的库函数,也可以是由设计人员自己根据需要而设计的函数。例如,在【例1.2】中,printf() 函数是 C 语言编译系统库函数中的一个函数,它的作用是在屏幕上按指定格式输出指定的内容;max() 函数是由用户自己设计的函数,它的作用是计算两个数中的较大值。二、C 语言程序的书写规则(1)C 源程序是由

6、一个主函数和若干个其它函数组成的。(2)函数名后必须有小括号,函数体放在大括号内。(3)C 程序必须用小写字母书写。(4)每句的末尾加分号。(5)可以一行多句。(6)可以一句多行。(7)可以在程序的任何位置加注释。一个完整的语言程序,是由一个 main()函数(又称主函数)和若干个其它函数结合而成的,或仅由一个 main()函数构成。例1.3 仅由 main()函数构成的语言程序。main() printf(“This is a C program.n”);程序运行结果:This is a C program. 例1.4 由 main()函数和1个其它函数 max()构成的语言程序。int m

7、ax(int x, int y) return( xy ? x : y ); main() int num1,num2;C 语言33printf(“Input the first integer number: ”);scanf(“%d”, printf(“Input the second integer number: ”);scanf(“%d”, printf(“max=%dn”, max(num1, num2);程序运行情况:Input the first integer number:6Input the second integer number:9max=9 运算符与优先级、表达式

8、一、运算符运算符包括下面这些类型:1、算术运算符(,*,):依次为加,减,乘,除,求余数。除最后两种是单目运算符外,其它几种都是双目运算符。前四种运算较简单,不再展开叙述,最后三种运算的定义如下:Op1 op2 表示: oPlint(oP1op2)*op2,其中 ina(a)表示取 a 的整数部分(a 的小数部分总非负)。Op+ 表示 op = op +1;Op- 表示 op = op -1;2 关系运算符(,=, ,) 依次为取反,按位与,按位或,按位异或,右移位,左移位,无符号右移位5 赋值运算符() 赋值操作符,它将等号右边数据的值赋值给左边的变量。6 条件运算柠(?:)条件运算符为三目

9、运算符,其“般格式为:ab?a:b7 扩展运算符(十, * , /= ,|,)扩展运算符都是由一个双目运算符和一个等号连在一起组成(注意它们之间不能用空格隔开),以“+”为例说明这类扩展运算符的用法:A += B; 表示 A A+B 其它类似。8 其他运算符,如豆号运算符“, ”,分量运算符“ ”。再如实例运算符“instanceof” ,内存分配运算符“new” ,强制类型转换运算符“(类型)” ,方法调用运算符“()” ,取数组元素运算符“ ”。比如,设 t 是类 Thread 的一个实例。分量运算符:tname 表示类的实例的调用,又叫点问, (意指通过点的操作符访问类的实例对象)C 语

10、言44二、运算符的优先级优先顺序依次为(1级最优先,余下类推)第1级: ()纪2级:+ - ! instanceof第3级:new第4级:* %第5级:+ -第6级: = = =记住这些优先次序是困难的,个较好的方法是使用括号(),比如:ab scanf(“m=%dn=%dp=%d“,printf(“%d%d%dn“,m,n,p);若想从键盘上输入数据,使变量 m 中的值为123,n 中的值为456,p 中的值为789,则正确的输入是 A)m=123n=456p=789B)m=123 n=456 p=789C 语言55C)m=123,n=456,p=789D)123 456 789(2) 有以

11、下程序main() int m=0256,n=256;printf(“%o %on“,mn,n);程序运行后的输出结果是A) 0256 0400 B) 0256 256 C) 256 400 D) 400 400 (3) 有以下程序main() int a=666,b=888;printf(“%dn“,a,b);程序运行后的输出结果是A) 错误信息 B) 666 C) 888 D) 666,888 (4) 有以下程序main( )int x=102,y=012; printf(“%2d,%2dn”,x,y); 执行后输出结果是A) 10,01 B) 02,12 C) 102,10 D) 02,

12、10(5) 有以下程序main() int a; char c=10;float f=100.0; double x;a=f/=c*=(x=6.5);printf(“%d %d %3.1f %3.1fn“,a,c,f,x);程序运行后的输出结果是A) 1 65 1 6.5 B) 1 65 1.5 6.5C) 1 65 1.0 6.5 C 语言66D) 2 65 1.5 6.5(6) 有定义语句:int x,y;, 若要通过 scanf(“%d,%d“,语句使变量 x 得到数值11,变量 y 得到数值12,下面四组输入形式中,错误的是A) 11 12,使 i 的值为1、j 的值为2、k 的值为3

13、,以下选项中正确的输入语句是A) scanf(“%2d%2d%2d”,B) scanf(“%d %d %d”,C) scanf(“%d,%d,%d”,D) scanf(“i=%d,j=%d,k=%d”,(11) 设有定义:long x=-123456L;,则以下能够正确输出变量 x 值的语句是A)printf(“x=%dn”,x); B) printf(“x=%1dn”,x);C)printf(“x=%8dLn”,x); D)printf(“x=%LDn”,x);C 语言77(12) 以下程序段的输出结果是int a=1234;printf(“%2dn“,a);A) 12 B) 34 C) 1

14、234 D) 提示出错、无结果(13) x、y、z 被定义为 int 型变量,若从键盘给 x、y、z 输入数据,正确的输入语句是A) INPUT x、y、z; B) scanf(“%d%d%d”,C) scanf(“%d%d%d”,x,y,z); D) read(“%d%d%d”,(14) 若变量已正确说明为 float 类型,要通过语句 scanf(“%f %f %f ”,给 a 赋于10.0,b 赋予22.0,c 赋予33.0,不正确的输入形式是:A) 10 B) 10.0,22.0,33.02233C) 10.0 D) 10 2222.0 33.0 33(15) 有如下程序main0 i

15、nt y=3,x=3,z=1;printf(“%d %dn”,(+x,y+),z+2);运行该程序的输出结果是A) 3 4B) 4 2C) 4 3 D) 3 3(16) 下列程序执行后的输出结果是(小数点后只写一位)A) 6 6 6.0 6.0 B) 6 6 6.7 6.7C) 6 6 6.0 6.7 D) 6 6 6.7 6.0main() double d; float f; ling l; int i;i=f=1=d=20/3;printf(“%d %ld %f %f n“, i,l,f,d);(17) 以下说法中正确的是A) #define 和 printf 都是 C 语句 B) #d

16、efine 是 C 语句,而 printf 不是C) printf 是 C 语句,但#define 不是 D) #define 和 printf 都不是 C 语句(18) 以下程序的输出结果是A) 17,021,0x11 B) 17,17,17C 语言88B) 17,0x11,021 D) 17,21,11main( ) int k=17;printf(“%d,%o,%x n“,k,k,k);(19) 以下叙述中正确的是A) 输入项可以是一个实型常量,如:scakf(“%f“,3.5);B) 只有格式控制,没有输入项,也能正确输入数据到内存,例如:scakf(“a=%d,b=%d“);C) 当

17、输入一个实型数据时,格式控制部分可以规定小数点后的位数,例如:scakf(“%4.2f“,D) 当输入数据时,必须指明变量地址,例如:scakf(“%f“,(20) 若有以下定义和语句:int u=010,v=0x10,w=10;printf(“%d,%d,%dn,u,v,w);则输出结果是:A) 8,16,10 B) 10,10,10 C) 8,8,10 D) 8,10,10(21) 请读程序片段:int i=65536; printf(“%dn“,i);上面程序片段的输出结果是A) 65536 B) 0 C) 有语法错误,无输出结果 D) -1(22) 若 x 和 y 都是 int 型变量

18、,x=100,y=200,且有下面的程序片段:printf(“%d“,(x,y);上面程序片段的输出结果是A) 200 B) 100 C) 100 200 D) 输出格式符不够,输出不确定的值(23) 请读程序:#includemain() int a; float b, c;scanf(“%2d%3f%4f“,printf(“na=%d, b=%f, c=%fn“, a, b, c);若运行时从键盘上输入9876543210(表示回车),则上面程序的输出结果是A) a=98, b=765, c=4321 B) a=10, b=432, c=8765C) a=98, b=765.000000,

19、 c=4321.000000 C 语言99D) a=98, b=765.0, c=4321.0(24)以下程序的输出结果是 【24】 。# include # include main() int a=1,b=4,c=2;float x=105 , y=4.0 , z;z=(a+b)/c+sqrt(double)y)*1.2/c+x;pritnf(“%fn“,z); A) 14.000000 B) 015.400000 C) 13.700000 D) 14.900000(25)以下程序的输出结果是 【25】 。# include main() int a=2,c=5;printf(“a=%d,

20、b=%dn“,a,c); A) a=%2,b=%5 B) a=2,b=5 C) a=%d,b=%d D) a=%d,b=%d(26) 执行下面程序中的输出语句,a 的值是A) 65B) 20 C) 15D) 10main() int a;printf(“%dn“,(a=3*5,a*4,a+5);二、填空题:(1)以下程序运行后的输出结果是 【1】 。main() int x=0210; printf(“%Xn“,x);(2)以下程序运行后的输出结果是 【2】 。main() char c; int n=100;float f=10; double x;x=f*=n/=(c=50);printf

21、(“%d %fn“,n,x);(3)以下程序运行时若从键盘输入:10 20 30。输出结果是 .#include C 语言1010main() int i=0,j=0,k=0;scanf(“%d%*d%d“,printf(“%d%d%dn“,i,j,k);(4) 以下程序段的输出结果是 【4】 。int i=9;printf(“%on“,i);(5) 以下程序运行后的输出结果是 【5】 。main() int a,b,c;a=25;b=025;c=0x25;printf(“%d %d %dn“,a,b,c);(6) 有以下语句段int n1=10,n2=20;printf(“ 【6】 ”,n1

22、.n2); 要求按以下格式输出 n1和 n2的值,每个输出行从第一列开始,请填空。n1=10n2=20(7)若有语句int i=-19,j=i%4;printf(“%dn“,j);则输出结果是 【7】 。(8)若有程序main() int i,j;scanf(“i=%d,j=%d“;printf(“i=%d,j=%dn“,i,j);要求给 i 赋10,给 j 赋20,则应该从键盘输入 【8】 。(9) 以下程序的输出结果是【9】 。main() int a=177;printf(“%on“,a);(10) 以下程序的输出结果是【10】 。main() int a=0a+=(a=8);print

23、f(“%dn“,a); C 语言1111(11)以下程序的输出结果是 【11】 main() int a=1, b=2;a=a+b; b=a-b; a=a-b;printf(“%d,%dn”, a, b ); (12)下列程序的输出结果是16.00,请填空。 。main() int a=9, b=2;float x= 【12】 , y=1.1,z;z=a/2+b*x/y+1/2;printf(“%5.2fn”, z ); (13) 以下程序的输出结果是 13 。 main() unsigned short a=65536; int b;printf(“%dn”,b=a);(14) 若想通过以下

24、输入语句使 a=5.0,b=4,c=3,则输入数据的形式应该是 【14】 。int b,c; float a;scanf(“%f,%d,c=%d“,scanf(“a=%b,b=%d,答案:一、选择题01) A 02) C 03) B 04) C 05) B 06) A 07) D 08) A 09) C 10) C11) B 12) C 13) B 14) B 15) D 16) A 17) D 18) D 19) D 20) A21) B 22) A 23) C 24) C 25) D 26) C 二、填空题(1) 88(2) 2 20.000000(3) 10 30 0 (4) 11(5)

25、 25 21 37(6) n1=%dnn2=%d(7) -3(8) i=10,j=20(9) 261(10) 16(11) 2,1C 语言1212(12) 6.6(13) 0(14) 5.0,4,c=3(15) a=1,b=2水滴石穿 C语言之指针、数组和函数基本解释1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址) ;数组的本质则是一系列的变量。2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变” ,所以我们常用指针来操作动态内存。3、当数组作为函数的参数进行传递时,该数组自

26、动退化为同类型的指针。 问题:指针与数组听说 char a与 char *a 是一致的,是不是这样呢?答案与分析:指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。请看以下的例子:char a = “Hi, pig!“;char *p = “Hi, pig!“;上述两个变量的内存布局分别如下:数组 a 需要在内存中占用8个字节的空间,这段内存区通过名字 a 来标志。指针 p 则需要4 个字节的空间来

27、存放地址,这4个字节用名字 p 来标志。其中存放的地址几乎可以指向任何地方,也可以哪里都不指,即空指针。目前这个 p 指向某地连续的8个字节,即字符串“ Hi, pig!”。另外,例如:对于 a2和 p2,二者都返回字符i ,但是编译器产生的执行代码却不一样。对于a2,执行代码是从 a 的位置开始,向后移 动2两个字节,然后取出其中的字符。对于 p2,执行代码是从 p 的位置取出一个地址,在其上加2,然后取出对应内存中的字符。问题:数组指针C 语言1313为什么在有些时候我们需要定义指向数组而不是指向数组元素的指针?如何定义?答案与分析:使用指针,目的是用来保存某个元素的地址,从而来利用指针独

28、有的优点,那么在元素需要是数组的情况下,就理所当然要用到指向数组的指针,比如在高维需要动态生成情况下的多维数组。定义例子如下: int (*pElement)2。下面是一个例子: int array23 = 1,2,3,4,5,6;int (*pa)3; /定义一个指向数组的指针 pa = / /将打印 array00,即1 pa+; / 猜一猜,它指向谁? array1?对了!printf (“%d“, (*pa)0); / 将打印 array10,即4上述这个例子充分说明了数组指针一种指向整个数组的指针的定义和使用。需要说明的是,按照我们在第四篇讨论过的,指针的步进是参照其所指对象的大小的

29、,因此,pa+将整个向后移 动一个数组的尺寸,而不是仅仅向后移 动一个数组元素的尺寸。问题:指针数组有如下定义:struct UT_TEST_STRUCT *pTo2MAX_NUM;请分析这个定义的意义,并尝试说明这样的定义可能有哪些好处?答案与分析:前面我们谈了数组指针,现在又提到了指针数组,两者形式很相似,那么,如何区分两者的定义呢?分析如下:数组指针是:指向数组的指针,比如 int (*pA)5。指针数组是:指针构成的数组,比如 int *pA5。至于上述指针数组的好处,大致有如下两个很普遍的原因:a)、各个指针内容可以按需要动态生成,避免了空间浪费。C 语言1414b)、各个指针呈数组

30、形式排列,索引起来非常方便。在实际编程中,选择使用指针数组大多都是想要获得如上两个好处。 问题:指向指针的指针在做一个文本处理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本?答案与分析:首先,我们来分析文本的特点,文本的主要特征是具有很强的动态性,一行文本的字符个数或多或少不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然限制多多,缺乏灵活性。这种场合,使用指向指针的指针有很大的优越性。现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题:图示是一个指针数组。所谓动态性指横向(对应每行文本的字符个数)和纵向(对应整个文本的

31、行数)两个方向都可以变化。就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组,实现了横向动态性。就竖向而言,可以动态生成及扩展需要的指针数组的大小。下面的代码演示了这种动态数组的用途:/ 用于从文件中读取以 0结尾的字符串的函数extern char *getline(FILE *pFile);FILE *pFile;char *ppText = NULL; / 二维动态数组指针 char *pCurrText = NULL; / 指向当前输入字符串的指针ULONG ulCurrLines = 0;ULONG ulAllocedLines = 0;while (p = getline(

32、pFile)if (ulCurrLines = ulAllocedLines)/ * 当前竖向空间已经不够了,通过 realloc 对其进行扩展。ulAllocedLines += 50; / 每次扩展50行。 C 语言1515ppText = realloc (ppText, ulAllocedLines * (char *);if (NULL = ppText)return; / 内存分配失败,返回 ppTextulCurrLines+ = p; / 横向“扩展” ,指向不定长字符串 问题:指针数组与数组指针与指向指针的指针指针和数组分别有如下的特征:指针:动态分配,初始空间小数组:索引方

33、便,初始空间大下面使用高维数组来说明指针数组、数组指针、指向指针的指针各自的适合场合。多维静态数组:各维均确定,适用于整体空间需求不大的场合,此结构可方便索引,例 a1040。数组指针:低维确定,高维需要动态生成的场合,例 ax40。指针数组:高维确定,低维需要动态生成的场合,例 a10y。指向指针的指针:高、低维均需要动态生成的场合,例 axy。问题:数组名相关问题假设有一个整数数组 a,a 和int *p = 0;p = a; /* p 指向 a0所在的地方 */C 语言1616x = *p; /* x = a0 = 1*/p = /* 编译器会提示你错误,*/*显示整数指针与整数数组指针不一样 */问题:函数指针与指针函数请问:如下定义是什么意思:int *pF1();int (*pF2)(); 答案与分析:首先清楚它们的定义:指针函数,返回一个指针的函数。函数指针,指向一个函数的指针。可知:pF1是一个指针函数,它返回一个指向 int 型数据的指针。pF2是一个函数指针,它指向一个参数为空的函数,这个函数返回一个整数。 CSDN 声明:此消息系转载自 CSDN 合作媒体,其中细节未经 CSDN 证实,特此声明

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报