表达式与运算符

一、什么是表达式?
    表达式就是表达某种意思的式子。
    在C语言中,表达式用运算符连接操作数的式子。
    广义上讲,有;的就是语句,没有分号的就是表达式。
    
二、C语言中的运算符:
    (1)算术运算符:  双目运算符(需要连接两个操作数),结合性:左->右
        * /  %  +  -
    ★注意整数/整数,其结果还是整数,若想要结果为实数,可在分子*1.0
    隐式类型转换:不同数据类型之间进行运算时,其结果会转化为精度高的那个数据类型。
        (无符号和有符号进行计算,结果为无符号)
     %:取余运算符,在C语言中,要求两个操作数都必须为整数
        5%3   2%3   -5%2   5%-2   -5%-2
        
    (2)关系运算符: 双目运算符,左->右,表达两个式子的关系
        >  >=  <  <=
        ==  !=    
       由关系运算符连接操作数组成的表达式,叫做关系表达式
       关系表达式的值:  1(关系成立)      0(关系不成立)
           5>4>3
       ==> 1>3
       ==> 0
       
    (3)逻辑运算符:  表达某数理逻辑的表达式
        逻辑表达式的值:  真(非0)    假(0)
        ★任何非0的数都表示真,但是如果表达式的结果为真时,只能是1
        
        !  (逻辑非),单目运算符,取逻辑上的反
            !!(-1)  ==> 1
        && (逻辑与),双目运算符,"并且",结合性 左->右
            a && b && c
        || (逻辑或),双目运算符,"或", 结合性 左->右
        
        ★在C语言中,运算是"惰性运算"。如果事先知道了表达式的值,那么它就不会
          去运算后面的式子啦。
          eg:   a && b && c
                只有当a的值为真时,才有必要去判断b的值
                只有a和b的值都为真时,才有必要去判断c的值
                
                a || b || c
                只有当a的值为假时,才有必要去判断b的值
                只有当a和b的值都为假时,才有必要去判断c的值
                
    (4)位运算:按bit位来进行位运算操作的运算符
        ~  (按位取反):单目运算符
        
        &  (按位与): 双目运算符
            1 & 1 ==> 1
            1 & 0 ==> 0
            0 & 0 ==> 0
            0 & 1 ==> 0
        
        |  (按位或):  双目运算符
            1 | 1 ==> 1
            1 | 0 ==> 1
            0 | 1 ==> 1
            0 | 0 ==> 0
            
        ^  (按位异或): 双目运算符,相同为假,不同为真
            1 ^ 1 ==> 0
            1 ^ 0 ==> 1
            0 ^ 1 ==> 1
            0 ^ 0 ==> 0
            
        << (左移): 双目运算符,按bit位往左边移
            eg:  int a = 2<<1;  //4
                把数值2按bit位往左边移1个bit位,
                高位消失,低位补0
                
        >> (右移): 双目运算符,按bit位往右边移
            逻辑右移:  高位补0
            算术右移:  高位补符号位
            C语言标准中,没有规定右移是逻辑右移和算术右移,在不同的编译器和处理器中,
            实现方法可能不一样。
    
    (5)赋值运算符:  双目运算符, 右->左,优先级排倒数第二
        =  
        eg:   a = 5+3;
        赋值表达式的值为赋值符号左边的值,赋值运算符的左边(左操作数)必须为"可写的地址"
            5 = 3;//error
            
        复合的赋值运算符:赋值运算符可以和算术运算符、位运算符组成复合的赋值运算符
        += :    a += 5  ==>  a = a+5
        -=        &=
        *=        |=
        /=        ^=
        %=        <<=
        ~=        >>=
        
    (6) 条件运算符  ? :     三目运算符    右->左
            表达式1 ? 表达式2 : 表达式3
        求值顺序:  先计算表达式1的值,如果表达式1的值为真,则整个条件表达式的值为表达式2的值,
                   如果表达式1的值为假,则整个条件表达式的值为表达式3的值
        eg:  printf("the max is %d\n",a>b?a:b);        
        注意:条件表达式也有惰性运算
        
    (7) 逗号运算符:  双目运算符,优先级最低的,  左->右
            表达式1 , 表达式2
        求值顺序: 先求表达式1的值,再求表达式2的值,整个逗号表达式的值为表达式2的值
        
        逗号表达式的扩展
            表达式1,表达式2,表达式3,...表达式n
        求值顺序:  先求表达式1,再求表达式2,...最后求表达式n的值,
                   整个逗号表达式的值为表达式n的值
        注意:  逗号表达式要与参数列表进行区分
        
    (8)☆指针运算符(* , &)
    
    (9)求字节运算符(sizeof)
        求字节运算符的结果只跟圆括号内是什么数据类型有关,单位为字节
            sizeof(1.0)  == sizeof(double)
            sizeof(1.0f) == sizeof(float)
            sizeof(2l)    == sizeof(long)
            sizeof(2u)   == sizeof(unsigned int)
            short s;
            sizeof(s+1)  == sizeof(int)
            
    (10)☆分量运算符 (.  ->)
        用于求结构体变量的成员变量
            a.i;
            p->i;//p是结构体指针
            
    (11)☆下标运算符 ( [] )
       取数组中的元素
       int a[10];
       a[3]  a[4]
       
    (12)强制类型转换运算符
        (数据类型)
        eg:  float a=3.6;
             printf("%d\n",(int)a);
             
    (13)自增、自减运算符(++,--): 单目运算符
                表达式的值        执行完这个表达式后i的值
        i++         i                   i+1
        ++i         i+1                 i+1
        i--         i                   i-1
        --i         i-1                 i-1
                   
        注意:(1)要避免 i=i++ 这种用法
              (2)要避免在避免在一个表达式里对一个变量重复用++,可能会被编译器优化
                int i=2;
                (++i)+(++i)+(++i)
                
运算符的优先级和结合性
    () [] -> .             自左向右
    ! ~ ++ --  +-(正负号)  自右向左       单目运算符
    *  /  %                自左向右       算术运算符
    +  -    
    <  <=  >  >=           自左向右       关系运算符
    ==  !=
    & ^ |  << >>           自左向右       位运算符
    &&                     自左向右       逻辑运算符
    ||
    ? :                    自右向左       条件运算符
    = += -= *= /=
    %= &= |= ^= <<= >>=    自右向左       赋值运算符
    ,                      自左向右       逗号运算符
    
    同级优先级的运算符,实际优先级为左侧优先

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值