C 语言的最大特色是:效能强、使用方便灵活。 C
编写翻译的顺序对语法检查并不象别的高端语言那么严苛,那就给编制程序人士留下 “
灵活的余地 ” ,但照旧由于这些灵活给程序的调治带来了不菲辛勤,越发对初学
C
语言的人的话,日常会出一些连本人都不驾驭错在哪个地方的错误。看着有错的主次,不知该如何改起,本人通过对
C 的读书,积存了有个别 C 编制程序时常犯的荒谬,写给各位学员以供参谋。

刚学C语言那会儿,什么人没碰着过一点小麻烦呢,平日吭哧吭哧写了半天,结果不能够落到实处?why?重返去二个一个反省,眼睛都抽筋了,终于搜索了罪魁祸首!!!今后记住了,这几个周围的荒唐不能够犯,再不要耗费时间耗力耗眼睛了
~(^o^)/~

  1. 书写标记符时,忽视了大大小小写字母的分别。
    main()
    {
    int a=5;
    printf(“%d”,A);
    }
    编写翻译程序把 a 和 A 以为是多个不等的变量名,而显得出错信息。 C
    感到大写字母和小写字母是五个例外的字符。习贯上,符号常量名用大写,变量名用小写表示,以充实可读性。

01

  1. 忽视了变量的项目,举行了非法的演算。
    main()
    {
    float a,b;
    printf(“%d”,a%b);
    }
    % 是求余运算,拿到 a/b 的整余数。整型变量 a 和 b
    能够拓宽求余运算,而实型变量则分化意开展 “ 求余 ” 运算。

挥洒标记符时,忽视了尺寸写字母的区分。

  1. 将字符常量与字符串常量混淆。
    char c;
    c=”a”;
    在这里处就混淆了字符常量与字符串常量,字符常量是由风度翩翩对单引号括起来的单个字符,字符串常量是大器晚成对双引号括起来的字符类别。
    C 规定以 “” 作字符串截至标识,它是由系统活动抬高的,所以字符串 “a”
    实际上包蕴三个字符: ‘a’ 和 ‘’ ,而把它赋给叁个字符变量是丰裕的。

main()

  1. 忽略了 “=” 与 “==” 的区别。
    在超级多高等语言中,用 “=” 符号作为关系运算符 “ 等于 ” 。如在 BASIC
    程序中得以写
    if (a=3) then …
    但 C 语言中, “=” 是赋值运算符, “==” 是涉嫌运算符。如:
    if (a==3) a=b;
    前端是进行比较, a 是不是和 3 相等,前者表示即使 a 和 3 相等,把 b 值赋给
    a 。由于习于旧贯难题,初读书人往往会犯那样的荒诞。

{

  1. 忘掉加分号。
    支行是 C 语句中不得缺点和失误的生龙活虎部分,语句末尾必须有分店。
    a=1
    b=2
    编写翻译时,编写翻译程序在 “a=1” 后边没觉察分号,就把下风流倜傥行 “b=2”
    也作为上大器晚成行语句的意气风发局部,那就能够并发语法错误。改错开上下班时间,不时在被提出有错的风流倜傥行中未开采错误,就须要看一下上风流倜傥行是还是不是漏掉了子集团。
    { z=x+y;
    t=z/100;
    printf(“%f”,t);
    }
    对于复合语句来讲,最终贰个话语中最后的分集团没办法忽略不写 ( 那是和 PASCAL
    区别的 卡塔尔 。

int a=5;

  1. 多加分号。
    对此三个复合语句,如:
    { z=x+y;
    t=z/100;
    printf(“%f”,t);
    };
    复合语句的花括号后不应再加分号,不然将会适得其反。
    又如:
    if (a%3==0);
    I++;
    本是就算 3 整除 a ,则 I 加 1 。但出于 if (a%3==0卡塔尔(قطر‎ 后多加了分店,则 if
    语句到此甘休,程序将实施 I++ 语句,无论 3 是或不是整除 a , I 都将自动加 1

    再如:
    for (I=0;I<5;I++);
    {scanf(“%d”,&x);
    printf(“%d”,x);}
    本意是程序输入 5 个数,每输入三个数后再将它输出。由于 for(State of Qatar后多加了二个分店,使循环体变为空语句,这时候只得输入三个数并出口它。

printf(“%d”,A);

  1. 输入变量时忘记加地址运算符 “&” 。
    int a,b;
    scanf(“%d%d”,a,b);
    那是非法的。 Scanf 函数的效能是:遵照 a 、 b 在内存的地址将 a 、 b
    的值存进去。 “&a” 指 a 在内部存款和储蓄器中的地址。

}

  1. 输入数据的情势与必要不符。 ① scanf(“%d%d”,&a,&b卡塔尔;
    输入时,不能够用逗号作多少个数据间的分隔符,如上边输入非法:
    3 , 4
    输入数据时,在三个数据里面以一个或四个空格间距,也可用回车键,跳格键 tab

    ② scanf(“%d,%d”,&a,&b);
    C 规定:假如在 “ 格式调节 ”
    字符串中除了格式表达以外还恐怕有任何字符,则在输入数据时应输入与这一个字符相似的字符。上面输入是合法的:
    3 , 4
    当时毫不逗号而用空格或其余字符是异形的。
    3 4 3 : 4
    又如:
    scanf(“a=%d,b=%d”,&a,&b);
    输入应如以下方式:
    a=3,b=4

编写翻译程序把a和A以为是多个例外的变量名,而显得出错新闻。C以为大写字母和小写字母是四个不等的字符。习于旧贯上,符号常量名用大写,变量名用小写表示,以扩张可读性。

  1. 输入字符的格式与要求不等同。
    在用 “%c” 格式输入字符时, “ 空格字符 ” 和 “ 转义字符 ”
    都作为有效字符输入。
    scanf(“%c%c%c”,&c1,&c2,&c3);
    如输入 a b c
    字符 “a” 送给 c1 ,字符 “ ” 送给 c2 ,字符 “b” 送给 c3 ,因为 %c
    只要求读入三个字符,前边无需用空格作为八个字符的间距。

02

  1. 输入输出的数据类型与所用格式表明符不等同。
    例如说, a 已定义为整型, b 定义为实型
    a=3;b=4.5;
    printf(“%f%dn”,a,b);
    编写翻译时不付出出错音信,但运维结果将与本意不符。这种不当越来越要求注意。

概况了变量的等级次序,举行了不合规的运算

  1. 输入数据时,图谋规定精度。
    scanf(“%7.2f”,&a);
    如此做是非法的,输入数据时不能够分明精度。

main()

12.switch 语句中漏写 break 语句。
比方:根据考试成绩的阶段打字与印刷出百分制数段。
switch(grade)
{ case ‘A’:printf(“85~100n”);
case ‘B’:printf(“70~84n”);
case ‘C’:printf(“60~69n”);
case ‘D’:printf(“<60n”);
default:printf(“errorn”);
鉴于漏写了 break 语句, case 只起标号的作用,而不起推断功能。由此,当
grade 值为 A 时, printf
函数在施行完第贰个语句后任何时候施行第二、三、四、七个 printf
函数言语。正确写法应在种种分支后再加上 “break;” 。比如
case ‘A’:printf(“85~100n”);break;

{

  1. 不经意了 while 和 do-while 语句在细节上的区分。
    (1)main()
    {int a=0,I;
    scanf(“%d”,&I);
    while(I<=10)
    {a=a+I;
    I++;
    }
    printf(“%d”,a);
    }
    (2)main()
    {int a=0,I;
    scanf(“%d”,&I);
    do
    {a=a+I;
    I++;
    }while(I<=10);
    printf(“%d”,a);
    }
    能够见到,当输入 I 的值稍差于或等于 10 时,二者拿到的结果生龙活虎律。而当
    I>10 时,二者结果就分裂了。因为 while 循环是先剖断后进行,而 do-while
    循环是先实行后决断。对于超出 10 的数 while 循环一遍也不推行循环体,而
    do-while 语句则要举行三遍循环体。

float a,b;

  1. 概念数组时误用变量。
    int n;
    scanf(“%d”,&n);
    int a[n];
    数组名后用方括号括起来的是常量表明式,可以回顾常量和标志常量。即 C
    不许对数组的高低作动态定义。

printf(“%d”,a%b);

  1. 在概念数组时,将定义的 “ 成分个数 ” 误认为是可使的最大下标值。
    main()
    {static int a[10]={1,2,3,4,5,6,7,8,9,10};
    printf(“%d”,a[10]);
    }
    C 语言规定:定义时用 a[10] ,表示 a 数组有 10 个因素。其下标值由 0
    开端,所以数组成分 a[10] 是不设有的。

}

  1. 起先化数组时,未使用静态存储。
    int a[3]={0,1,2};
    如此这般开首化数组是不对的。 C 语言规定唯有静态存款和储蓄 (staticState of Qatar 数组和外界存储(exterm卡塔尔(قطر‎ 数组本领开端化。应改为:
    static int a[3]={0,1,2};

%是求余运算,得到a/b的整余数。整型变量a和b能够开展求余运算,而实型变量则不一致敬实行“求余”运算。

  1. 在不应加地址运算符 & 的地点加了地址运算符。
    scanf(“%s”,&str);
    C 语言编写翻译系统对数组名的拍卖是:数组名代表该数组的发轫地址,且 scanf
    函数中的输入项是字符数组名,不供给再加地址符 & 。应改为:
    scanf(“%s”,str);

豆蔻梢头旦你想学习C/C++能够来以此群,首先是三三零,中间是八五九,最终是七六六,里面有恢宏的读书材质能够下载。

  1. 再者定义了形参和函数中的局地变量。
    int max(x,y)
    int x,y,z;
    {z=x>y?x:y;
    return(z);
    }
    形参应该在函数体外定义,而有的变量应该在函数体钦赐义。应改为:
    int max(x,y)
    int x,y;
    {int z;
    z=x>y?x:y;
    return(z);
    }

03

将字符常量与字符串常量混淆。

char c;

c=”a”;

在那就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是风流罗曼蒂克对双引号括起来的字符类别。C规定以“”作字符串甘休标记,它是由系统活动抬高的,所以字符串“a”实际上包括八个字符:‘a’和‘’,而把它赋给壹个字符变量是不行的。

04

忽略了“=”与“==”的区别。

在无数高等语言中,用“=”符号作为涉及运算符“等于”。如在BASIC程序中得以写

if (a=3) then …

但C语言中,“=”是赋值运算符,“==”是事关运算符。如:

if (a==3) a=b;

前端是进展相比,a是不是和3相等,前者表示风姿罗曼蒂克旦a和3相等,把b值赋给a。由于习于旧贯难点,初读书人往往会犯这样的错误。

05

忘掉加分号。

支行是C语句中不得缺点和失误的生机勃勃部分,语句末尾必需有分店。

a=1

b=2

编写翻译时,编写翻译程序在“a=1”后边没觉察分号,就把下生龙活虎行“b=2”也作为上生机勃勃行语句的后生可畏有的,那就能够现身语法错误。改错开上下班时间,一时在被建议有错的黄金时代行中未开采错误,就要求看一下上风流洒脱行是或不是漏掉了分集团。

{

z=x+y;

t=z/100;

printf(“%f”,t);

}

对此复合语句来讲,最后贰个话语中最终的分行无法忽略不写(那是和PASCAL分歧的卡塔尔国。

06

多加分号。

对于贰个复合语句,如:

{

z=x+y;

t=z/100;

printf(“%f”,t);

};

复合语句的花括号后不应再加分号,不然将会多此一举。又如:

if (a%3==0);

I++;

本是风流浪漫旦3整除a,则I加1。但由于if
(a%3==0卡塔尔国后多加了根据地,则if语句到此甘休,程序将推行I++语句,无论3是不是整除a,I都将活动加1。再如:

for (I=0;I<5;I++);

{

scanf(“%d”,&x);

printf(“%d”,x);

}

本意是程序输入5个数,每输入贰个数后再将它输出。由于for(卡塔尔国后多加了三个子企业,使循环体变为空语句,那时候只可以输入三个数并出口它。

07

输入变量时忘记加地址运算符“&”。

int a,b;

scanf(“%d%d”,a,b);

这是非法的。Scanf函数的效益是:依据a、b在内部存款和储蓄器的地址将a、b的值存进去。“&a”指a在内部存款和储蓄器中的地址。

08

输入数据的法子与须要不符。

①scanf(“%d%d”,&a,&b);

输入时,不可能用逗号作五个数据间的分隔符,如上面输入违法:

3,4

输入数据时,在多个数据里面以一个或四个空格间距,也可用回车键,跳格键tab。

②scanf(“%d,%d”,&a,&b);

C规定:假若在“格式调节”字符串中除了格式表明以外还应该有此外字符,则在输入数据时应输入与这个字符肖似的字符。上边输入是法定的:

3,4

那时并不是逗号而用空格或任何字符是难堪的。

3 4 3:4

又如:

scanf(“a=%d,b=%d”,&a,&b);

输入应如以下方式:

a=3,b=4

09

输入字符的格式与需要不等同。

在用“%c”格式输入字符时,“空格字符”和“转义字符”都用作有效字符输入。

scanf(“%c%c%c”,&c1,&c2,&c3);

如输入a b c

字符“a”送给c1,字符“
”送给c2,字符“b”送给c3,因为%c只必要读入三个字符,后边无需用空格作为三个字符的区间。

10

输入输出的数据类型与所用格式表达符分裂。

比方,a已定义为整型,b定义为实型

a=3;b=4.5;

printf(“%f%dn”,a,b);

编写翻译时不交付出错新闻,但运维结果将与本意不符。这种错误越来越需求小心。

11

输入数据时,酌量规定精度。

scanf(“%7.2f”,&a);

这样做是非法的,输入数据时不可能鲜明精度。

12

switch语句中漏写break语句。

举例:遵照考试成绩的品级打字与印刷出百分制数段。

switch(grade)

{

case ‘A’:printf(“85~100n”);

case ‘B’:printf(“70~84n”);

case ‘C’:printf(“60~69n”);

case ‘D’:printf(“<60n”);

default:printf(“errorn”);

}

是因为漏写了break语句,case只起标号的职能,而不起决断功用。由此,当grade值为A时,printf函数在实践完第三个语句后继之推行第二、三、四、四个printf函数语句。正确写法应在各类分支后再加上“break;”。比如

case ‘A’:printf(“85~100n”);break;

13

忽视了while和do-while语句在细节上的分化。

(1)main()

{

int a=0,I;

scanf(“%d”,&I);

while(I<=10)

{a=a+I;

I++;

}

printf(“%d”,a);

}

(2)

main()

{

int a=0,I;

scanf(“%d”,&I);

do

{a=a+I;

I++;

}while(I<=10);

printf(“%d”,a);

}

可以见见,当输入I的值稍差于或等于10时,二者拿到的结果同样。而当I>10时,二者结果就分裂了。因为while循环是先决断后推行,而do-
while循环是先奉行后剖断。对于当先10的数while循环三遍也不推行循环体,而do-while语句则要推行叁回循环体。

14

概念数组时误用变量。

int n;

scanf(“%d”,&n);

int a[n];

数组名后用方括号括起来的是常量表达式,能够回顾常量和符号常量。即C不容许对数组的分寸作动态定义。

15

在概念数组时,将定义的“成分个数”误认为是可使的最大下标值。

main()

{

static int a[10]={1,2,3,4,5,6,7,8,9,10};

printf(“%d”,a[10]);

}

C语言规定:定义时用a[10],表示a数组有拾叁个因素。其下标值由0开首,所以数组成分a[10]是海市蜃楼的。

16

在不应加地址运算符&的地点加了地方运算符。

scanf(“%s”,&str);

C语言编写翻译系统对数组名的管理是:数组名代表该数组的开首地址,且scanf函数中的输入项是字符数组名,无需再加地址符&。应改为:

scanf(“%s”,str);

17

同时定义了形参和函数中的局地变量。

int max(x,y)

int x,y,z;

{

z=x>y?x:y;

return(z);

}

形参应该在函数体外定义,而有的变量应该在函数体内定义。应改为:

int max(x,y)

int x,y;

{

int z;

z=x>y?x:y;

return(z);

}

正文来源论坛bbs.cnitedu.cn,转发请注解出处。