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

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

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;

注:

         if( (x = y + 100) > 0)    z = x.   中 (x = y + 100)是表达式

         if( ( x = y + 100);> 0 )   z = x ;    x = y + 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 ++ )后自增(减)的优先级比一元的正负号高   

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 );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值