c语言程序结构和语法规则_第1页
c语言程序结构和语法规则_第2页
c语言程序结构和语法规则_第3页
c语言程序结构和语法规则_第4页
c语言程序结构和语法规则_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

C 语言程序结构和语法规则 一、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 的值 */ 程序运行结果: 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 的值返回给 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)由一个且只能有一个 main()函数和若干个其他函数结合而成,如图1-1(b)所示。 其中,自定义函数由用户自己设计。 图1-1 C 语言程序结构示意图 结合以上示例,可以看出 C 语言程序结构有以下基本特点: (1)C 语言程序是由函数(如:main 函数和 max 函数) 组成的,每一个函数完成相对 独立的功能,函数是 C 语言程序的基本模块单元。 main 是函数名,函数名后面的一对圆括 号“()”是用来写函数的参数的。参数可以有,也可以没有(本程序没有参数) ,但圆括号 不能省略。 (2)一个 C 语言程序总是从 main()函数开始执行。主函数执行完毕,程序执行结束。 (3)C 语言编译系统区分字母大小写。 C 语言把大小写字母视为两个不同的字符,并 规定每条语句或数据说明均以分号(;)结束。分号是语句不可缺少的组成部分。 (4)主函数 main()既可以放在 max()函数之前,也可以放在 max()函数之后。习惯上, 将主函数 main()放在最前面。 (5)C 语言程序中所调用的函数,既可以是由系统提供的库函数,也可以是由设计人 员自己根据需要而设计的函数。例如,在【例1.2】中,printf() 函数是 C 语言编译系统库函 数中的一个函数,它的作用是在屏幕上按指定格式输出指定的内容;max() 函数是由用户自 己设计的函数,它的作用是计算两个数中的较大值。 二、C 语言程序的书写规则 (1)C 源程序是由一个主函数和若干个其它函数组成的。 (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 max(int x, int y) return( xy ? x : y ); main() int num1,num2; C 语言 3 3 printf(“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:6 Input the second integer number:9 max=9 运算符与优先级、表达式 一、运算符 运算符包括下面这些类型: 1、算术运算符(,*,):依次为加,减,乘,除,求余数。除 最后两种是单目运算符外,其它几种都是双目运算符。前四种运算较简单,不再展开叙述, 最后三种运算的定义如下: Op1 op2 表示: oPlint(oP1op2)*op2,其中 ina(a)表示取 a 的整数部分(a 的小数 部分总非负)。 Op+ 表示 op = op +1; Op- 表示 op = op -1; 2 关系运算符(,=, ,) 依次为取反,按位与,按位或,按位异 或,右移位,左移位,无符号右移位 5 赋值运算符() 赋值操作符,它将等号右边数据的值赋值给左边的变量。 6 条件运算柠(?:) 条件运算符为三目运算符,其“般格式为:ab?a:b 7 扩展运算符(十, * , /= ,|,) 扩展运算符都是由一个双目运算符和一个等号连在一起组成(注意它们之间不能用空格隔开), 以“+”为例说明这类扩展运算符的用法: A += B; 表示 A A+B 其它类似。 8 其他运算符,如豆号运算符“, ”,分量运算符“ ”。再如实例运算符“instanceof” ,内存分配运算符“new” ,强制类型转换运算符“(类型)” , 方法调用运算符“()” ,取数组元素运算符“ ”。 比如,设 t 是类 Thread 的一个实例。 分量运算符:tname 表示类的实例的调用,又叫点问, (意指通过点的操作符访问类的实 例对象) 二、运算符的优先级 优先顺序依次为(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=789 B)m=123 n=456 p=789 C 语言 5 5 C)m=123,n=456,p=789 D)123 456 789 (2) 有以下程序 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,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.5 C) 1 65 1.0 6.5 D) 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,以下选项中正确的输入语句是 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 语言 7 7 (12) 以下程序段的输出结果是 int a=1234; printf(“%2dn“,a); A) 12 B) 34 C) 1234 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.0 22 33 C) 10.0 D) 10 22 22.0 33.0 33 (15) 有如下程序 main0 int y=3,x=3,z=1; printf(“%d %dn”,(+x,y+),z+2); 运行该程序的输出结果是 A) 3 4 B) 4 2 C) 4 3 D) 3 3 (16) 下列程序执行后的输出结果是(小数点后只写一位) A) 6 6 6.0 6.0 B) 6 6 6.7 6.7 C) 6 6 6.0 6.7 D) 6 6 6.7 6.0 main() 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) #define 是 C 语句,而 printf 不是 C) printf 是 C 语句,但#define 不是 D) #define 和 printf 都不是 C 语句 (18) 以下程序的输出结果是 A) 17,021,0x11 B) 17,17,17 B) 17,0x11,021 D) 17,21,11 main( ) int k=17; printf(“%d,%o,%x n“,k,k,k); (19) 以下叙述中正确的是 A) 输入项可以是一个实型常量,如: scakf(“%f“,3.5); B) 只有格式控制,没有输入项,也能正确输入数据到内存,例如: scakf(“a=%d,b=%d“); C) 当输入一个实型数据时,格式控制部分可以规定小数点后的位数,例如: 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 型变量,x=100,y=200,且有下面的程序片段: printf(“%d“,(x,y); 上面程序片段的输出结果是 A) 200 B) 100 C) 100 200 D) 输出格式符不够,输出不确定的值 (23) 请读程序: #include main() 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=8765 C) a=98, b=765.000000, c=4321.000000 C 语言 9 9 D) 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,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) 65 B) 20 C) 15 D) 10 main() 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(“%d %fn“,n,x); (3)以下程序运行时若从键盘输入:10 20 30。输出结果是 . #include main() 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.n2); 要求按以下格式输出 n1和 n2的值,每个输出行从第一列开始,请填空。 n1=10 n2=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=0 a+=(a=8); printf(“%dn“,a); C 语言 11 11 (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) 若想通过以下输入语句使 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) C 11) B 12) C 13) B 14) B 15) D 16) A 17) D 18) D 19) D 20) A 21) 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 21 37 (6) n1=%dnn2=%d (7) -3 (8) i=10,j=20 (9) 261 (10) 16 (11) 2,1 (12) 6.6 (13) 0 (14) 5.0,4,c=3 (15) a=1,b=2 水滴石穿 C语言之指针、数组和函数 基本解释 1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址) ;数组的本质则是一 系列的变量。 2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可 以改变。指针可以随时指向任意类型的内存块,它的特征是“可变” ,所以我们常用指针来操作动态内存。 3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 问题:指针与数组 听说 char a与 char *a 是一致的,是不是这样呢? 答案与分析: 指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由 于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定 的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。请看以下的例子: char a = “Hi, pig!“; char *p = “Hi, pig!“; 上述两个变量的内存布局分别如下: 数组 a 需要在内存中占用8个字节的空间,这段内存区通过名字 a 来标志。指针 p 则需要4 个字节的 空间来存放地址,这4个字节用名字 p 来标志。其中存放的地址几乎可以指向任何地方,也可以哪里都不 指,即空指针。目前这个 p 指向某地连续的8个字节,即字符串“ Hi, pig!”。 另外,例如:对于 a2和 p2,二者都返回字符i ,但是编译器产生的执行代码却不一样。对于 a2,执行代码是从 a 的位置开始,向后移 动2两个字节,然后取出其中的字符。对于 p2,执行代 码是从 p 的位置取出一个地址,在其上加2,然后取出对应内存中的字符。 问题:数组指针 C 语言 13 13 为什么在有些时候我们需要定义指向数组而不是指向数组元素的指针?如何定义? 答案与分析: 使用指针,目的是用来保存某个元素的地址,从而来利用指针独有的优点,那么在元素需要是数组的 情况下,就理所当然要用到指向数组的指针,比如在高维需要动态生成情况下的多维数组。 定义例子如下: 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 上述这个例子充分说明了数组指针一种指向整个数组的指针的定义和使用。 需要说明的是,按照我们在第四篇讨论过的,指针的步进是参照其所指对象的大小的,因此,pa+ 将整个向后移 动一个数组的尺寸,而不是仅仅向后移 动一个数组元素的尺寸。 问题:指针数组 有如下定义: struct UT_TEST_STRUCT *pTo2MAX_NUM; 请分析这个定义的意义,并尝试说明这样的定义可能有哪些好处? 答案与分析: 前面我们谈了数组指针,现在又提到了指针数组,两者形式很相似,那么,如何区分两者的定义呢? 分析如下: 数组指针是:指向数组的指针,比如 int (*pA)5。 指针数组是:指针构成的数组,比如 int *pA5。 至于上述指针数组的好处,大致有如下两个很普遍的原因: a)、各个指针内容可以按需要动态生成,避免了空间浪费。 b)、各个指针呈数组形式排列,索引起来非常方便。 在实际编程中,选择使用指针数组大多都是想要获得如上两个好处。 问题:指向指针的指针 在做一个文本处理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本? 答案与分析: 首先,我们来分析文本的特点,文本的主要特征是具有很强的动态性,一行文本的字符个数或多或少 不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然 限制多多,缺乏灵活性。这种场合,使用指向指针的指针有很大的优越性。 现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题: 图示是一个指针数组。所谓动态性指横向(对应每行文本的字符个数)和纵向(对应整个文本的行数) 两个方向都可以变化。 就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组,实现了横向动态性。 就竖向而言,可以动态生成及扩展需要的指针数组的大小。 下面的代码演示了这种动态数组的用途: / 用于从文

温馨提示

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

评论

0/150

提交评论