c语言让人又爱又恨操作符

c和指针: c被许多人所诟病的一个缺点就是它品种繁多的操作符。c的这个特点使它很难精通。另一方面,c的许多操作符具有其他语言的操作符无可抗衡的价值。

可以看出操作符是c很重要的一部分。

算数操作符

+      -         *        /       %    

加减乘除,如果你学过数字电路的话,那就会清楚的知道,计算机在是怎么实现的。如果没的话,也不影响你灵活的使用他们。
注意:%(取模)操作符,必须两边都要是整数

移位操作符

 >>      <<     

左移:左移一位,右边补0;
c语言让人又爱又恨操作符
右移:

分为 - 逻辑右移和- 算术右移,具体由编译器决定
逻辑右移:右侧丢弃,左侧补0;
算术右移:右侧丢弃,左侧补符号位;
如果你学过51单片机的话,就很清楚左移,右移的好处,要实现流水灯 (*-*);

位操作符

 &            |           ~ 

把指定位,置1

value = value | 1<<num; 

把指定位,清0

value = value & ~1<<num);

赋值操作符

=  

需要注意 赋值时有可能发生 隐式转换 ,比如,getchar 的返回类型为int(因为EOF为int型)
c语言让人又爱又恨操作符

单目操作符

 !   ++      -(负)     &     sizeof
 ~     --       +(正)     *      (类型)

逻辑取反操作:就是!num;如果num是0,则 !num=1; 如果num不为0,不管它为任何数,取反!num=0;(包括负数)
++ 分为 a++:(前置)++a(后置)
– -- 也和++样 a-- ;–a

int a = 10;
int b = 8;
//int c = ++a;//结果为11
int d = a++;//结果为10
int e = --b;
int f = b--;

++ 和 - -的使用要注意:

#include <stdio.h>
int main()
{
    //printf("%d",10++)//这是一个错误的例子,我们并不能给一个常量++
    int  a=10// ++a = 10;//  ++a是对变量值的拷贝  也就是说++a的结果为常量,不能给常量赋值
               //******如果你不能理解的话,可参考《c和指针》p73。和p79,左值和右值;
    system("pause");
    return 0;
}

- 和 +:正数和负数
sizeof::::我们重点讨论sizeof:::从那些方面可以看出他是操作符而不是函数那下面举例介绍:

#include <stdio.h>
int main()
{
     int i = 10;
     printf("%d",sizeof i);//    第一点可省略 ()  括号
     printf("%d",sizeof(int))
     return 0;
}
#inlcude <stdio.h>
int main()
{
    int i = 10;
    int s = 11;
    sizeof(s = 2*i);
    printf("%d",s);//结果为11,可见sizeof()的表达式并不进行运算。
    return 0;
}

** ~** 前面已经介绍,按位取反
* 和 & 解引用操作符:与指针一起使用

int main()
{
    int a = 0;
    int *p = &a;
    *p = 10;//  将a改为10;
}

(类型): 强制类型转换

int a = 5;
a = (float)a;//将a强制转话为  5.0    

关系操作符

>      >=   <   <=     !=    ==

一定要注意到:::判断是否相等是(==)双等号

逻辑操作符

   &&                   ||
   与操作            或操作

只有真假两种结果,a && b ,如果a和b都为真,表达式为1,否则表达式为0;
aa||b,如果a和b都为假,表达式为0,否则表达式为1;

条件操作符

a>b?a:b
求a,b中的较大值

逗号操作符(控制求值顺序)

表达式的值就是最后一个表达式的值

while(a=0,b=0,a<10)
{
    ;// 
}

下标引用操作符 arr[ 10];

. 和 ->操作符

#include <stdio.h>
struct stu
{
    char name[20];
    int   age;
};
int mian()
{
    struct stu s;
    struct stu* ps=&stu;//结构体指针
    s.age = 18;//结构成员访问
    ps->age=18;  

}

总结

    通过对操作符的学习我们可以很方便的解决许多问题,比如你可以试试下面几道题:(你也可以在我的GitHub博客找到答案)
 // 编写一个函数把指定的值存到这个整数中指定的几位;
//e:       原始值 |   存储值   |   起始位   |     结束位   |    返回值 |
//          0x0   |   0x1      |    4       |     4        |     0x10  |
//       0xffff   |   0x123    |    15      |     4        |    0x123f |
//       0xffff   |   0x123    |    13      |     9        |    0xc7ff |
//         
//1.设置一个make;将要设置的那几位置0,其他值不变;比如:~001111000000000 &
//2.将要往进放的值的对应位调整好对齐。
//3.用make 将放入值的其余位清零; 进行按位与& 0011110000000000
//4.将第三步得到的值,与第一步得到的原值,进行按位or或操作;

本题答案在Candp_119