C语言中要注意的一些问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中要注意的一些问题
下面列出了一些C语言中常见的问题和注意事项,跟考试无关,有些表达不是很严格,仅供辅助学习。
1、C语言中规定,每条语句结束时末尾加分号,而不是每行末尾加分号!
2、在用scanf和printf函数输入和输出时,一定要记得int跟%d对应,long跟%ld对应,float
和double跟%f对应,否则不能正确输入和输出数据。
3、使用scanf函数时,在双引号中最好只出现各种格式控制符,如”%d%d%f%c”,而不要
随意增加其它字符,以免画蛇添足,增加输入的麻烦。
4、通过scanf(“%s”,字符数组名)和gets(字符数组名)都可以输入一个字符串,并将
其存储在指定的字符数组中。区别在于,前者当输入字符中遇到空格就认为输入结束,后者则可以接收包含空格的字符串。
5、在数值运算时,要注意防止数据的溢出。特别是int类型数值范围较小,比较容易溢出。
一旦溢出,结果出错。
6、要注意各种运算符的优先级,需要时可以加()来保证运算顺序满足要求。
7、参加关系和逻辑运算的数据可以是任意类型和任意值,计算机将所有非零数理解为1
(真),而0则为假,然后进行运算。得到的结果只有两种,要么是1,要么是0。
8、整数的比较可以使用关系运算;浮点型数据在比较是否相等时,一般这样实现
fabs(表达式或变量)<=1e-6
而字符串比较必须通过strcmp函数实现。
9、strcpy(字符数组1,字符数组2或字符串常量)的功能相当于
字符数组1=字符数组2或字符串常量(程序中绝对不能写成这样!)
10、变量和数组在定义时若未赋初值(未初始化),则其内容是随机数(不确定)。数组
若是部分初始化,则未指定初值的数组元素自动赋值为0(也可以理解为字符’\0’)
11、for循环非常常用,要注意后面括号中三个表达式的执行顺序。若非必要,最好不
要省略三个表达式。若循环体多于一条语句,必须用{}将它们括起来,变成语句块。(对于while和do..while循环也是这样)
12、数组元素是一个挨一个放在内存一片连续的空间中。对于多维数组,则采用行主序
组织存放。比如二维数组arr[M][N],看作有arr[0], arr[1], …, arr[M-1]个一维数组,每个一维数组有N个元素
arr[0][0], arr[0][1], …, arr[0][N-1] ←第0行
arr[1][0], arr[1][1], …, arr[1][N-1] ←第1行
...
arr[M-1][0], arr[M-1][1], …, arr[M-1][N-1] ←第M-1行
首先存放第0行元素,接着是第1行,……。
二维数组实际上也可以形象地看作一张二维表格。
13、单个数组元素就是一个独立的变量,只是访问时应该写成
数组名[下标]
下标可以是常量、变量或表达式(当然表达式的结果应该是整数),第一个数组元素下标必定为0。编译器不对下标越界(下标值超出数组定义的大小),须程序设计者自己保证。
14、若要逐个访问数组中的每个元素,一般通过循环(常用for)。一维数组用一重循环,
二维数组用二重循环,以此类推。比如对于二维数组arr[M][N]
for ( i=0; i 维数组的第i行*/ for( j=0; j 组的第j列*/ arr[i][j]=…; /*访问数组中的某个元素*/ 当然,调换一下,外循环控制列,内循环控制行也是可以的,完全看你的需要。 15、 函数 16、一个C程序可以由多个文件组成,每个文件包含若干个函数,其中只能有一个main 函数。各个函数可以相互调用,甚至自我调用(即递归调用),但不能调用main函数。 计算机一定从main函数开始执行(实际上就是操作系统调用main函数),最终在main 函数结束。 17、函数也有类型,称函数类型,实际上是指该函数返回值的类型。当确定一个函数没 有返回值时,最好指定函数类型为void,否则默认类型为int,容易造成误解。 18、函数调用和返回时,若类型不一致,计算机会做自动类型转换。例如: int fun( float a){ float x; …… return x; /*由于函数类型为int,而x是float,因此计算机自动将float转换为int,然后将结果送回主调函数(这里是main函数)*/ main(){ int a; long b; …… b=fun(a); /*实参a的类型为int,而形参类型为float,当实参赋给形参时,自动类型转换int float;当fun函数返回时,返回值为int,而b是long,赋值时又自动进行类型转换*/ 在实际应用当中,要注意高精度数据类型向的低精度数据类型转换时,可能造成精度损失甚 至数据溢出。 19、 无论如何,在函数调用时,实参将值赋给形参,也就是说,形参得到的是实参的复 制品,它们是互不相干的。任何时候都不要.. 企图通过改变形参的值而去影响实参的值!也许你会指出,我把数组名... 作为参数传递时,那调用函数后,数组的内容不是就发生变化了吗?不要有这样的误解!(详见第20点) 20、 习惯上,我们通常在文件的最开头进行函数的声明(也就是写出函数的原型),顺 序如下: 21、 在函数内部定义的变量称为“局部变量”,一般在函数最开始处统一定义,仅在本 函数内部有效;在函数外部定义的变量称为“全局变量”(或外部变量、全程变量),一般在文件最开始处定义,对于本文件中所有函数都有效,但尽量限制(少用)全局变量。当全局变量与局部变量同名时,在局部变量作用范围内,全局变量被屏蔽。 指针 22、 指针就是地址。若用一个变量来存储地址,那么这个变量称为指针变量。指针变量 也有类型。指针变量只能存放地址(指针),也就是说要么通过&运算符将某个变量(同类型的)的地址赋予指针变量,要么将另一个指针变量(同类型的)的值赋予它。例如下面的语句是正确的。 int a, *p, *q; p=&a; /*赋值后,我们称指针变量p 指向变量a*/ q=p; 23、 当定义了指针变量后,应明确给它赋值,否则该指针变量“悬空”,很容易导致程 序运行异常。这种情况在编译时会有警告,应当注意。 24、 假如某个函数中定义了一些变量, 希望通过调用另一个函数后这些变量的值发生变 假设这是一个 名称为abc.c 的 C 源程序文件