进来,让BUG远离你!

98 篇文章 3 订阅
10 篇文章 0 订阅

笔者从开始学习C语言到现在,经历过大大小小的BUG不计其数,今天就来给大家分享几种常见的BUG.

 

(1)书写标识符时,忽略大小写

main()

{

    int c=5;

    printf("%d",C);

}

编译程序会出错。C语言区分大小写。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。

(2)忽略变量类型,进行不合法运算

main()

{

    float a,b;

    printf("%d",a%b);

}

%是求余运算,得到a/b的整余数。整型变量可进行求余运算,而实型变量则不允许进行求余运算。

(3)将字符常量与字符串常量混淆

char a;

a="b";

字符常量是一对单引号括起来的常量,字符串常量是一对双引号括起来的常量。C语言规定以“\0”作为字符串结束标志,它是系统自动加上的,所以字符常量“b”其实包含两个字符'b' '\0',而把它赋给一个字符变量是不行的。

(4)忽略了“=”和“==”的区别

if(a==b)a=b;

C语言中,“=”是赋值运算符,“==”是关系运算符。在此代码中,前者是进行比较,后者是进行赋值。

(5)忘记加分号

c=1

b=2

几乎在所有编程语言中,都是用“;”代表一句或多句语句的结束。

(6)多加分号

{

    z=x/y;

    z=z%10;

    printf("%d",z);

};

if(a%2==0);

a+=a;

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

{

    a-=a;

    printf("%d",a);

}

(7)忘加地址运算符“&”

int a;

scanf("%d",a);

scanf函数的作用是:按照a在内存中的地址将a的值存进去。“&a”是指a在内存中的地址。

(8)输入数据的方式与要求不符

scanf("%a%b",&a,&b);

输入时不能用“,”将a,b隔开如:3,4;应该用空格

scanf("%a,%b",&a,&b);

此时应输入a,b 才是正确的

scanf("a=%d,b=%d",&a,&b);

此时应输入a=3,b=4

(9)输入字符的格式与要求不一致

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

scanf("%c%c%c",&c1,&c2,&c3);

如输入:a b c 字符“a”赋值给c1,字符“ ”赋值给c2,“b”赋值给c3。正确形式应输入:abc

(10)输入、输出的数据类型与所用格式说明符不一致

int a=1;

float b=1.2;

printf("%f%d",a,b);

这种错误要引起重视,编译器不会出现错误,但运行结果错误。

(11)输入数据时,规定精度

scanf("%6.2lf",&a);

输入数据时不能规定精度。

(12)switch语句中漏写break语句

switch(grade)

{

    case 'A':printf("90-100\n");

    case 'B':printf("75-89\n");

    case 'C':printf("60-74\n");

    case 'D':printf("<60\n");

    default:printf("put in error\n");

}

由于漏写了break语句,case只起标识的作用,而不起判断的作用。当grade的值为A时,程序会从上到下执行完,五个printf都输出。正确的写法应为:

switch(grade)

{

    case 'A':printf("90-100\n");break;

    case 'B':printf("75-89\n");break;

    case 'C':printf("60-74\n");break;

    case 'D':printf("<60\n");break;

    default:printf("put in error\n");break;

}

(13)忽视while和do-while语句区别

while语句

main()

{

    int a=0,i;

    scanf("%d",&i);

    while(i<=10)

    {

        a+=i;

        ++i;

    }

    printf("%d",a);

}

do-while语句

main()

{

    int a=0,i;

    scanf("%d",&i);

    do

    {

        a+=i;

        ++i;

    }while(i<=10);

    printf("%d",a);

}

当输入的i值小于等于10时,两者输出结果无区别。当输入的i大于10时,while语句不执行循环体,do-while语句执行一次循环题。因为while语句先判断后执行,do-while语句先执行后判断。

(14)忽略自增(自减)运算符的细节

第一个区别, i++ 返回原来的值,++i 返回加1后的值

main()

{

    int a=0,b=0,i;

    scanf("%d",&i);

    a=++i;

    --i;//保证i值没变化

    b=i++;

    print("a=%d,b=%d",a,b);

}

输出结果: a=i+1 b=i 。因为a=++i;是先把i加1再赋值给a,可以把此句分解为:i=i+1;a=i;;b=i++; 是先把i赋值给b再加1,可分解为:b=i;i=i+1; 。

第二个区别,i++ 不能作为左值,而++i 可以

左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。

int i = 1;

int *p1 = &(++i); //正确

int *p2 = &(i++); //错误

++i = 6; //正确

i++ = 8; //错误

(15)忽略sizeof()和strlen()的区别

char str[20]="Incredibly";

int  a=strlen(str); /* a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。 */

int  b=sizeof(str); /* b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响*/

(16)在定义数组时,将定义的“元素个数”误认为是可使用的最大下标

main()

{

    int a[5]={0,1,2,3,4};

    printf("%d",a[5]);

}

C语言中,定义时用a[5],表示a数组中有5个元素。其下标是从0开始的,数组中最后一个元素是a[4],不存在a[5]。

(17)定义数组时误用变量

int i;

scanf("%d",#i);

int a[i];//错

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

(18)地址运算符&使用错误

char str[8];

scanf("%s",&str);//错

C中,数组名代表地址。正确的应为:

char str[8];

scanf("%s",str);

(19)同时定义了形参和函数中的局部变量

int x,y,z;

int max(x,y)

{

    z=x>y?x:y;

    return z;

}

形参应在函数体外定义,而局部变量应在函数体内定义。正确的应为:

int x,y;

int max(x,y)

{

    int z;

    z=x>y?x:y;

    return z;

}

大家还有哪些常见的易错点呢,欢迎留言。另外,你如果感觉自学C/C++语言有困难的话,我本身是一个C/C++出身的程序员,我整理了一些学习C语言的视频在扣裙,大家有兴趣可以一起来学习,893,154,,226。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值