zoukankan      html  css  js  c++  java
  • 【C语言篇】☞ 4. 运算符

    算术运算符:

    1. +  加法运算符
    2. -   减法运算符,或负值运算符
    3. *  乘法运算符
    4. /   除法运算符
    5. % 模运算符,或称取余运算符,要求%两侧均为整型数据

    % 取模取余)运算符的注意事项:

    1取模运算符的操作数只能是整数  

    2取模运算符的正负性取决于前面那个操作数正负

    3如果取模运算的左边小于右边, 那么结果就是左边

    取余(模运算):5%3=2; -5%3=-2; 5%-3=2; -5%-3=-2 (余数的符号与被除数一致!)

    2%9=2;

    算术运算的注意点:

    1. 自动类型转换

        int a = 10.6;

        int b = 10.5 + 1.7;

        int b = 10.5 + 10; //将右边的10提升为了double类型

        自动将大类型转换为了小类型,会丢失精度

    1. 自动类型提升

      (相同数据类型的值才能进行运算(比如加法运算),而且运算结果依然是同一种数据类型。系统会自动对占用内存较少的类型做一个“自动类型提升”的操作)

        float a = 10 + 3.45f;//int 提升为 float    

        int b = 'A' + 32; // char 提升为 int

        double c = 10.3f + 5.7; // float 提升为 double

    1. 解决除法的精度问题

        double b = 1.0 / 2;

    1. 强制类型转换

      (将大范围的数据赋值给小范围变量时,系统会自动做一个强制类型转换的操作,这样容易丢失精度)

        double a = (double)1 / 2;

        double b = (double)(1 / 2);

        int i = 10.7;  //系统转

        int i = (int) 10.7;  //自己强转

        int a = 198l; // long 转换为 int    

        char b = 65; // int 转换为 char

        int c = 19.5f; // float 转换为 int

    赋值运算符的结合方向是:从右到左,而且优先级比算术运算符低

    赋值运算符是所有运算符中除了逗号运算符以外优先级最低的

     

     

    自增自减写在前面和后面的区别:

    • 如果++写在变量的前面, 那么会先将变量自增再用自增之后的结果参与运算
    • 如果++写在变量的后面, 那么会先将变量的值参与运算再将变量自增
    • 总结一句话: ++在前, 先自增再运算, ++在后, 先运算再自增

    ++aa++的区别:

    1. 先操作,再使用

        int b = ++a;  //等价于 a=a+1;  b=a;

    1. 先使用,后操作。

        int b = a++; //等价于 b=a;  a=a+1;

      运算规则:先左++,再赋值,最后右++

     

    sizeof()运算符:

    sizeof可以用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。

    注意:sizeof是一个运算符, 不是一个函数

              利用sizeof计算的格式: sizeof(变量/常量/数据类型);

    sizeof一共有3种形式:

    1. sizeof(变量常量)
    2. sizeof  变量常量
    3. sizeof(数据类型)

    举例:

    #include <stdio.h>

    int main() {

        char c='a';

        printf("%lu, %lu ", sizeof(10), sizeof(c));//4, 1

        printf("%lu, %lu ", sizeof 10, sizeof c);//4, 1

        printf("%lu ", sizeof(int));//4

        return 0;

    }

     

    逗号运算符和逗号表达式

    1. 逗号运算符主要用于连接表达式

        例如:a=a+1,b=3*4

    1. 用逗号运算符连接起来的表达式称为逗号表达式

            它的一般形式为:表达式1,表达式2,… …,表达式n

        逗号表达式的运算过程是:先算表达式1,再算表达式2,依次算到表达式n

        整个逗号表达式的值是最后一个表达式的值

    //逗号运算符

    #include <stdio.h>

    //逗号运算符类似于加减乘除运算符,逗号运算符取最后一个表达式的值。

    int main(){

        int num,num1;

        num=4,7; //逗号运算符的优先级低于赋值运算符

        num1=(4,7); //提高逗号运算符的优先级,先逗号运算,再赋值运算

        printf("num=%d num1=%d ",num,num1); // num=4 num1=7

        return 0;

    }

    关系运算符

    <    小于运算符

    <=  小于等于运算符

    >    大于运算符

    >=  大于等于运算符

    ==   等于运算符

    !=   不等于运算符

      关系运算符的返回值只有两种, 要么真, 要么假. 1()0()

     

    使用注意(优先级):

    1. (算术运算符)的优先级大于(关系运算符)

    如:3+4>8-2;//结果为1; 等价于:(3+4)>(8-2);

    1. 关系运算符的结合方向为“从左往右”

    如:4>3>2;//结果为0

    1. <><=>=)的优先级大于(==,!=

    如:2==3>1;//结果为0; 等价于:2==(3>1);

    int a=3>4+7;//结果为0

    int b=(3>4)+7;//结果为7

    int c=5!=4+2*7>3==10;//结果为0

    逻辑运算符

      && 逻辑与 、|| 逻辑或 、逻辑非

      使用注意:

    • 若想判断a的值是否在(3, 5)范围内,千万不能写成3<a<5,因为关系运算符的结合方向为“从左往右”。比如a2,它会先算3<a,也就是3<2,条件不成立,结果为0。再与5比较,即0<5,条件成立,结果为1因此 3<a<5的结果为1,条件成立,也就是说当a的值为2时,a的值是在(3, 5)范围内的。这明显是不对的。正确的判断方法是:(a>3) && (a<5)
    • 可以多次连续使用逻辑非运算符:!(4>2)结果为0,是""!!(4>2)结果为1,是""!!!(4>2)结果为0,是“假”
    • C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑与也适用于数值。  
    • 比如:
      • 5 && 4的结果是1,为“真”;-6 && 0的结果是0,为“假”。
      • 5 || 4的结果是1,为“真”;-6 || 0的结果是1,为“真”;0 || 0的结果是0,为“假”。
      • !5!6.7!-9的结果都为0!0的结果为1

      && || 都具有短路特征:

      如果前一个表达式能决定最终结果则不会计算后一个表达式!

    #include <stdio.h>

    int main() {

        //逻辑运算符&&||的短路特征

        int a=3,b=4,c=5,r;

        r=(a>b)&&(++b>c);

        printf("%d,%d,%d,%d ", a, b, c, r);//3, 4, 5, 0

        r=(a<b++)||(b<c++);

        printf("%d,%d,%d,%d ", a, b, c, r);//3, 5, 5, 1

        

        //非短路的逻辑运算符&|

        a=3;b=4;c=5;

        r=(a>b)&(b>++c);

        printf("%d,%d,%d,%d ", a, b, c, r);//3, 4, 6, 0

        r=(a<b)|(b<c++);

        printf("%d,%d,%d,%d ", a, b, c, r);//3, 4, 7, 1

        return 0;

    }

    优先级: 

      逻辑运算符的优先级顺序为: 小括号() > 负号 - > ! > 算术运算符 > 关系运算符 > && > ||

     条件运算符(三目运算符 " ? : "):表达式1?表达式2:表达式3

    如果表达式1为真,三目运算符的运算结果为表达式2的值,否则为表达式3的值

    单目运算符:操作数只有一个(-1;)

    双目运算符:操作数有两个(1 - 2;)

    三目运算符:操作数有三个(5 > 4 ? 1 : 0)

     

    当我们不确定某些运算符的优先级的时候,可以使用() 来明确优先级

  • 相关阅读:
    进程详解
    java 实体对象与Map之间的转换工具类(自己还没看)
    fastjson中toString与toJSONString的差别
    JSONObject.toJSONString()包含或排除指定的属性
    FastJson中JSONObject用法及常用方法总结
    SpringBoot之ApplicationRunner接口和@Order注解
    shiro使用
    RedisTemplate 中 opsForHash()使用 (没有测试过,copy的)
    解决:javax.servlet.ServletException: Circular view path []: would dispatch back to the current....
    【Springboot】spring-boot-starter-redis包报错 :unknown
  • 原文地址:https://www.cnblogs.com/bossren/p/6369637.html
Copyright © 2011-2022 走看看