C语言基础三:表达式与运算符

1.表达式
    在c语言中表达式是用  运算符连接操作数  并且表达某种意思的式子
    既然是表达是就会有一个值
    3+4 a+b
2.运算符:
    几目运算符?
        a)单目运算符:操作数只有一个!
        b)双目运算符:操作数只有二个
        c)三目运算符:操作数只有三个 ? :
        性质:
            优先级 
            结合性:从左到右,从右到左    
            int a =2;
            int b=3;
            int c;
            c=b=a;
    2.1算数运算符:从左至右 
        1.双目运算符
            * / % 
            + - 
            ps:
                1)3+2*5  <====>13
                2)3/2    整数除整数只能为整数
                        double a=3/2   1.000000
                        int a=3/2      1
                        int a=3/2*1.0  1
                        如果想要结果为小数,在分子分母后面*1.0 并且赋值的类型必须为float double
                        自动向高精度靠拢
                3)%左右两边只能为整数  3%2  1 3%-2    a%b=a-(a/b)*b  对取余存在负数,看被除数
                4)4/0 4%0 //error  浮点数例外 (核心已转储)
        2.单目运算符 ++ --
                    表达式的值          i的值
            i++            i                i=i+1
            ++i         i+1              i=i+1
            i--         i                i=i-1
            --i            i-1              i=i-1
            
    2.2关系运算符:判断2个操作数的关系 从左到右
        > >= < <= == !=
        关系表达式的值:
            1(表达式成立)   0(关系不成立)
            
            ps:5>4>3   =====>(5>4) ==>  1>3  ===>0
    2.3逻辑运算符:表达某个式子逻辑
        表达式的值:
            非0  真(1)
             0   假(0)
        !   非      单目    
         &&   与         双目   从左至右     并且:有0就是0
            1&&0  0    
            1&&1  1  
            0&&0  0
            0&&1  0 
        ||   或         双目    从左至右      或者:有1就是1
        
        ex.
            a=4 b=5
            !a       0
            4&&5     1
            !0       1
            4&&5&&0  0
        惰性运算:
            并不是所有逻辑符后面的表达式都会被执行
            1)a&&b&&c 
                如果判断a是假的,那么b和c都不会被执行
            2)a||b||b
                如果判断a是真的,那么b和c都不会被执行

                ex.int a=1;
                    a&&a--&&a--    表达式值是多少? 0 
                    a||a--         a的值是多少?    1
        ex.判断某年是否为闰年
            1)可以被400整除
            2)可以被4整除 并且不能被100整除
            
         1.1)||2)
         2.a%400==0
         3.a%4==0&&a%100!=0
            
    2.4位运算符
        ~ | & << >>  ^
        a).&(按位与)
            1&1=1
            1&0=0
            0&1=0
            0&0=0
            3&5  表达式的值  011 & 101   001  
            6&10 表达式的值 (用补码计算)
                            
        用途:
            1)把某些位置0
                ex.int flag ;把flag低4位置0 flag=flag&0xfffffff0
            2)保留数中某些位
            3)取指定位
        b).   |(按位或)
            1|1=1
            1|0=1
            0|1=1
            0|0=0
            用途:把某些位置1
                ex.int flag ;把flag低4位置 flag=flag|0xf
        c)  ^(按位异或)            
            1^1=0
            1^0=1
            0^1=1
            0^0=0(同0异1)
                
                用途:1)把一个数清0
                                ex0.5^5   0
                                ex1.3^5   值011 ^101    结果:110  6
                                ex2.不用临时变量交换2个数的值
                                    a=a^b //a1  b1
                                    b=a^b;  //b=a1^0;
                                    a=a^b;// a=0^b1
                      2)可以把原来的数取反
                        x^1=~x
                        x^0=x
        d)  <<(左移运算)  双目运算符
                规则:高位舍弃 低位补0
                ex.(2<<4) <=====> 2*2(4)
                    int a=1;
                    int b=3;
                    a<<b   表达式的值:8 a的值:1
        e) >>(右移运算)
                规则:
                    无符号数:低位右移舍弃 高位补0
                    有符号数:低位右移舍弃 高位补符号位
                    x>>n;
                    2>>1 表达式的值:1
                    如果为正数,相当于除以2的n次方
        f)  ~(按位取反) 单目运算
            规则:0 - 1
                  1 - 0
            
                ex.把flag的第23位置0
                    flag=flag&( ~(1<<22));
                    把flag的第23位置1
                    flag=flag|( (1<<22)  );
    2.5
        赋值运算符:双目运算符(从右向左)
            3=4;
            赋值号的左边必须为地址
            int a;
            a=4////error
            a+=3;  a=a+3
            a*=3; a=a*3
            a-=3; a=a-3;
            a/=3; a=a/3;
            int b=3,c=4;
            a=b=c;  //a=4,b=4
     2.6
        条件运算符
            表达式 ?a:b
            规则:如果表达式为真,取a,否则取b
    2.7
        逗号运算符(双目运算符)从左至右
        b=(a=表达式1,表达2,....表达式n);
            1.先算表达式1赋值给a
            2.算表达值2
            3.算表达式n赋值给b
    2.8
        指针运算符(* &)
    2.9
        字节运算符
            求数据类型所占的字节数大小
            sizeof(0.8)
            sizeof(int)
        
    2.10 分量运算符(. ->)
            struct student
            {
                char name[10];
                char sex;//成员变量
                int no;
            };
            struct student a;
            printf("%d",a.no);
            struct student *a;
            printf("%d",a->no);
    2.11
        强制类型转换运算符
        float a=3.6;
        int b=(int)a+4;
    
    优先级:
        !>算数运算符>关系运算符>&&>||>条件运算符>赋值>逗号运算符
        记不清用括号
            
        
        
        
        
        
        
        

猜你喜欢

转载自blog.csdn.net/qq_26128879/article/details/82820479