前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

刚初学C语言容易出错,看完这章你就知道该注意哪些问题了

qiguaw 2024-09-26 16:24:02 资源文章 25 ℃ 0 评论

对这方面感兴趣或者想学习C/C++可以加群:558502932,大家一起学习交流。

C语言的最大特点是功能强、使用方便灵活,其编译程序对语法检查并不像其他高级语言那么严格,这就给编程人员留下“灵活的余地”,但也是由于这个灵活给程序的调试带来了许多不便,尤其对初学者来说,经常会出一些连自己都不知道错在哪里的错误。现总结如下,供大家借鉴参考。

一、语法规则方面应注意的问题

1.书写标识符时,应注意大小写字母的区别。例:

main( )

{int a=3; printf ( "%d ", A);}

学生在学习C语言之前可能已学习或使用了其他的高级语言,在这些高级语言中,有些并不区分变量名的大小写。但在C语言中则认为大写字母和小写字母是两个不同的字符,如上例中被认为a和A是两个不同的变量名,且并不一定显示出错信息,但往往得出错误的结果。习惯上,用预处理定义的符号常量名应大写,如:#define A 10,以增加可读性。

2. 分号的使用。分号是C语句中不可缺少的一部分,语句末尾必须有分号。对于复合语句来说,最后一条语句中的分号也不能忽略,但复合语句的花括号后面不应再加“;”,否则将会画蛇添足。改错时,有时在被指出有错的一行中未发现错误,就需要看本行的上下行是否漏掉了分号。

3. 预处理命令和C语句的区别。预处理命令不是C语言本身的组成部分,也不是C语句。书写预处理命令时均以“#” 打头,末尾不应加分号。如果加了“;”号,编译发生错误,根据错误提示来查找这类错误,较难发现。

二、几个常用函数应用时应注意的问题

1. scanf函数

(1)scanf函数中的格式控制后面应当是变量地址,而不应是变量名。例如:如果a,b为整型变量,则:scanf(“%d,%d”,a,style_emoticons//cool.gif;是不对的,应该为 scanf(“%d,%d”,&&a,&&b)。

(2)如果在格式控制后面除了格式说明以外还有其他字符,则在输入时应输入与这些字符相同的字符。例如:scanf(“%d,%d”,&&a,&&b),输入时应用如下形式3,4 如果输入时不用逗号而用空格或其他字符都是不对的。

(3)当用scanf函数给一个字符数组赋值时,由于数组名代表数组的起始地址,因此地址参数应用数组名。

如:char str[10];scanf(“%s”,str); 而用scanf(“%s”,&&str)不对。

2. printf函数

(1)注意函数参数的求值顺序。例:

int i=2;printf(“%d,%d,%d”,i++,i++,i--);

该程序的结果很容易判断为2,3,3。但turbo c2.0在执行printf()函数时,参数自右向左依次压入栈中,即先压入i--参数的值,再压入第二个i++参数的值,最后将第一个i++参数的值压入;弹出时则依次为i++,i++,i--,因此结果为2,1,2。即turbo c2.0对参数的求值顺序是自右而左。若没有注意函数的求值顺序和++,--运算的前、后缀运算,甚至会感到结果莫名其妙。

(2)注意(i++)(i++)作为printf()输出项参数和作为赋值表达式一部分的区别。例如:

i=2;printf(“%d”,(i++)(i++));在此语句中先处理右边的(i++),即先用i的原值2,然后i自加,这时左边的(i++)的值就是3,进行23运算,故结果为6。而在下列例子中:

i=2;j=((i++)(i++));printf(“%d”,j);结果就不同了,先将原值i在取出来在整个表达式中应用,进行22运算,赋值给j,然后再执行两次自加操作,结果为4。

三、不同类型的数值型数据进行混合运算时应注意的问题

C语言中数值型数据进行混合运算时会自动进行类型转换,但可能因类型转换而产生误差或溢出的错误,这种错误往往容易被忽略而难于发现,这时需要强制进行类型转换以保证结果的正确性。两个相同类型的数值进行运算时,类型不变,而不同类型的数值进行运算时,先将位数短的数转换为位数长的数,再进行运算。特别地,两个整数进行加、减、乘、除运算时,结果仍为整数。下面看这个容易出错的简单例子。用公式π/4=1-1/3+1/5-1/7+……来求π时,如果用变量i(i的值为1,3,5,7……)来做分母,而分子为整型常数1,用这种方法1/i值为0,那么π的值求得为4,这显然不正确。为保证结果的正确性,累加语句应使用s=s+1.0/i或s=s+(float)1/i而不是s=s+1/i。

四、数组使用时应注意的问题

1. 定义数组时不能用变量。如

int n; scanf ("%d", &&n); int a [n];

数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。即不允许对数组的大小C作动态定义。

2. 引用数组元素时下标的值不要超过数组的范围。例如:a数组长度为5,下标值应控制在0~4范围内。这一点特别要注意,C编译不检查下标是否出界,如果引用了a[5],系统会把a[4]后面的单元内容作为a[5]引用,如果有赋值语句,如:a[5]=100;很可能会破坏数组以外的其他变量,造成严重后果。  五、引用指针变量时应注意的问题

引用指针变量前应先对它赋予确定值。例如下面的例子就出了问题:

swap(int p1,int p2)

{ int pp=p1p1=p2p2=p}

main()

{int a,b,q1q2;scanf(“%d,%d”,&&a,&&b);q1=&&a;q2=&&b;

swap(q1,q2);

printf(“

%d,%d”,a,style_emoticons//cool.gif;

}

程序原意是通过swap函数交换a,b的值,但输入2,8后运行结果为8,8;输入8,2后运行结果为2,2。a , b变量值并没有进行交换,原因是swap函数中的指针变量p无所指变量,只是把p2所指变量b值送入p1所指的变量a中。

希望这篇文章能对你们有所帮助,如果有什么需要补充的,希望可以在评论区多多指出。

想学习C/C++的可以加群:558502932,群内有大量C/C++学习资料,大家一起学习交流。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表