C语言知识清单(7)——操作符详解

操作符详解

1.操作符的分类

  • 算术操作符:+、-、*、/、%
  • 移位操作符:<<  >>(只能操作整数)
  • 位操作符:&  丨    ∧
  • 赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、丨=、︿=
  • 单目操作符:!、++、--、&、*、+、-、sizeof、(类型)
  • 关系操作符:>、>=、<、<=、==、!=
  • 逻辑操作符:&&、丨丨
  • 条件操作符:?:
  • 逗号操作符:,
  • 下标引用:[]
  • 函数调用:()
  • 结构成员访问:.   、  —>

2.原码,反码和补码

二进制的第一位都是表示正负的,0为正,1为负

正整数的原码补码反码都相同

负整数的三种表示各不相同

  • 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码
  • 反码:将原码的符号位不变,其他的依次按位取反就可以得到反码
  • 补码:反码加一就是补码

ps:反码得到原码也可以使用:取反,+1的操作

对于整形来说,数据存放内存其实存的是补码

3.左移位操作符

移位规则:左边抛弃,右边补0

#incTude cstdio.ho
 int main()
{

int num = 10;
iat n= num<<l:
printr(“n= %d\n", n);
printf(“num=  %d\n”, num);
return 0;
}

9d8336382f6d477188fee821c1c2e9e6.jpg

 

4.右移操作符

移位规则:首先右移运算分两种

举个例子:

#incLude kstdio.h>

int main()

{

int num = 10;

int n = num>>1;

printf(n= %d\n", n);

printf("num= %d\n", num);

return 0;

}

  • 逻辑右移:左边用0填充,右边丢弃1d464cb6f61b4687b19c067217b7462b.jpg
  • 算术右移:左边用原该值的符号位填充,右边丢弃389d339095244e488a2b16e26dead602.jpg

 注意:对于移位运算符,不要移动负位数,这个是标准未定义的。如int num = 0;num>>-1;//error

5.位操作符:&、丨、︿、~、

看二进制的对应数字

&按位与:有0则0,全1为1

丨按位或:有1为1,全0为0~

︿按位异或:相同为0,不同为1

~按位取反:每一位都取反即可,包括符号位

注意:位操作符是操作数必须是整数

6.举个例子:

8059c40812c24108bb580be38db9fe77.jpg

 我们简化数字,假设a为2二进制是10,b为3二进制是11,第一步ab按位异或数字相同结果是0,数字不同结果是1,结果赋给a为01,第二步继续01和11按位异或,结果10赋给b,第三步10和01按位异或11赋给a,至此,已成艺术。实现了a和b的数值交换。没有创建第三个变量,过程简单。

7.逗号表达式:exp1,exp2,exp3,……expN

逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行,最后一个表达式的结果是整个表达式的结果。

8.结构体

结构体是一些值的集合,这些值称为成员变量。结构体的每一个成员可以是不同类型的变量,如:标量,数组,指针甚至是其他结构体。

  • 结构体的声明

        struct tag      如:      struct Stu

        {                                {

        member-list;                 char name[20];

        }variable-list;             int age;

                                            char sex[5];

                                            char id[20];

                                            };

     注意结束的分号以及每一句都有分号

  • 结构体变量的定义

         struct Point        类型申明

         {

                int x;

                int y;

         }p1;

         struct Point p2;

  • 结构体变量初始化

struct Stu s1 = {"zhangsan",20};//初始化

struct Stu s2 = {.age=20,.name="list"};//指定顺序初始化

  • 结构体嵌套初始化

        struct Node

        {

        int data;

        struct Point p;

        struct Node*next;

        }n1  {10,{4,5},NULL};//结构体嵌套初始化

         struct Node n2 = {20,{5,6},NULL};//结构体嵌套初始化

9.结构成员访问操作符

  • 结构体成员的直接访问:结构体变量名.成员名

#include <stdio.h>

struct point

{

       int x;

       int y;

}p = {1,2};

int main

{

       printf("x:%d y:%d\n",p.a,p.y);

       return 0;

}

  • 结构体成员的间接访问结构体指针->成员名

#include <stdio.h>

struct point

{

       int x;

       int y;

}p = {1,2};

int main

{

       struct Point p = {3,4};

       struct Point *ptr = &p;

       ptr->x = 10;

       ptr->y = 20;

       printf("x:%d y:%d\n",ptr->x,ptr->y);

       return 0;

}

10.操作符的属性:优先级和结合性

  一,必须了解的操作符优先级(由高到低排列)

  • 圆括号()
  • 自增远算符++,自减运算符--
  • 单目运算符+和-(正负)
  • 乘法*,除法/
  • 加法+,减法-
  • 关系运算符><==
  • 赋值运算符=

  二,结合性

如果两个运算符优先级相同,优先级没办法确定先算哪个了,这时候就看结合性了,根据运算符是左结合还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右执行(从右往左执行)

ca92e4eb95e047b1a8ccd2b1ea3b750e.jpg

 一般为左结合,右结合包括自增自减正负以及逻辑远算符,取地址,解引用和赋值,简单赋值,和差赋值,积商赋值余数赋值左右移赋值逻辑操作赋值。

 

 

 

 

 

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山轻舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值