<C> 运算符 - 2017/11/10

C语言 -->  40多个运算符   运算规则   运算顺序
  //表格 运算符 顺序 和名字
  顺序: <  不需要背>

     1.可以查表

     2.可以用括号改变运算优先级

     3.不同编程语言运算符优先级未必相同

1、运算符怎么计算

  1.1  加减乘除    算数运算符

    如: + - * /     %(求余 或 取模)  3%4 == 3

      a ) 求余     只能对整数求余   (二级的选择题)

         b ) 除法    整数除法   最后得到的也是整数(不会四舍五入)

    例如:3%4 -->  3-3/4*4

         被除数 / 除数 = 商......余数

          被除数 = 商 * 除数 + 余数

          56%6  --> 56 -56/6*6

            56/9=9   56-6*9 ==得到的余数

  1.2  二进制运算 (整数的二进制进行运算  直接操作二进制   速度快)

      二进制计算 整数 正数 除二求余 负数 原码反码补码(最后用的都是补码)
       // 浮点型没有二进制运算

      如:
        a --> 1101 1010
        b --> 1010 1011

      二进制 --> 颜色   RGB   255   123   249
             red    green   blue
             6位16进制   24位二进制 -->   PS 美图秀秀

      按位或 |      a|b -->   1111 1011   <有 1 则 1 > (一真或为真)
      按位与 &    a&b -->   1000 1010    <有 0 则 0 > (两真且才真)
      按位异或    a~b -->    0111 0001    <相同为零 不同为1>

      取反 ~   ~a   所有位数1变0  0变1   0010 0101    <只能对一个数操作>
              (负数的反码    原码基础除了最高位全部取反   不要弄混)

 

      左移和右移:

                               <<            a<<2   a左移两位   <1101  1010>  -->  0110 1000  前面舍掉两位  后面补0

                               11的二进制  -->   0000  1011<<2   --> 0010 1100 --> 44 

                                                           左移一位  相当于乘以2

                               a --> 1101 1010

          如:a>>2   后面舍掉两位   前面补齐  补齐(考虑符号)

         int  负数   前面补1

                                a是unsigned (无符号整数)  -> 整数  0

              a是int(有符号)    -->  最高位表示符号

           a是有符号的char    1101 1010

           1101 1010 --> 正数或者负数

 

1.3 关系运算符

  大于:>  

  小于:<  

   大于等于:>=  

  小于等于:<=    

  等于:==    

  不等于:!=

  如:2>3  错误   结果为:0

  *********真为:1   假为:0  ************ 重点

  逻辑运算符:  && 逻辑与   || 逻辑或

  3<x<4  是从左往右计算

  (x大于3 并且小于4)-->  x>3 && x<4     两个条件同时为真  整个条件为真  否则为假

  如:今天周三或者今天周日

     today==3||today==7   只要两个条件中的一个为真   整个条件就为真

 

   !(x>3)   如果x等于4 整个式子为假        x等于1  整个式子为真

    (真变假  假变真)

    a). 或和与
       或    如果左边条件为真 右边可以跳过   补计算    截断
       与    左边条件为假 右边不计算
    b). 非
       !4<5(真)    如果把数字当条件    假 0 真1  非0
       !0 -->1

 1.4 赋值运算符

    == 关系运算符中的等于

 

    =赋值运算符    右边的值赋给左边的值

      // 赋值运算符左边一定要是变量
      // x+1=3
      z=x=y=1;  //   // 二级题目:z=x+1=y==1

      赋值从右往左算   a=3
      a+=a-=a*a    --> a-=a*a  -->  a=a-a*a  -->  a=a+a
      a=3-3*3=-6     --> -12

 

1.5点运算符和箭头运算符

      结构体中讲到

      .  点运算符  结构体成员

      -> 箭头运算符  指针访问结构体成员

        《指针会讲到的》

      *  取值/解引用

      & 取变量地址     // x*y   乘号    *p 取值

 

      sizeof(int)计算类型大小(单位是字节)

 

      自增自减:   ++   --

x++    x=x+1;  // 给变量加1

      ++x    x++(前置++快于后置++)

      ++x  立刻加1

      x++  等一会再加 1

y=x++;    // y得到x当前的值 x再加1
y=++x;    // 先让x加1  然后再赋值

 

  

 x = i++ + i++ + i;   // C未定义   在同一个式子   不要对同一个变量进行多次++操作

  易读性

  负号            y=-x       --> 号前面没有任何的变量或者值   负号

   三目            语句1?   语句2?  :语句3?

         先判断语句1    为真执行:语句2  为假执行:语句3

  逗号运算符    优先级最低

int x=3,4,56;   //
x=3,4,5,6,7;   // x得到的值:3
x=(3,4,5,6,7); // x得到的值:7

  逗号运算符最后的结果   就是最后一个表达式的值

代码块:

#include <stdio.h>
#include <math.h>

int main()
{
#if 0
    int x = 3, y = 4;
    printf("%d\n", x%y);    // 求余
    printf("%d\n", x/y);    // 除法

#elif 0
    int a = 11;  // 0000 1011  -->   0010 1100
    printf("%d\n", a << 3);
    int x = 3, y = 4;
    double z = 4.0;
    char ch1 = 0xda;   // 1101 1010
    unsigned ch2 = 0xda;  // 无符号  前面补 0   后面补 1
    printf("%d\t%d\n", ch1 >> 2, ch2 >> 2); 
    printf("%d\t%d\n", ch1, ch2);
    //printf("%d", x*pow(2.0, 32));  // pow(2.0,23)  2的32次方


#elif 0  // 关系运算符
    int x = 3, y = 4;
    printf("%d", x > y);
    printf("%", !0);


#elif 1
    int x = 3, y = 4;
    int i = 0;
    x = i++ + i++ + i; 
    printf("%d\ti=%d\n", x, i);

    // 打印x和y的最大值
    int n = 3, m = 4, z = 5;

    //n > m ? printf("%d", n) : printf("%d", m);
    printf("%d\n", n > y ? x : y); 
    getchar();
    n > m ? (n > z ? n : z) : (y > z ? y : z);  // 嵌套
    z = n > m ? 1, 2, 3, 4 : 4, 5, 6, 7;
    printf("%d %d %d\n", n, m, z);



#endif
    getchar();
    return 0;
}

/*
** 1101 1000 --> 可以是正数 可以是负数
** 左移 连最高位也一起操作 最后得到的结果可能是正数可能是负数
*/

 

posted @ 2017-12-20 09:38  让优秀成为一种习惯  阅读(221)  评论(0编辑  收藏  举报