运算符,选择语句

一,运算符
    自变运算符: ++/--   使变量的值自动加1或者减1
        前自变:++num/--num 立即生效
        后自变:num++/num-- 下一行语句才有效
        注意:不要在一行代码中多次使用自变运算符
    *  ++ -i  这样对吗?  这样不对  在这里-i是表达式,自增自减只能针对一个变量进行运算!
       -i++  这样可以,此时是先  i++   再取负值哦!
      
    算术运算符: + - * / %
        整数/整数   结果还是整数,没有小数点,只保留整数部分
            10/3   -> 3
            10%3   -> 1   
        / % 除数不能为0,否则就会浮点数例外、(核心已转储),这是个运行报错,一旦产生程序立即停止,后面不再执行
  注:  2%5  -2%5  2%-5  -2%-5  他们输出结果各是什么呢?
  应该是      2    -2   2    -2
    %它的结果以被取余的为基准即2,-2,2,-2
  还有:  printf("%lf", 5.0%2);  这是什么?    这样会报错
    5.0%2中  %要求是整型且输出符号由被取余来决定  什么意思?
    就是  printf("%ld", (long)5.0%2);  这样是对的而  printf("%d", (long)5.0%2);  这样能输出但是会警告;
 
若a % b == 0,说明a是b的整数倍
 
    关系运算符: >  <  >=  <=  ==  !=
        比较结果0(不成立)或1(成立),比较结果可以继续参与后续的运算
        int n = -100;
        if(10 < n < 100)    
        结果永远为真,与数学运算规则不同
        注意:== 建议常量放左边
        
    逻辑运算符:  &&  ||  !
        先把运算对象转换成逻辑值,0转换为假,非零转换真
        A && B  一假即假
        A || B  一真即真
        !A      求反
        && || 短路特性:
            当左边部分的值可以确定整个表达式的结果时,右边部分就不执行计算
    什么意思?
    其实就是  xxx && xxx  当左边表达式为假(0),右边直接被短路,若有运算则不参与运算
    同理    xxx   ||   xxx  当左边表达式为真(1),右边直接被短路,若有运算则不参与运算
    eg:
      int a, b, c;
      a=b=c=0;
      a++ && b++ || c++;
      printf("%d, %d, %d", a, b, c);
      输出什么?  ---->a++ 为0,b++被短路了,但是c++没有被短路哦,这里要注意
      故输出为1,0,1
 
    条件/三目运算符:运算对象有三个部分
        A ? B : C   
        判断A的值如果为真则执行B,否则执行C
 
    赋值运算符
        a = 10; 
        a += 10;        a=a+10;
        a -= 10;
        a *= 10;
        a /= 10;
        a %= 10;
    位运算符:  &   |   ~   ^  <<  >>
逗号运算符:
  *优先级最低
  eg:int num = 0, num1=0;
    num1 = (num=1,2,3);---->    括号中num被赋值为1,逗号优先级最低故num1=3
    num=?  num1=?
    这时num应该等于1,num1等于3
 
二、分支语句
    if(表达式);  //单分支
    {
        //表达式为真(非零),则执行此处代码
    }
 
    if(表达式)  //双分支
    {
        //表达式为真(非零),则执行此处代码
    }
    else
    {
        //表达式为假(零),则执行此处代码
    }
 
    if(表达式1)  //多分支
    {
        //表达式1为真(非零),则执行此处代码
    }
    else if(表达式2)
    {
        //表达式2为真,则执行此处代码
    }
    else if(表达式3)
    {
        //表达式3为真,则执行此处代码
    }
    else
    {
        //如果以上所有表达式都为假,则最后执行此处代码
    }

三,类型转换
    只有相同类型的数据才能运算,如果类型不相同的数据需要先转换相同类型后再进行计算。
    自动类型转换:
        转换规则:
            以不丢失数据为基础,可以适当地牺牲一些空间
            1、字节少的向字节多的转
            2、有符号的向无符号的转
            3、整型向浮点型转
            注意:char short如果与不同类型的数据运算时,会先提升为int类型后参与运算
    强制类型转换:
        (新类型名)数据;
        这种方式有可能会丢失数据,慎重使用

四,switch开关分支语句
    switch(n) //n可以是数值、表达式,运算结果必须是整数
    {
        case val:   //如果val==n,则打开执行开关
                    //val必须是整型常量
            ...
            break;  //关闭执行开关,结束switch
            //如果每个case后都加break,形成了分支结构
            //switch中不能使用continue配合
            //case a ... b:  可以表示[a,b],但是只有GNU编译器才支持该语法,不建议使用
        case val1:
            ...
        default:
            //如果所有的case都没有打开,则最后打开default,并且放在任何位置都可以最后打开
    }

这里有个有趣的现象:

在linux ubuntu16.04

case 要求是常量

const int a=1;

switch(1){

case a:....  }编译会错误的哦

但是在windows vscode-mingw  同样的方式不会报错哦,甚至会执行case a:这个语句内的内容哦

可以去试一试。

posted @ 2024-08-16 14:46  amour02  阅读(14)  评论(0编辑  收藏  举报