《C和指针》学习小记(5)

这篇笔记写于20号下午两点,应该是连续上班的23天。预计还会继续上班10天。等这YP结束,一定得给自己放上一天的假。
上一阵子帮导师忙完项目申报,最近得闲,却不知怎么今天心中烦躁,丝毫看不进去论文,只好来这里码码字,避免自己摸鱼被抓。


这一章讲的是操作符与表达式


移位操作符
**左移位:**值最左边的额几位被丢弃,右边多出来的几个空位则由0补齐。
**右移位:**右移位的情况较为特殊,可以分为逻辑移位与算数移位。逻辑移位,直接使用0来填充。算术移位的填充数则有原数值最左边的数字决定。
举个例子:10010110右移两位,逻辑移位结果是00100101.算术移位结果为11100101。
这里需要重视的是,采用逻辑或算术移位取决于编译器。一个程序一旦使用了有符号数的右移位操作,便不可移植
效果不可预测


复合操作符
以+=为例
这种操作符的优势在于只对左侧操作数求值一次,效率更高。
例如:

a[2*(y-f(x))] = a[2*(y-f(x))]  +1;
a[2*(y-f(x))]  += 1;

在第一种格式中,用于选择增值位置的表达式必须书写两次,由于编译器无从知道函数F是否具有其他作用,所以必须两次计算其值,使得程序效率变慢。


单目操作符
&操作符产生它的操作数的地址。比如,声明了一个整型变量与一个指向整型变量的指针,接着,使用&操作符去变量的地址,并把它赋值到指针变量

int a,*b;

b= &a;

*操作符是间接访问操作符,与指针搭配使用,用于访问指针所指向的值。在上面的例子中,表达式b的值是变量a的地址,而表达式*b的值则是变量a的值。
sizeof操作符判断它的操作数的类型长度,以字节为单位表示。
(类型)操作符被称为强制类型转换符,用于把表达式的值转换到指定的类型。
++操作符与–操作符:这两种操作符都有前缀形式与后缀形式。
当使用前缀形式时,表达式的值就是操作数增加或减少后的值。
当使用后缀形式时,表达式的值就是操作数增加前的值。
上述两种情况下,操作数都被执行操作,结果相同。


逻辑操作符
条件操作符:接受三个操作符,控制子表达式的求值顺序。

expression1?expression2:expression3

首先计算expression的值,若值为真,则整个表达式的值就是expression2的值,不会对表达式3进行求解;反之,则整个表达式的值为expression3。


C中不具备显式的布尔类型,零是假,任何非零值皆为真,所以在判断某变量的布尔值时,不要通过把它与任何特定的值进行比较来测试整个变量是否为真值,哪怕是TRUE或者FALSE。


左值与右值
左值表示了一个可以存储结果值的地址,右值指定了一个值。当计算机计算时,结果必定会保存在机器的某个地方,但程序员无法预测结果存储的 位置。

int  a ,*pi;

pi =&a;
*pi=20;

指针pi的值是内存中特定位置的地址,*操作符使机器指向那个位置。当他作为左值使用时,这个表达式指定需要进行修改的位置。当它作为右值使用时,它就提取当前存储于这个位置的值。


就这些,其他的内容涉及优先级及溢出的情况就不在此赘述了。

猜你喜欢

转载自blog.csdn.net/Wangwenshuaicsdn/article/details/127426720