• 【C语言】入门——操作符


    目录

    操作符分类

    1.算数操作符:

     2.移位操作符:

    2.1左移操作符:

     2.2右移操作符:

     二进制的三种形式

    原码和补码 

    3.位操作符:

     3.1按位与&:

     3.2按位或|:

     3.3按位异或^:

     4.赋值操作符:

    5.单目操作符:

    6.关系操作符:

     7.逻辑操作符:

    8.条件操作符

     9.逗号表达式

     10.下标引用,函数调用,和结果成员


    操作符分类

    C语言中操作符总共有10种:

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式,下标引用、函数调用和结构成员。

    1.算数操作符:

    +        -        *        /        % 

     注意:/和%,不同,/是得到商,%是得到余数

     1.除了 % 操作符之外,其余操作符可以作用于整数和浮点数。

     2.对于 / 操作符如果两个操作数都为整数,执行整数除法。

    3.而只要有浮点数执行的就是浮点数除法。

    4.% 操作符的两个操作数必须为整数,返回的是整除之后的余数。

    1. int main()
    2. {
    3. int a = 0;
    4. a = 13 % 5;//读作13取模5
    5. printf("%d", a);//3
    6. return 0;
    7. }

     2.移位操作符:

    <<        >>

     因为元素在内存中是以二进制存储的,移的位都是二进制位,先把元素转换成二进制数。

    1. int a = 10;
    2. //二进制
    3. //00000000000000000000000000001010

     注:移位操作符的操作数只能是整数

    2.1左移操作符:

    (整数在内存中存储的时补码的二进制序列)

    在计算也是用的补码计算。

    打印出来是按照原码打印显

    左边丢弃,右边补0

    1. int a = 10;
    2. int b = 0;
    3. b = a << 1;//左移一位
    4. printf("%d\n", b); //20
    5. printf("%d\n", a); //10
    6. //00001010
    7. //-> 00010100

     2.2右移操作符:

    分为两种方式:(根据不同编译器决定,大多数是2)

    1.逻辑右移:右边直接丢弃,左边补0(不怎么用,有缺陷)

    2.算术右移:右边直接丢弃,左边补原数值符号位

    原来是负数,左边补1;

    原来是正数,左边补0;

    注:(对于移位运算符,不能移动负数位

    int num = 10;

    num >> -1; 错误的)

     二进制的三种形式

    移位操作跟二进制相关,整数的二进制分为三种

    ①原码:按照数值的正负,直接写出的二进制序列就是原码。

    ②反码:原码的符号位不变,其他位按位取反。

    ③补码:反码的二进制+1就得到补码

    比如:10:

    原码:00000000000000000000000000001010

    反码:00000000000000000000000000001010

    补码:00000000000000000000000000001010

    -10:

    原码:10000000000000000000000000001010

    反码:111111111111111111111111111111110101

    补码:111111111111111111111111111111110110

    对于一个整数是4个字节=32个bit位

    一个整数写出二进制序列时,就是32个bit位。

    对于有符号的整数来说,最高位的1位时符号位

    符号位1表示负数

    符号位0表示整数

    对于无符号位数整数来说,没有符号位,所有位都是有效位

    正的整数,反码,补码相同,无需计算

    原码和补码 

    原码可以通过取反,+1操作得到补码,补码也可以通过取反+1得到原码

    3.位操作符:

    &        |        ^ 

    &: //按位与 :只有两个数的二进制同时为1,结果才为1,否则为0。

    &1可以得到该二进制最后一位是0还是1

    |: //按位或 两个数有一个为1,则为1.全0才是0

    ^: //按位异或  如果其中一个操作数中的位为 0,而另一个操作数中的位为 1,则相应的结果位设 置为 1。 否则,将对应的结果位设置为 0。相同为0,不同为1 a^a =0;0^5 =5;(支持交换律)

    按位异或 ^ 是一种二进制运算符,它将两个数的每一位进行异或操作。异或运算的规则是:如果两个对应位的数相同,则该位结果为0;如果两个对应位的数不同,则该位结果为1。异或运算有以下几个特点:

    1. 0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^ 1 = 0,这是异或运算的基本规则。
    2. 0异或任何数等于任何数本身,即0 ^ x = x。
    3. 1异或任何数等于该数的取反,即1 ^ x = ~x。
    4. 任何数异或自己等于0,即x ^ x = 0。

    注:操作数必须是整数

     3.1按位与&:

    1. int a = 3;
    2. int b = 5;
    3. int c = 0;
    4. c = a & b;//按(2进制位)位与
    5. //规则:对应位都是1,按位与为1。对应位有一个不是1,那按位与为0
    6. //a:00000000000000000000000000000011
    7. //b:00000000000000000000000000000101
    8. //a&b:00000000000000000000000000000001

     3.2按位或|:

    1. int a = 3;
    2. int b = 5;
    3. int c = 0;
    4. c = a | b;
    5. //对应位只要有一个1,那么就按位或该位置为1
    6. //a:00000000000000000000000000000011
    7. //b:00000000000000000000000000000101
    8. //a|b:00000000000000000000000000000111

     3.3按位异或^:

    1. int a = 3;
    2. int b = 5;
    3. int c = 0;
    4. c = a ^ b;
    5. //对应位,相同为0,相异为1
    6. //a:00000000000000000000000000000011
    7. //b:00000000000000000000000000000101
    8. //a|b:00000000000000000000000000000110

     4.赋值操作符:

    =        +=        -=        *=        /=        %=        >>=        <<=        &=        |=        ^=

    就是简单的将想要的值赋给另一个变量;复合赋值也只是为了简洁;

    5.单目操作符:

    !        逻辑反操作

    -           负值

    +           正值

    &           取地址

    sizeof      操作数的类型长度(以字节为单位)

    ~           对一个数的二进制按位取反

    --           前置、后置--

    ++          前置、后置++ *          

    *              间接访问操作符(解引用操作符)

    (类型)        强制类型转换

    重点在于sizeof :

    sizeof是在计算类型创建变量或者变量的大小,单位是字节

                    计算的结果是size_t类型的;

                    size_t 是无符号整型的,所以sizeof也是无符号的;

                   对size_t类型的数据进行打印,可以使用%zd;

                    sizeof是操作符,不是函数

    sizeof:只在乎数组里面有多少个字符元素,来计算数组大小;

                  计算的占用内存的大小,无论对象啥类型;

    strlen:遇到\0才算结束计算;

                   是库函数,统计字符串长度的;

                    只能针对字符串;

    1. int main()
    2. {
    3. int a = 5;
    4. printf("%d", sizeof(a));//计算int类型的长度
    5. return 0;
    6. }

     强制类型转换也是常用的之一

    1. int a = (int)3.14;//将double类型强制转换为整型
    2. printf("%d\n", a);

    6.关系操作符:

    >         大于

    >=       大于或等于       

    <         小于       

    <=       小于或等于       

    !=        不等于       

    ==        等于

     特别注意“==”和“=”不一样

     7.逻辑操作符:

    &&:    逻辑与      

    ||:        逻辑或

     &&:只有&&两边的表达式均为真,才表示真

    ||:   只要||一边的表达式为真,整个表达式就为真

    注:要区分逻辑与  和 按位与

                     区分逻辑或和按位或

    8.条件操作符

    表达式1?表达式2:表达式3 

    如果表达式1成立,则执行表达式2的值,否则执行表达式3的值 

    1. int a = 3;
    2. int b = 5;
    3. int max = (a > b ? a : b);//用来找到两数的较大值
    4. printf("%d\n", max);

     9.逗号表达式

    表达式1,表达式2,表达式3,......表达式n

     表达式的结果:从左向右依次执行,整个表达式的值是最后一个表达式的结果

    1. int a = 3;
    2. int b = 5;
    3. int c = (a + b, b + 1, a++);//最后一个表达式的值
    4. printf("%d\n", c);//3

     10.下标引用,函数调用,和结果成员

    1. [ ] 下标引用操作符 操作数:一个数组名 + 一个索引值

    2. ( ) 函数调用操作符 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

    3. 访问一个结构的成员 . 结构体.成员名 -> 结构体指针->成员名

    感谢你看到这里,身为初学者,自知有很多不足,望得到指点!!! 

  • 相关阅读:
    【校招VIP】秋招进行中,时间来不及?简历投递过不去?你需要有特色亮点的项目
    android源码-ContentProvider实现原理分析
    【MySQL】MySQL的增删查改(进阶)
    oracle执行计划中,同一条语句块,在不同情况下执行计划不一样问题。子查询,union 导致索引失效。
    计算机毕业设计springboot+vue基本微信小程序的医疗监督反馈小程序
    【总结】各种Linux上安装git的方法
    MySQL高级6-视图
    Spring异步核心@Async注解的前世今生
    PyQt5 QMediaPlayer播放不了视频
    kafka的commitFaildException异常处理
  • 原文地址:https://blog.csdn.net/m0_67367079/article/details/132630566