c语言基础学习避坑指南:新手常犯的10个错误解析

admin C语言 4


刚开始学 C 语言的朋友,是不是总遇到这种情况?代码看着明明没问题,一运行就报错;或者不报错,但结果跟预想的差十万八千里。其实啊,这些问题大多是新手都会踩的坑,今天兔子哥就总结 10 个最常见的错误,一个个给你说清楚,看完保准能少走不少弯路。
一、分号和括号,小错误大麻烦
最基础也最容易犯的,就是漏写分号或者括号不配对。比如写 if 语句:
if (a> b)
printf ("a 大");
看着没问题吧?可要是后面加个 else,编译器就会报错。因为 if 后面没加大括号,else 不知道跟哪个 if 配对。
还有啊,for 循环里的分号也容易出错。比如 for (i=0;i<10;i++) 后面多写个分号,循环体就变成空的了,程序跑起来啥也不做。该怎么办呢?兔子哥建议写完代码后,先检查一遍分号和括号,尤其是复杂语句,宁愿多打几个括号,也别省那点事。
二、变量没定义就用,编译器可不惯着
新手常犯的就是直接用变量,忘了先定义。比如写 int main (){a=5; printf ("% d",a);},这里的 a 没定义成 int 型,编译器肯定报错说 “a 未声明”。
还有变量类型搞混的,比如把 float 当 int 用。int a=3.14; 这样写,a 的值会变成 3,小数部分直接丢了,算出来的结果能对吗?所以啊,用变量前一定先定义,并且想好它该是什么类型。
三、scanf 用不对,输入数据全白搭
很多人用 scanf 的时候,总忘记加取地址符 &。比如 scanf ("% d",a); 正确的应该是 scanf ("% d",&a); 少个 &,程序就没法正确读入数据,有时候还会崩溃。
格式控制符也容易错,比如用 % d 读 float 型变量,或者用 % f 读 int 型。输入的时候格式不对,数据就会乱套。兔子哥教你个办法,写 scanf 的时候,先写格式控制符,再对照变量类型加 &,比如 int a; 就写 scanf ("% d",&a); 这样不容易错。
错误用法正确用法错误原因
scanf("%d",a);scanf("%d",&a);少了取地址符 &
scanf("%d", &b);scanf("%f", &b);格式符与变量类型不匹配

四、数组下标从 1 开始?你错了!
C 语言的数组下标是从 0 开始的,比如 int arr [5],有效下标是 0 到 4,不是 1 到 5。新手常写成 for (i=1;i<=5;i++){arr [i]=i;},这样 arr [5] 就越界了,程序可能会崩溃,也可能输出奇怪的数。
还有定义数组时,用变量当长度。比如 int n=5; int arr [n]; 这在 C99 标准里才允许,很多编译器不支持,最好写成 #define N 5; int arr [N]; 或者用动态分配。
五、字符串处理,忘了结束符 '\0'
字符串其实是字符数组,结尾必须有 '\0'。比如 char str [5]={'h','i'}; 这样的字符串,打印的时候可能会多出一堆乱码,因为没加 '\0'。应该写成 char str [5]={'h','i','\0'}; 或者直接用字符串常量 "hi",它会自动加结束符。
用 strlen 计算长度的时候,也是算到 '\0' 为止。要是没这个结束符,算出来的长度就不对,还可能导致数组越界。


六、循环条件写错,停不下来或提前结束
for 循环的条件很关键,比如想循环 10 次,写成 for (i=0;i<10;i--),i 一开始是 0,减 1 变成 - 1,永远小于 10,循环就停不下来了,最后栈溢出。
while 循环也一样,条件里的变量忘了更新。比如 while (i<10){printf ("% d",i);} 里面没写 i++,i 一直是初始值,循环永远不结束。这种错误编译器不报错,但运行起来就麻烦,得靠自己仔细检查循环条件和变量变化。
七、if 语句后面瞎加分号
这个错误太隐蔽了。比如 if (a == b); {printf ("相等");} 这里 if 后面多了个分号,不管 a 和 b 相不相等,都会打印 “相等”。因为分号把 if 的语句块变成空的了,后面的大括号跟 if 没关系了。
所以啊,写 if 的时候,分号别乱加,尤其是语句块用大括号的情况,先把条件和大括号对齐,再写里面的代码。
八、函数声明和定义对不上
函数声明的参数类型、个数,必须和定义一致。比如声明 int add (int a, float b); 定义却写成 int add (int a, int b){...},调用的时候就会出错。
还有函数返回值,声明成 int 型,定义里却没 return,或者 return 一个 float 型的值。这种错误有时候编译器只会警告,但运行结果肯定不对。
九、指针没初始化,变成野指针
定义指针后直接用,比如 int *p; *p=5; 这时候 p 指向哪里都不知道,可能修改了重要内存的数据,程序会莫名其妙崩溃。应该先让 p 指向一个已定义的变量,比如 int a; int *p=&a *p=5;
释放动态分配的内存后,也别再用那个指针。free (p); 之后 p 就成了野指针,最好加一句 p=NULL; 这样再用的时候能及时发现错误。
十、注释用错,把代码注释掉了
用 /* / 注释的时候,很容易把不该注释的代码包进去。比如:
/
这是注释
int a=5;
/
这里的 int a=5; 就被注释掉了,程序里 a 没定义,肯定报错。尤其是注释多行代码时,要仔细检查开头和结尾的 /
*/ 是不是配对,别把后面的有效代码也圈进去。


最后兔子哥说点心得。这些错误看着都不大,但新手就是容易犯。我刚开始学的时候,因为漏写分号,找了半个小时才发现,现在想起来还觉得好笑。其实啊,犯错不可怕,关键是每次错了要记下来,弄明白为什么错,下次就不会再犯了。代码写多了,对这些坑就敏感了,慢慢就会形成 “条件反射”,写的时候自然会避开。希望这篇指南能帮到你,有啥踩坑的经历,也可以留言跟我说说。

标签: 十万八千里 有时候

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~