• C语言学习:4、C语言的运算


    四则运算

            加  +

            减  -

            乘  *

            除  /

            求余  %,就是求余数,求余不能作用于浮点数,只能作用于整型数

    运算就有优先级,在C语言中也是先算乘除,后算加减,要改变优先级就用括号,先算括号内,后算括号内。

    运算优先级:正负号> 乘除 >加减

    关系运算

            大于   >

            小于   <

            大于等于  >=

            小于等于  <=

            等于  ==

            不等于  !=

    比较两个值的大小关系

    比较两个值是否相等

    比较的结果不是对的就是错的,对的就是真,结果就是1;错的就是假,结果就是0.

    运算优先级:大小比较 > 相等比较

    程序示例1:

    1. #include
    2. int main()
    3. {
    4. int a = 1;
    5. int b = 0;
    6. int c = a==b;//判断a与b是否相等,将结果赋值给c
    7. printf("c = %d", c);
    8. return 0;
    9. }

    显然输出结果是c = 0 

    程序示例2:

    1. #include
    2. int main()
    3. {
    4. int a = 1;
    5. int b = 2;
    6. int c = 0;
    7. c = a - b > a + b; //判断a-b的结果是否大于a+b,将比较结果赋值给c
    8. printf("c = %d", c);
    9. return 0;
    10. }

    结果是c = 0

    通过示例2,可以看出,关系运算符的优先级低于算术优先级,如果你不知道谁的优先级高,那就使用括号来确定优先级了,不丢人,如示例3所示。

    程序示例3:

    1. #include
    2. int main()
    3. {
    4. int a = 1;
    5. int b = 2;
    6. int c = 0;
    7. c = (a - b) > (a + b); //判断a-b的结果是否大于a+b,将比较结果赋值给c
    8. printf("c = %d", c);
    9. return 0;
    10. }

    逻辑运算

            逻辑与  &&

            逻辑或  ||

            逻辑非  !

    所谓逻辑,非真既假,只要值等于0,那就是假,只要值不等于0,那就是真。1为真,2也为真。

    逻辑与  &&,只要有一个条件为假,那结果就是假,所有的条件都为真,结果才是真:

            0 && 0        结果为假(0)

            0 && 1       结果为假(0) 

            1 && 0        结果为假(0)

            1 && 1        结果为真(1)

    逻辑或  ||,只要有一个条件为真,那结果就是真,所有的条件都为假,那结果就是假

            0 || 0        结果为假(0)

            0 || 1       结果为真(1) 

            1 || 0        结果为真(1)

            1 || 1        结果为真(1)

    逻辑非  !,这是一种单目运算符,所谓单目,就是只需要一个变量参与,如程序示例3所示,

    程序示例3:

    1. #include
    2. int main()
    3. {
    4. int a = 1;
    5. int b = !a; //因为a=1,是真,!a就是假,所以b为假
    6. int c = !b; //b为假,那!b就为真
    7. printf("c = %d", c); //打印结果应该是 c = 1
    8. return 0;
    9. }

    分析一个稍微复杂点的程序 

    程序示例4:

    1. #include
    2. int main()
    3. {
    4. int a = 1;//a非0,为真
    5. int b = 2; //b非0,为真
    6. int c = 0; //c==0,为假
    7. c = a && b; //真真相与,结果还是真
    8. printf("c = %d\n", c); //打印结果应该是 c = 1
    9. c = !(a - b) || (c < b);//a-b == -1,非0,为真,!(a - b)就为假,c
    10. printf("c = %d\n", c); //最终打印结果应该是 c = 1
    11. c = -5; //-5非0,就是真
    12. c = !!c; //双重否定,结果还是真
    13. printf("c = %d\n", c); //打印结果应该是 c = 1
    14. return 0;
    15. }

    位运算

    位运算的相关概念:

            1、所谓位运算,就是对数据的二进制位进行操作,就是对0和1进行操作;

            2、位运算的操作数只能是整型数;

    取反        ~           优先级1                ~0101----> 1010

    左移        <<         优先级2                 0011 << 1 ----> 0110(高位溢出,低位补0)

    右移        >>         优先级2                 0101 >> 2 ----> 0001(低位移出,高位补符号位)  

    与             &         优先级3                 0111 & 1100 ----> 0100

    异或        ^           优先级4                 0111^1100 ----> 1011(相同为0,不同为1)

    或           |            优先级5                 0111 | 1100---->1111  

    程序示例5:将整数5的第二位置1

    5 = 0101,第二位置1,变成0111,相当于 5 | 2 ==0101 | 0010

    1. #include
    2. int main()
    3. {
    4. printf("c = %d\n", 5|2); //0101 | 0010 == 0111 == 7
    5. return 0;
    6. }

    程序示例6:将整数7的第四位取反

    7 = 0111,第四位取反,变成1111,相当于0111 ^ 1000 = 1111

    1. #include
    2. int main()
    3. {
    4. printf("c = %d\n", 7^8); //0111 ^ 1000 == 1111 == 15
    5. return 0;
    6. }

    位运算的意义 

    位运算在嵌入式上用的非常多,比如将寄存器的某一位置0或者置1

    就整型数据而言,为什么分int和short,它们的本质区别是什么?

    1、占的内容大小不一样:short 占2个字节(16位),int占4个字节(32位)

    2、表示数据的方式不同:正整数用源码表示,负整数用补码表示,整型数与浮点数的二进制表示方式也不一样。

    所以进行位运算的时候需要确定几个问题:

    1、操作输的类型,即占用内存的大小

    2、操作数是正数还是负数

    3、不同类型的数据进行位运算的时候需要先对齐

    程序示例7:

    1. #include
    2. int main()
    3. {
    4. short a = 1;
    5. int b = 4;
    6. int c;
    7. c = a | b; // a先补符号位,变成0001,再与0100按位或
    8. printf("c = %d\n", c);
    9. return 0;
    10. }

     int型的-1在内存中是1111 1111 1111 1111 1111 1111 1111 1111

     int型的1再内存中是0000 0000 0000 0000 0000 0000 0000 0001

    其实字符型char 也可以理解为单字节的整型,取值范围-128--127,用作char类型时,就是字符,用作整型时,就是数字,具体可以看程序示例8:

    程序示例8:

    1. #include
    2. int main()
    3. {
    4. char c = 'A';
    5. short a = c; //小类型可以转为大类型
    6. int b = c;
    7. printf("c = %c\n", c);
    8. printf("c = %d\n", c);
    9. printf("a = %d\n", a);
    10. printf("b = %d\n", b);
    11. return 0;
    12. }

    打印结果是 

            c = A
            c = 65
            a = 65
            b = 65

    运算优先级从高到低排列

    1、正负号 > 逻辑非 > 按位取反

    2、乘除 > 加减 > 按位左右移

    3、大小比较运算 > 相等比较运算

    4、按位与 > 按位异或 >按位或

    5、逻辑与 > 逻辑或

    6、赋值操作

    还是那句话,记不住优先级也没关系,用括号来区分,不丢人。

    补充知识点

    左值与右值:

    赋值符号=左边的值叫左值,如变量;

    赋值符号=右边的值叫右值,如变量、字面量

  • 相关阅读:
    图的理论基础
    智能控制理论及应用 王耀南等编著
    【NLP教程】用python调用百度AI开放平台进行情感倾向分析
    安装sharepoint订阅版过程
    入门人工智能 —— 学习 python 使用 IDE :vscode 完成编程 (2)
    字节迎来新 CFO,或重启上市;马斯克以 440 亿美元收购 Twitter;FFmpeg 支持 JPEG-XL|极客头条
    bug的生命周期都有那些阶段
    香港金融科技周VERTU CSO Sophie谈Web3.0的下一个风口 手机虚拟货币移动支付
    五、数学建模之层次分析法
    docker 安装jenkins
  • 原文地址:https://blog.csdn.net/m0_49968063/article/details/132719845