C语言常见的陷阱与缺陷

  • Post author:
  • Post category:其他


1、=不等同于==

在刚接触c语言的时候,这属于是初学者常见的错误。

=是赋值符;==是关系运算符。·

当我们在使用if判断语句的时候,初学者很容易犯的一个错误,就是把if(x==1)写成if(x=1)这样写时编译器并不会报错,因为后者会被解析为把1赋值给x,然后再拿x的值去判断真假,也就是if(1)然后被判断为真,我们通常会耗费大量精力去寻找这个bug。所以我们可以通过一些办法去避免这个bug。

当我们在使用if语句时,把if(x==1)改为if(1==x)。这是一个好的编码习惯,因为赋值操作符只能从右向左赋值,如果我们把==写为=时也就是if(1=x)会因为左值是常数无法赋值而报错,我们就能很容易的找出这个错误。

2、八进制数的缺陷

我们知道在一个整数前面前导0x会被解析为十六进制数,在一个整数前面前导0会被解析为八进制数,我们都知道八进制数中遇到8就会进位也就是正常情况下不会出现8,9这两个数字,但是有些编译器会把8,9这两个数也作为八进制的数字进行处理

0195的含义是

1*8^2+9*8^1+5*8^0=141(十进制)

我们要在编程中去注意这个情况

3、运算符的优先级问题

如果我们要把一个整数hi向左移位4位,再加上一个整数low时我们很自然就会这样写。

r = hi<<4 + low;

但是很可惜这是一个错误的代码。因为+的运算优先级是要高于移位运算符的。所以,实际上的运算变成了

r = hi<<(4 + low);

运算符优先级

运算符的优先级有一个非常好记得一个规则算数>移位>关系>逻辑。单目>双目>三目。

但是这也只是大概的规律,要准确地记住每个运算符的优先级还是非常困难的,所以我们在进行编写代码时,就要避免这种复合的语句,这样的语句虽然会省出代码行数,但是会很容易出现错误,而且会给后来读代码的人造成很大的困难,得不偿失。

我们要把这些符合的语句拆开写就可以避免很多麻烦的错误。

hi<<=4;

r = hi + 4;

或者r = (hi<<4) + low;

这样去避免出现这样的错误,也能提高代码的可读性。

4、switch语句

switch(color)

{

case 1:printf(“yellow”);break;

case 2:printf(“red”);break;

case 3:printf(“blue”);break;

}

这就是我们平时使用switch语句的形式。也就是说当color=2时,编译器输出的是red。

但是当我们把break去掉。也就是这样。

switch(color)

{

case 1:printf(“yellow”);

case 2:printf(“red”);

case 3:printf(“blue”);

}

这是当color=2时,编译器输出的是redblue,因为没有了break语句,所以在case2进入之后并没有跳出switch语句,然后输出了blue。

这个可以是看作是c语言的一个特性,因为这样的设计并不全是坏处,可能会因为缺少break造成一些问题,但是也可以通过这样的特性写出其他语言没法进行的特殊操作。也就是在程序员在特意的省去这样一个break时,会达成一种特殊的运算结果。但是我推荐大家在使用这种方法时一定要在后面加上注释。

switch (x)

{

case 1:printf(”hello”);

/*此处没有break语句*/

}

这样也会方便去阅读



版权声明:本文为dghehe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。