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

运算符:  代指某种操作的 符号  
表达式:  由 运算符 与 数据 按某种顺序 组合而成的 可以计算的一个 式子

C语言中 可以支持的运算符有:
    1.算数运算符:   +加  -减  *乘  /除  %求余 求模  
        /除    5 / 3  ==  1  整数除法是求商    浮点数除法 结果为浮点数
        %求余 必须是整数   5 % 3  == 2 
    其他数学运算 没有对应运算符  可以通过math库 实现
    
    双目运算:  需要两个数参与的运算符
    
    2.逻辑运算:  真  与 假的 运算  
                  符号
        逻辑与    &&     双目运算  真  && 真  结果为真   一假得假   
        逻辑或    ||     双目运算  假  || 假  结果为假   一真得真 
        逻辑非    !      单目运算     !真 == 假  

    非0 为真   0假 
        5 || 0  结果  真 1 
        5 && 0  结果  假 0
        !0.5  
    
    3.关系运算  大小比较  结果 真或假
        >  <   ==   !=  >=   <=  
    
    4.位运算  计算机中特有的运算   所有运算目标 均针对二进制而言 
        按位          &    将二进制中的每一位进行与操作   与0得0  与1不变
        按位          |    将二进制中的每一位进行或操作   或1得1  或0不变 
        按位取反    ~    单目运算 
        按位异或    ^    相同为0  不同为1
        移位运算
            逻辑左移    <<    高位移出丢弃 低位补0 
            算数右移    >>    低位移出对齐 无符号数 高位补0  有符号数 高位补符号位
    
a = 1100 0110  = 0xc6
b = 1111 0001  = 0xf1
    
a & b     
  = 1100 0000    
a | b 
  = 1111 0111
~a
  = 0011 1001 
a ^ b 
  = 0011 0111

a<<1
  = 1000 1100
a>>1
无数数a  =  0110 0011  == 0x63
有符号数 =  1110 0011  == -29
    
作用: 多用于底层编程
    示例:  有一个数a   希望 a的 [6:4] 设置为 0   其他位不变 
        a = a &   1000 1111;
          = a & ~ 0111 0000;
          = a & ~( 7 << 4);
        
           有一个数a   希望 a的 [m:n] 设置为 0   其他位不变 
        a = a & ~( x << n);   x  = 2的(m-n+1)次方-1
        
           有一个数a   希望 a的 [6:4] 设置为 1   其他位不变 
        a = a | 0111 0000;
          = a | (7<<4);
            有一个数a   希望 a的 [m:n] 设置为 1   其他位不变 
        a = a | (x << n);   x  = 2的(m-n+1)次方-1    

a = **## ##** 将a的 [5:2] 设置为  y = 1100  = 12
a1= **11 00** 
a1  =  ( a & ~( 0xf << 2) ) | 12 << 2;
    
        有一个数a   希望 a的 [m:n] 设置为值 y   其他位不变         
        a =  (a & ~(x << n)) |     (y << n);   x  = 2的(m-n+1)次方-1
            
交互a,b的值 
    中间变量法:
    int c = a;
    a = b; b = c;

    加法:
    a = a + b;  
    b = a - b;
    a = a - b;

    亦或法             5.赋值运算的复合运算   少用
    a = a ^ b;    ===>  a ^= b;
    b = b ^ a;    ===>  b ^= a;
    a = a ^ b;    ===>  a ^= b;
    
    a = a + b;   ===>   a += b;
    a = a - b;          a -= b;
    a = b - a;   ===>   不能
    
写一个程序 打印一个数  a的 最低4个bit的值  以二进制方式输出     
    a = 1100 x110   
    (a >> 3) & 1;
==  (1100 x) & 0000 0001;
==  0000 000x; 

    a = b; 
    a = 10;
    
    
    a = a + b + c;
    a += b + c;  ===>  a = a + (b + c); 
    a  = a * b + c; 
    a *= b + c;  ===>  a = a * (b + c);

    选择运算   三目运算符: 
    a ? b : c;
    逻辑: 若a 为真 则 执行 b; 表达式的值 为  b 
          若a 为假 则 执行 c; 表达式的值 为  c 
示例: a = 3, b=10;
    x = a > b ? a : b;   将ab中最大的赋值给x
计算机算法: 
    x = 0 ? a : b ;
    x = b;
    x
表达式的值    5;

    逗号运算符,
    表达式1, 表达式2, ... 表达式n;
    运算逻辑, 每个表达式都执行一下, 整个表达式的值 为  表达式n 的值 
    a = 5, b = 10;
    z = (x+=5, y = x+0.2);
    
    &变量名   取地址符  得到变量的内存首地址  只能对变量或有内存空间的量使用 

    sizeof运算符: sizeof(变量名或类型名);  用于计算变量或类型 占用的内存空间大小 单位字节
    
    自增自减运算符  ++  --   单目运算 
    
    前缀++ 运算符   ++a;  先+ a=a+1 后用    
    后缀++ 运算符   a++;  先用  后+ a=a+1   指a++表达式结束 
    前缀-- 运算符   --a;  先- a=a-1 后用
    后缀-- 运算符   a--;  先用  后- a=a-1 
    
    ++a++;  不行  ++( a++)  先用  ++ 5 然后 a=a+1  存在对常量赋值
int a =5;     
    a < a++;  结果为   假 
    a >= a--;  假 
    a >= ++a;  真          
    a > a++;   结果为真  ===>  a > 5; a=a+1;
    
表达式:  运算符 优先级 

    int a;  -a;   -a - a;  -(a-a);

优先级问题: 
    1. 优先级提升运算符 ()
    2. 单目运算符 优先级高  ++ --  &  + - ! ~
    3. 算数运算符 高于 移位运算  高于 关系运算  高于  位运算  高于 逻辑运算 
    4. 吊车尾 3兄弟  三目运算  赋值运算  逗号运算符 

示例: 
int  x=1, y=0, z=0; 

    x>0  &&  ! (y==3)  ||  z>5
==  1     &&  ! (y==3)  ||  z>5
==  1     &&  ! (0)  ||  z>5 
==  1     &&  1  ||  z>5
==  1  ||  z>5
==  1  || 0
==  1

根据情况 设计表达式 
    字符变量a  判断 是否 为 英文字母 ASCII     
    字符变量a  介于 'a' ~ 'z' 或  'A' ~ 'Z' 
    
    表达式  为真  是英文字母  为假 不是英文字母 
    数学表达式 'a' <= a <= 'z'  或 'A' <= a <= 'Z'
    C语言表达式 ('a' <= a && a <= 'z') || ('A' <= a && a <= 'Z')  == 0

练习题: 
    输入一个 年份, 判断是否为闰年?  输出 0或1 
    1. 能被4整除 不能被100 整除 
    2. 能被400整除 
    (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 


    
作业: 
1. 求下列表达式的值 int a=0,b=1,c=2;
    !(a+1>0)  &&  b==0  ||  c>0     
    a<0  ||  b==0  &&  c>0          

int b =1;
    1 &&  b==2  &&  (b=2) 
==  1 &&  b==2  &&  2
==  1 &&  1  &&  2
==  1
C语言 采用此种算法:
    1 &&  b==2  &&  (b=2)
==  1 &&  0   && 2
==  0  && 1
==  0


3. 输入一个数, 判断是否为 水仙花数?
    水仙花数: 一个3位数 其各个位数的 立方和 等于其本身     

    给定一个 n位数num   求其中m位的值   m<=n
    y = num / x %10;   其中x = 10^(m-1);  m    
    1个   = num / 1    % 10;
    2十位 = num / 10   % 10;
    3百位 = num / 100  % 10;
    4千位 = num / 1000 % 10;
    .....

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值