《C语言参悟之旅》-读书笔记(二)

来源:互联网 发布:淘宝刷流量 猎流 编辑:程序博客网 时间:2024/04/30 02:35

                                                             第三章  运算符、表达式和语句

1.在表达式中使用(   )是一种很好的编程方式能大大提高程序的可读性如:

           标准C中对很多运算符的求值顺序都没有进行明确规定,实现顺序与具体实现有关( 编译环境)

                                                                       -a +b / 2 - c * 5

           是先求 b / 2还是 c * 5 取决于具体实现(虽然此处先求那个都不会影响表达式的值,但有些情况下表达式的求值顺序可能会对表达式的值产生影响)

           比较好的做法是

                                                                      (-a +b / 2 )- c * 5

           该表达式会严格按照上述步骤来求值

2.算数运算符

      /

      1)当两个运算对象都为整数时,运算符' / '会通过舍弃小数部分的方法截取结果 1/2的结果不是0.5,而是0

      2)如果两个运算对象中有一个是负数,那么除法的结果可能是向上取整,也可能是向下取整(与编译器有关)

 

              

                                          

     %                            

      1)两个运算对象都必须是整数

      2)x % y的符号与具体的实现有关

    

    =

      1)

           x = y = z = 100;                     等效于               x = ( y = ( z= 100));( 右结合 )

          在变量说明的时候:

          不允许给多给变量连续赋初值,如下面是错的:

          int a = b = c =100;

          应该写成:

         int  a = 100, b = 100, c = 100;

      2)避免写出这样的表达式

              int  x = 10;

              y = ( x +1 ) - ( x = 2 )

              如果从左向右算结果为9; 如果从右向左算结果为1

3.类型转换

   1)两个float型数参加运算,虽然他们的类型相同,但仍然先转换为double型再进行运算,运算结果也为double

            long + int一起运算也要先转换为long,然后在进行运算,运算结果也为long

            unsigned  int  + int 要先转换成 无符号整数在进行运算,结果也是无符号整数(-10会转换成一个很大的整数)

   2) char型和int

     int型数值赋给char,只保留其最低8位,高位部分舍弃

     char型数值赋给int型变量,一些编译器不管其值大小都当作整数处理,而另一些编译软件在char的值大于127,就作为负数处理

  3) 防止溢出(隐藏的自动转换)

          

在VS中并没有报错,我猜想是编译器做了一定的处理了,正常情况下i * i的结果也应该是short型的,结果为short型的,short放不了那么大的数,会溢出

4.自增自减运算符

   1)避免一个表达式中对同一个变量的多次使用自加、自减运算符:
       ( i++ ) + ( i-- ) + ( i++ )           这样写的话表达式的求值顺序不确定(取决于编译器 )

 

       比较合适的做法:

           i++;

           i- -;

           i++;

   2)printf(" %d%d", ++i, i++);         有的编译器的求值顺序是从左到右,有的是从右到左  

          比较合适的做法:

          printf( "%d", ++i ) ;

          prinft(" %d", i++ );

   3) - - -i 相当于-(- - i)前自增(减)和一元的正负号的优先级相同,是右结合

      - j + + 相当于 - ( j ++ )后自增(减)的优先级比一元的正负号高   

   4)*iter++等效于 *(iter++) //后自增(减)的优先级比一元的正负号高

        *- -iter等效于*(- -iter)  前自增自减优先级和*、是一样的是右结合

5 .逻辑运算中的“短路”运算

6 .位运算

   1)最快地实现2的3次方:

         使用左移运算符"  << "左移两位

         左移时:右端补0,高位移出的部分舍弃;

注:

    如果左端移出的部分含有有效二进制数1,这个特性就会消失(实现最快速度的乘2操作 )

   2)  右移运算符   >>    

        右移时:右端移出的部分舍弃,左端的数有两种情况

        I :对于无符号和正整数,高位补0,对于负整数,高位补0还是补1取决于具体实现;有的系统是补0

     

逻辑右移:

       

 II: 有的系统是高位补1,

   算术右移:

 

3 )按位与      &

      z = x & y;

      常用在: 方便实现清零或取某个位(如网络地址) 

3 )   按位或       |

         z = x | y;

  4) 按位异或    ^        口诀:"相同为0,不同为1"

         z = x ^ y;

        常用在数据加密中
       

 5) 按位取反

       z = ~ x;

7 sizeof 

   sizeof( i + 1 )等价于 sizeof( i );