<c和指针>学习笔记3之操作符,表达式与指针

1 操作符

(1)移位操作符

  左移<<:值最左边的几位丢弃,右边多出来的几个空位用0补齐

    01101101

   011(丢弃)01101000(后面三位补0)

  右移>>:

    算术左移和逻辑左移只有操作数是负值的时候才不一样。算术移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均位1,符号为0则移入的位均为0,因为这样可以保证原来数的正负不变。

    10010110右移2位,逻辑移位为00100101,算术移位11100101

案例1:

 1 //计算1的位的个数
 2 int count_one_bits(unsigned value)
 3 {
 4     int ones;
 5     for(ones=0;values!-0;value=value>>1)
 6     {
 7           if(value%2!=0)
 8           {
 9                 ones=ones+1;
10           }
11     } 
12     return ones; 
13 }        
View Code

(2)赋值

  赋值操作符的结合性是从右到左,也就是

    a=x=y=3<==>a=(x=y=3)

(3)单目运算符

  sizeof是运算符,用来求操作数的类型长度,单位位字节。

  前++  表达式的值是操作数增加后的值

  后++  表达式的值是操作数增加前的值

a = b=10

c=++a// a增加到了11 c等于11

d=b++ //b增加到了11 d仍然为10

(4)逻辑操作符(&& ||)

  位操作符和逻辑操作符很容易混淆,逻辑操作符具有短路效应,意思是如果有两个条件,前面条件一旦满足,后面就直接不看了,它是用于测试零值和非零值。而位操作符是比较对应的位。

a=1 b=2

if(a&&b)为真

if(a&b)为假

(5)条件操作符

  expre1?expre2:expre3

  首先计算expre1,如果为真,那么整个表达式值为expre2,不会去执行expre3.如果expre1为假,那么整个表达式的值为expre3,不会求expre2.

(6)逗号操作符

  表达式从左到右逐个求值,整个逗号表达式的值是最后那个表达式的值。

2 指针

(1)内存和地址

主要是知道这两件事:

  内存中的每个位置由一个独一无二的地址标识

  内存中的每个位置都包含一个值

(2) 指针 间接访问和变量

  *&a=25=====》把25赋值给a

  &操作符产生变量a的地址,指针常量,接着*访问其操作数所表示的地址

(3)指针的指针

  int a =10;

  int *b=&a;

  c=&b;那么c的类型是什么,怎么声明

    int **c;相当于int *(*c) *操作符是从右向左结合

(4)指针表达式

char ch='a';

char *cp=&ch;

*cp+1----->'b' *的优先级高于+

*(cp+1)----->ch后面的一个字符,再取值,理论上可以作为右值和左值,但是此处没有定义ch后面是什么。

*cp++----->后缀++优先级高于*

++*cp----->通常可用于数组的遍历 先取得cp的值然后往后移动

(*cp)++---->首先执行间接操作,结果是ch增值前的原先值

++*cp++----->从右往左结合,首先++cp,然后对这个值进行间接操作,然后执行++

    

原文地址:https://www.cnblogs.com/lanjianhappy/p/10604324.html