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语句*/
}
这样也会方便去阅读