C 语言编程常见错误 1

2008-02-23 05:28:17来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

我对原文作了一定的修改,使之符合当今的 C 语言标准。假如原作者觉得不好的话,请跟帖告知,我将马上删除。谢谢!

1. 书写标识符时,忽略了大小写字母的区别。
int main( void )
{
int a = 5;
printf( "%d", A );

return 0;
}
编译器认为 a 和 A 是两个不同的变量名,而显示出错信息。C 语言规定大写字母和小写字母是不同的字符;而有些编程语言是不分大小写的。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。


2. 忽略了变量的类型,进行了不合法的运算。
int main( void )
{
float a, b;
printf( "%d", a % b );

return 0;
}
% 是求余运算符,a % b 的结果是 a 除以 b 的余数。只有 % 左右两边的操作数都是整型时,才能够进行求余运算。故而上面的程式是错误的,因为 a 和 b 是浮点型变量。


3. 将字符常量和字符串常量混淆。
char c;
c = "a";
这里就混淆了字符常量和字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C 语言规定以 \0 作字符串常量的结束标志,他是由系统自动加上的,所以 "a" 实际上包含两个字符:'a' 和 '\0'。所以把 "a" 赋给字符变量是不行的。


4. 忽略了“=”和“==”的区别。
许多高级语言都使用“=”符号作为关系运算符的“等于”。如 BASIC 程式中能够写:
if ( a = 3 ) then …
但 C 语言中,“=”是赋值运算符,“==”才是关系运算符。如:
if (a == 3)
a = b;
a == 3 是比较 a 是否等于 3;而 a = b; 表示把 b 的值赋给 a。初学者往往会把 a == 3 错写成 a = 3,这样写是符合语法的,但是不符合我们的期望。假如错写成了 a = 3,有些编译器会给出警告。


5. 忘记加分号。
分号是 C 语句中不可缺少的一部分,语句末尾必须有分号。
a = 1
b = 2;
编译时,编译器发现“a = 1”后面没有分号,就会报错。改错时,假如在编译器所说的有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。


6. 多加分号。
{
z = x y;
t = z / 100;
printf( "%f", t );
};
上面代码中,大括号 } 后面的分号(;)是毫无必要的!因为单独一个 ; 也是合法的 C 语言语句,所以 } 后面写了 ; 也是合法的,但是毫无必要!又如:
if ( a % 3 == 0 );
i ;
程式员的本意是假如 3 整除 a,则 i 加 1。但由于 if ( a % 3 == 0 ) 后加了分号,则 if 语句到此结束。不论 3 是否整除 a,程式都会执行 i ; 语句。再如:
for ( i = 0; i < 5; i ) ;
{
scanf( "%d", &x );
printf( "%d", x );
}
程式员的本意是先后输入 5 个数,每输入一个数后再将他输出。但由于for () 后加了一个分号,循环体变为空语句 ; 。空语句 ; 执行 5 次后,下面的程式块才开始执行,导致的结果是只能输入一个数并输出他。


7. 使用 scanf 函数时忘记加取址运算符“&”。
int a, b;
scanf( "%d %d", a, b );
这样写是错误的!应该改成 scanf( "%d %d", &a, &b );


8. 输入数据的方式和需要不符。
scanf( "%d %d", &a, &b );
输入时,不能用逗号作两个数据间的分隔符。例如:3, 4 。而要使用空格、回车或 tab 键作为分隔符。例如:3 4 。假如我们想用逗号(,)来做分隔符,能够这样写:
scanf( "%d,%d", &a, &b );
此时不用逗号而用空格或其他字符是不对的。例如:3:4 。又如:
scanf("a=%d,b=%d",&a,&b);
输入应如以下形式:
a=3,b=4


9. 输出的数据类型和所用格式说明符不一致。
例如,a 定义为整型,b 定义为浮点型
int a = 3;
float b = 4.5;
printf( "%f%d\n", a, b );
编译时不给出出错信息,但运行结果将和原意不符。这种错误尤其需要注意。应该改成:
printf( "%d%f\n", a, b );


10. 输入数据时,企图规定精度。
scanf( "%7.2f", &a );
这样做是不合法的,输入数据时不能规定精度。


11. switch 语句中漏写 break 语句。
例如:根据考试成绩的等级打印出百分制数段。
switch ( grade ) {
case 'A':
printf( "85~100\n" );
case 'B':
printf( "70~84\n" );
case 'C':
printf( "60~69\n" );
case 'D':
printf( "<60\n" );
default:
printf( "error\n" );
由于漏写了 break 语句,当 grade 值为 A 时,printf 函数在执行完第一个语句后会接着执行第二、三、四、五个 printf 函数语句。正确写法应在每个分支后再加上“break;”。例如:
case 'A':
printf( "85~100\n" );
break;


12. 忽视了 while 和 do-while 语句在细节上的区别。
(1) int main( void )
{
int a = 0, i;

scanf( "%d", &i );
while ( i <= 10 ) {
a = i;
i;
}
printf( "%d", a );

return 0;
}

(2) int main( void )
{
int a = 0, i;

scanf( "%d", &i );
do {
a = i;
i;
} while ( i <= 10 );
printf( "%d", a );

return 0;
}
能够看到,当输入 i 的值小于或等于 10 时,二者得到的结果相同。而当 i>10 时,二者结果就不同了。因为 while 循环是先判断后执行,而 do-while 循环是先执行后判断。对于大于 10 的数 while 循环的循环体一次也不执行,而 do-while 语句则要执行一次。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 语言编程常见错误 2

下一篇: C 代码优化一(C 使用者必读)