C语言编程常见错误_第1页
C语言编程常见错误_第2页
C语言编程常见错误_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、 PAGE PAGE 9C 语言编程常见错误2008-12-08 12:49书写标识符时,忽略了大小写字母的区别。int main( void )int a = 5;printf( %d, A );return 0;a 和 AC量名用大写,变量名用小写表示,以增加可读性。忽略了变量的类型,进行了不合法的运算。int main( void )float a, b;printf( %d, a % b );return 0;,a % b 的结果是 a 除以 ba 和 b浮点型变量。将字符常量与字符串常量混淆。char c; c = C 语言规定以 0a0a 赋给字符变量是不行的。忽略了“=”与“=”

2、的区别。许多高级语言都使用“=”符号作为关系运算符的“等于”。如 BASIC程序中可以写:if ( a = 3 ) then 但 C 语言中,“=”是赋值运算符,“=”才是关系运算符。如:if (a = 3)a = b;a = 3a 是否等于 3;而 a = b;b 的值赋给 a。初学者往往a = 3a = a = 3,有些编译器会给出警告。忘记加分号。分号是 C 语句中不可缺少的一部分,语句末尾必须有分号。a = 1b = 2;编译时,编译器发现“a = 1”后面没有分号,就会报错。改错时,如果在编译器所说的有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。6. 多加分号。z = x

3、 +y;t = z /100;printf(%f, t );上面代码中,大括号 后面的分号(;)是毫无必要的!因为单独一个 ; 也是合法的 C 语言语句,所以 后面写了 ; 也是合法的,但是毫无必要!又如:if ( a % 3 = 0 );i+;程序员的本意是如果 3 整除 a,则 i 加 1if ( a % 3 = 0 ) 后加if3 是否整除 i+;再如:for ( i = 0; i 5; i+ ) ;scanf( %d, &x );printf( %d, x );程序员的本意是先后输入 5for后加了一个分号,循环体变为空语句 ; 。空语句 ; 执行 5 次后,下面的程序块才开始执行,导

4、致的结果是只能输入一个数并输出它。使用 scanf 函数时忘记加取址运算符“&”。int a, b;scanf( %d %d, a, b );这样写是错误的!应该改成 scanf( %d %d, &a, &b );输入数据的方式与要求不符。scanf( %d %d, &a, &b );4tab4隔符,可以这样写:scanf( %d,%d, &a, &b );此时不用逗号而用空格或其它字符是不对的。例如:3:4 。又如:scanf(a=%d,b=%d,&a,&b);输入应如以下形式:a=3,b=4例如,a 定义为整型,bint a = 3; float b = 4.5;printf( %f%dn

5、, a, b );该改成:printf( %d%fn, a, b );输入数据时,企图规定精度。scanf( %7.2f, &a );这样做是不合法的,输入数据时不能规定精度。switchbreak 语句。例如:根据考试成绩的等级打印出百分制数段。switch ( grade ) case A:printf( 85100n case B:printf( 7084n case C:printf( 6069n case D:printf( 60n );default:printf( errorn );breakgrade 值为 A 函数在执行完第一个语printf后再加上“break;”。例如:c

6、ase A:printf( 85100n );break;忽视了 while 和 do-while 语句在细节上的区别。int main( void )int a = 0, i;scanf( %d,&i);while ( i =10) a +=i;+i;printf( %d, a );return 0;int main( void )int a = 0, i;scanf( %d, &i ); do a += i;+i; while ( i = 10 ); printf( %d, a );return 0;i 的值小于或等于 10时,二者结果就不同了。因为 while 循环是先判断后执行,而 d

7、o-while 循环是先执行后判断。对于大于 10 的数 while 循环的循环体一次也不执行,而do-while定义数组时误用变量。int n = int an;C99C99C99上面的代码不能通过编译。在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。int main( void )int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;printf( %d, a10 );return 0;Ca10,则表示数组 a 有 10 个元素,其下标值范09a10a10崩溃!在不应加地址运算符 & 的位置加了地址运算符。char *s100;scanf( %99s

8、, &s );C一个地址了,我们不需要再对它进行取址运算。正确的写法应该是:scanf( %99s, s );16.从 AlgolPascal 和 C率要高于比较,因此为其分配更短的符号。此外,C 可以多重赋值(如 abc),并且可以将赋值嵌入到一个大的表达式或者语句中。这种便捷导致了一个xy :if ( x = y )foo();y 的值赋值给 x跳过空格、制表符和换行符的循环:while ( c = | c = t | c = n ) c = getc(f);t 进行比较的地方程序员错误地使用了 =,而不是=。这个“比较”实际上是将t 赋给 c(新的t为零,所以这个“比较”一直为真,因此这

9、是一个死循环。一些编译器会对形如 e1e2告信息,应显式给出比较符。也就是将:if ( x = y )foo();改写为:if ( ( x = y ) != 0 ) foo();多字符符号一些 C/*C/* 、/ 和 * 时,它必须决定是将这两个字符识别为两个符号还是一个单独的符号。C 语言标准规定: /y 的值设置为x 的值除以 p 所指向的值:y = x/*p/* p 指向除数 */;实际上,因为 /* 是注释符开始标记,因此编译器会简单地“吞噬”程序文本, 直到 */ 出现为止。换句话说,这条语句仅仅把 y 的值设置为 x 的值,而根本没有看到 p。我们应该将这条语句改为:y = x /

10、 *p/* p 指向除数 */;或者:y = x / (*p)/* p*/;else考虑下面的程序片断:if ( x = 0 )if ( y = 0 )error();else z = x + y; f(&z);0 x0y0,error(zelseif 相关联。上面那段代码其实等价于:if ( x = 0 ) if ( y = 0 )error();else z = x + y; f(&z);x0成:if ( x = 0 ) if ( y = 0 )error(); else 表达式求值顺序z = z + y; f(&z);一些运算符以一种已知的、特定的顺序对其操作数进行求值。但另一些则不是。

11、例如下面的表达式:a b & c dCa ba 确实小于 b,c d以计算整个表达式的真假性。但如果 a 大于或等于 b,则 cda b 求值时,到底是先取 a 的值,还是先取 b 的值,标准并没有定义。C(&|& 和 |先对左边的操作数进行求值,而右边的操作数只有在需要的时候才进行求值。到底应该求中间的操作数的值,还是求最右边的操作数的值。逗号运算符(,) 的求值顺序为从左到右。C赋值运算符也没有对求值顺序做出任何保证。x 中的前 n 个元素复制到数组 y方法是不可行的:j = 0;while ( j n )yj = xj+;因为标准没有保证 yj 在 j 增长之前被求值。到底 yj 先求值

12、,还是xj+ 先求值是依赖编译器的!所以我们不应该这么写!另一种方案基于同样的原因也不可行:j = 0;while ( j n )yj+ = xj;下面的代码才是正确的:j = 0;while ( j n ) yj = xj;j+;当然,也可以这么写:for ( j = 0; j n; j+ )yj = xj;&、|C 规定 01 表示“真”0& 和 | 运算符如果可以通过左边的操作数确定整个表达式的真假性,就不会对右边的操作数进行求值。!10 返回 0,因为 1010&1210 和 12 的值都不是 |12 也是 10 非1210:10 | f() 中的 f() 也不会被求值。下标从零开始C 语言中,一个具有 n 个元素的数组中没有下标为 n 的元素,元素的下标是从 0 到 n-1。下面的程序可能会崩溃:int i, a10;for ( i = 1; i = 10; i+ ) a = 0;应该改成:int i, a10;for ( i = 0; i 10; i+ )a = 0;getc

温馨提示

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

评论

0/150

提交评论