zoukankan      html  css  js  c++  java
  • C和指针 (pointers on C)——第五章:操作符和表达式

    第五章 操作符和表达式


    这一章假设没做过玩过单片机、汇编的话,读起来可能比較吃力,尤其是在移位运算符、位运算符应用上。另外多注意一下左值和右值的理解。


    总结:
    算术操作符、赋值操作符、关系操作符、条件操作符。
    短路求值(short-circuited evalution):如||这种二目操作符,假设它的左操作数是真,右操作数便不再求值。带来的后果是假设右操作数的数组下标不合法,那么也不会报错。
    C并不具备显式得布尔类型,布尔值是用整型表达式来表示的。在表达式中混用布尔值和随意的整型值可能会产生错误。要避免这些错误,每一个变量要么表示成布尔型,要么表示成整型,不可让它身兼两值。不要对整形变量进行布尔測试,反之亦然。
    C没有布尔,用整数取代。0为假,非0为真。
    所以有的人常常这样:
    #define FALSE 0
    #define TRUE 1
    ..
    if(flag == TRUE)...
    if(flag)...
    可是这样意义不大,假设flag设置为随意的整型值,那么第二对语句就不是等价的,仅仅有当flag确实是True或者False才有意义。
    因此假设flag你希望它来代表布尔值,就应该始终把它设置为0或者1。
    左值和右值(L-value和R-value),左值往往提供一个内存的位置,但并非一份拷贝。右值代表一个值,能够是一份拷贝。所以左值也能够是右值,可是右值不能成为左值。
    比方:
    a++ =b://wrong
    b =a++; //right
    a++并没有一个内存位置,有人会说a++必定会存在一个内存的位置,可是a++的结果是a的一份拷贝,其位置不certain。所以这个不是左值。
    不同类型之间的值须要转换才干操作。
    假设某个表达式过于依赖求值的顺序,那么应该尽力去避免,由于不同的编译器会产生不同的求值顺序,所以本质上表达式是不可移植的。


    警告:
    1、有符号值得右移位值操作时不可移植的。
    这对编译器是一个考验,全部无符号的右移同左移一样,他是可移植的,可是假设存在有符号位的右移位操作,假设符号位是1,右移的全是1,假设符号位是0,右移的全是0。
    2、移位操作的位数是个负值。
    3、连续赋值中各个变量长度不一。
    4、误用=而不是==进行比較。
    太easy错误了,所以仅仅要有逻辑表达式最好多看一便。
    5、误用|替代||,误用&替代&&
    位操作符,误用80%出错!
    6、在不同的用于表示布尔值的非零值之间进行比較。
    见上详述。
    7、表达式赋值的位置并不决定表达式计算的精度。
    8、编写结果依赖于求值顺序的表达式。
    见上!


    编程提示:
    1、尝试使用下面条件操作符替代if语句以简化表达式。
    这样带来的优势非常明显,当一个表达式过长的时候,?:;的组合降大大缩短长度。
    2、不要混用整型和布尔值。


    关于位操作符。。。。嗯嗯,以后有时间在关注它的应用。
  • 相关阅读:
    C#作为服务器端 MATLAB作为客户端 二者之间进行通信
    解决Socket通信中,经常遇到的问题——数据粘包的两种方法
    将之前的通信代码,以winform界面的形式写出来
    winform窗体程序之picturebox控件
    Socket通信
    Redis 高级教程 Redis 分区(6)
    Redis 高级教程 Redis 管道传输(5)
    Redis 高级教程 Redis 客户端连接(4)
    Redis 高级教程 Redis 基准(3)
    Redis 高级教程 Redis 安全(2)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4034963.html
Copyright © 2011-2022 走看看