2.7  类型转换
(1) 当运算符两端的操作数类型不一致时,一般的,"narrower"转向"wider"
(2) 字符转换函数
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
        int intResult = atoi("123");         //convert s to int
        long longResult    = atol("123456789"); //convert s to long
        double doubleResult    = atof("43.57"); //convert s to double
        printf("%d %ld %lf\n", intResult, longResult, doubleResult);
        return 0;
}
(3) 在赋值时  i = c;
(4) 函数参数传递时,一般在函数原型定义中,char 用int, float用double
(5) 显式 强制类型转换 (type-name) expression
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
        srand(3);                 //set seed, 默认为1
        int r = rand();    //产生伪随机数
        printf("%ld %d\n",RAND_MAX, r);
        return 0;
}

2.8 递增和递减运算符 ++ --
(1)可前可后
      x = n++   x = ++n  有区别,x的值不同

2.9  位运算符
#include <stdio.h>
#include <stdlib.h>
/*
按位与&, 当两者中都为1时,result中该位为1
按位或|,当两者中至少有一位为1时,result中对应位为1
按位异或^,当两者相异时,result中对应位为1 // 与1异或得相反
按位取反~ 单目运算符
<< 左移运算符    a<<2,相当于扩大4倍
>> 右移运算符    对无符号数,左边补0;对有符号数,一般补符号位
*/

int main(int argc, char** argv) {
        int a = 0542;
        int b = 0177;
        printf("a & b = %o\n", a & b);// 按位与&,截取一部分位,其他mask掉为0

        int c = 05;
        int d = 02;
        printf("c | d = %o\n", c | d); //按位或,把该位打开
        return 0;
}

2.10 赋值运算符和表达式
(1) + - * / % << >> & ^ |
int bitcount(unsigned x){
     int b;
     for(b = 0; x != 0; x >>= 1)
             if(x & 01)
                     b++;

     return b;
}

2.11 条件表达式 ? :
for(i = 0; i < n; i++)
    printf("%6d%c", a[i], (i%10==9 || i ==n-1)? '\n':' ');

printf("you have %d item%s.\n", n, n==1 ? "" : "s");
 

2.12 运算符优先级