您的位置:首页 > 编程语言 > C语言/C++

初学C语言时在语法和语义上容易犯的一些错误

2017-10-08 16:12 387 查看

简述

本文记录了我在初学C语言时常犯的一些错误。

正文

1.switch-case语句中忘了break

这是初学者非常容易犯的错误,本质上我们需要理解的一点是:由众多case组成的列表是标签(label)列表,case只是提供了所要执行的语句序列的一个“入口”而非“房间”,case本身并不提供“离开”switch-case语句的作用,因此在每一个case引导的语句(包括复合语句)之后都应该有一个
break;
语句(除非有其他需要利用这一特性的程序结构)。

2.调用scanf函数时,在参数表中忘了“&”符号

许多人(包括我自己)都有这样一种思维习惯:既然printf中是直接填入变量名的,那么scanf中也应该是这样,一个输出,一个输入,刚好对应。

我们需要理解以下几点:

首先,不像一些早期语言一样,对于C语言,调用函数的时候,传入的参数都是值而不是变量本身(即使用了指针变量,也只是传入了指针变量的值,亦即它所指的变量的地址,我们通过这种方式来“写”这个被指向的变量,但实际上我们并没有实际把这个变量传进函数里面)。

其次,对一个变量使用“&”符号,意思是对这个变量“取得地址”,也就是得到这个变量实际上放在内存的哪个位置。

理解了上面这两点,就可以理解下面这段话了:

printf只需要得到变量的值就可以输出(仔细想想,你只需要知道这个变量的值是多少就能完成输出,而完全不需要去了解这个变量本身放在内存的哪个位置),而scanf需要做的是把从output stream中读到的值“写入”这个变量,也就是你必须知道这个变量“本身”被放在哪里了(不然你把东西写在哪?),所以必须要用到它的地址,也就是要用到“&”符号。

3.关系表达式(包括使用了逻辑运算符)中要表达“相等”关系时,用了“=”而非“==”

我想大多数人犯的最多的一个错误不外乎这个吧,毕竟数学上的确如此。但在C语言的世界里,“=”代表赋值,“==”代表相等关系,我们总得找个办法区别这两个家伙吧。

更让人恼火的是,这样写基本上都不会得到IDE的报错信息,甚至于编译时也是如此,因为这本身就不是一个语法上的error,而是一个语义上的歧义。每个表达式本身都代表了一个值,赋值表达式的值即右值本身,而关系表达式的值为布尔值0或1,巧的是,在C语言中布尔值本身也代表了一个数字(0或1),这就造成了像
if ( number = 10 ) {...}
这样的语句也不会被认为是一个错误,因为关系表达式的值就是一个数字,10又何尝不是呢?

但在像java这样的语言中,布尔值就只是true或者false了。

4.在语句后面忘了加分号

emmmm….多打代码吧,打多了一般都会形成肌肉记忆的,这样你想不加都不行了。

5.使用toupper函数时认为它会改变原始参数

ctype.h里的这个函数至少让我在初学的时候用错了好几遍,但是回头想想,我都没有传地址给它,它怎么可能改变了我在外面的变量的值呢。。。

6.写好一个函数并且已经调用了它之后,发现这个函数需要修改,结果声明、定义和调用这三个地方没有改全

没用过Visual Studio,但是如果这样做了估计它像Eclipse一样会有错误提示吧(?)。

反正只要记住:一个函数有声明、调用和定义三个部分,而且调用还可能不只一次,就好了。

7.需要进行连续比较时使用类似
a>b>c
的写法

计算机一次只执行一个操作,即先执行a>b这一比较,得到一个布尔值0或1,然后再将其与c做比较,这显然不是我们想要执行的动作,正确的做法应该是
a>b && b>c


8.if、while的执行体为复合语句时没有加上大括号

我的建议是:即使只有一条待执行的语句,也养成写大括号的好习惯,这样做了之后,将来需要在这条语句之后再添加其他语句时还不需要另外去添加大括号,提高了代码的可维护性。

最后

指针很重要。。。

总结

多做总结,多打代码,相比其他语言,C语言可能相对无趣,但是反正都是要学的,不如先打好基础。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言