一些容易出错的优先级的问题
优先级问题 表达式 经常误认为的结果 实际结果 .的优先级高于*,->操作符可以用于解决这个问题 *p.f引用操作 p所指对象的字段f(*p).f 对p取f偏移,作为指针,然后进行接触 [ ]高于* int*ap[ ] ap是个指向int数组的指针int(*ap)[ ] ap 是个元素为int指针的数组int*(ap[]) 函数()高于* int *fp() fp是个函数指针,所指函数返回int int(*fp)[ ] fp是个函数,返回int * int*(fp()) 逗号表达式中,i在遇到每个逗号后,认为本计算单位已经结束,i这个时候自加。
int x;
int i = 3;
x = (++i, i++, i+10);
其结果:i = 5, x = 15.后缀运算符是在本计算单位计算结束后再自加或自减。
3.使用位操作可以减少除法和取模的运算,一般的位操作是用来控制硬件的或进行数据变换,但是,灵活的位操作可以有效的提高程序的运行的效率。
//方法一
int i, j;
i = 257/8;
j = 456 % 32;
//方法二
inti,j;
i = 257 >> 3;
j = 456 - (456 >> 4 << 4);
上述的两个方法的效果一样,但是方法二的效率高,原因是方法一调用了取模函数和除法函数,既有很多汇编代码和寄存器参与运算,但是方法二只是几句相关的汇编。所以对于以2的为指数次方“*”、“/”、“%”因子的数学运算,转化为移位运算“<<”、“>>”、通常可以提高算法效率。
4.逻辑运算符 : ||与&&(与按位运算符 |和&是完全不同的)
int i = 0;
int j = 0;
if((++i>0)||(++j>0))
{
//打印i和j的值。
}
结果是i=1; j=0;
逻辑运算符||两边的条件只要有一个为真,其结果就为真的.if((++i>0))||(++j>0))
的语句中,先计算(++i>0)
,发现其结果为真,后面的(++j>0)
便不再计算。同样&&运算符也是这种情况。