zoukankan      html  css  js  c++  java
  • 004_stdc_C语言基础

    回顾:

    C语言中的数据(基本)

    根据读写属性 常量/变量

    变量的类型 确定该变量的字节数,取值范围,数据的存储格式

    数据类型,是指在数据结构定义上的数据的集合以及基于该集合的运算

    --------------------

        C语言中的运算(基本) 运算符


    sizeof 计算变量/类型/常量/表达式
                 字节数 
        sizeof(int);
        sizeof(2+3);

    ---------------
    char c = 0;//1
    int i = 0;//4

        i = c;

    赋值运算时两边类型不一致,小字节变量赋值给大字节变量的时候
    赋值到低位,高位补0

    赋值运算时 将=右边的类型转换为=左边的类型,浮点数赋值给整型变量 取整(编译器,隐式转换)
    i = (int)3.14

    算术运算
    + - * / %

    10%3=1
    num % 10  获得一个数的个位数

        1/3*3  跟 3/3*1 相等吗

    [练习]
    分苹果,老师从冰箱拿来n个苹果(从键盘输入),分给班上的7个小朋友,输出每个小朋友分多少个,还剩下多少个?

        int num = 0;
        //1.输入苹果数
        printf("输入苹果数:");
        scanf("%d",&num);
        //2.开始计算
        int average = 0;
        average = num / 7;
        //3.剩余多少个苹果
        int left = 0;
        left = num % 7;
        //4.输出结果
        printf("平均每个小朋友分 %d
    ",average);
        printf("还剩下%d
    ",left);

    [练习]
    输入一个两位数的整数,输出这个两位数 数字交换后的值
    25 --> 52

    a = num % 10 -->个位 5
    b = num / 10 -->十位 2

       a*10+b  


     3.14*r*r = 浮点面积

    如果运算符两边类型不一致,将数据转换为同一类型,再运算,运算后的结果,转换后的类型

       int s = 3.14*3*3 //??

    有浮点转浮点,有双精度浮点转双精度浮点
    小的转大的,有符号转无符号
    编译器(隐式转换)

       复合赋值运算

        += |= &=

    a+=2; //a = a + 2;
    a&=3 //a = a & 3;

        int i = 10; 
        i+=  i-=100; ==> i = i - 100;i = -90
        i+=i; //i=? -80
        i = ?

    -180

    自增自减
    ++ --
    i++; //i=i+1;
    i--; //i=i-1;

    前++(++在变量前)后++(++在变量后)

    区别:
        前++ 先+1 后使用变量的值
        后++ 先使用变量的值,后+1

    [练习]
    输入一个秒数
    输出 小时 分钟 秒

    /*
     * 输入秒数 输出时间
     */
    #include <stdio.h>
    
    int main(){
    
        int hour = 0;
        int min = 0;
        int sec = 0;
    
        int second = 0;
        printf("请输入一个秒数:");
        scanf("%d",&second);
    
        hour = second / 3600;
        min = (second -hour*3600)/60;  //运算优先级
        sec = second % 60; 
    
        printf("%d:%2d:%2d
    ",hour,min,sec); //0:2:30
        return 0;
    }

    运算符的优先级

    linux  查看优先级指令 man  operator

    单目 --> 一个操作数 i++
    双目 --> 两个操作数 + - * / %
    三目 --> 三个操作数

    位运算  对数据的bit位进行操作

    & 按位与

     &  按位与   相同bit位 同时为1,结果1,否则0
              清0    获取bit位的值
    | 按位或

     |  按位或   相应bit位 同时为0,结果0,否则1
              置1    获取bit位的值
    ~ 按位取反

     ~  按位取反 bit 位 0变成1  1 变成0
    ^ 按位异或

     ^  按位异或 相应bit位 相同为0,不同为1
    << 左移

       << 左移  补0
    >> 右移

       >> 右移  有符号数 补符号位 无符号补0

       //0000 0011  
        //0000 0001   &
        //-------------
        //0000 0001
        printf("0x3 & 0x1=0x%x
    ",0x3&0x1);  //0x1
    
        //0000 1010 0xa 
        //0000 1001 0x9  |
        //-------------
        //0000 1011 0xb
        printf("0xa | 0x9=0x%x
    ",0xa|0x9);  //0xb
    
        //0000 1111 0xf
        //1111 0000 0xf0 ~
        printf("~0xf=0x%x
    ",~0xf);  //0xf0
    
    
        //0000 1100
        //0000 1111   ^
        //------------
        //0000 0011
        printf("0xc^0xf = 0x%x
    ",0xc^0xf);
    
        //0000 1100    0xc<<2
        //0011 0000   0x30
        printf("0x1<<1 = %d
    ",0x1<<1);
        printf("0x1<<2 = %d
    ",0x1<<2);
        printf("0x1<<3 = %d
    ",0x1<<3);
        printf("0x3<<2 = %d
    ",0x3<<2);
    //0000 0001    1>>1
        printf("0x1>>1 = %d
    ",0x1>>1);
        char c = 0x81;//1000 0001 ==>11110000
        printf("c>>3 = %x
    ",c=c>>3); //0x10
    
        unsigned char uc = 0x81; 
        uc=uc>>3;
        printf("uc>>3 = 0x%x
    ",uc); //0x10

    /*
    * 在某一些嵌入式设备中
    * 对一个bit 位置1
    * 可以输出高电平
    */

        int reg = 0x0f;  //0000 1111
        //设置bit[6] = 1;第七个引脚输出高电平
        reg = reg | 0x40;//0100 0000    //|  按位或   相应bit位 同时为0,结果0,否则1
        printf("reg = 0x%x
    ",reg);//;reg = 0x4f

    更理解的方式

        int reg = 0x0f;  //0000 1111
        //设置bit[6] = 1;第七个引脚输出高电平
        //reg = reg | 0x40;//0100 0000    //|  按位或   相应bit位 同时为0,结果0,否则1
        reg =reg | 1<<6;//左移6位
        printf("reg = 0x%x
    ",reg);//;reg = 0x4f

     //将bit[6] = 0 ;第七个引脚输出低电平

    int reg = 0x0f;  //0000 1111
            //将bit[6] = 0 ;第七个引脚输出低电平
        reg = reg & 0xffffffbf;//  1011->b
        printf("reg = 0x%x
    ",reg); //0x0f   // &  按位与   相同bit位 同时为1,结果1,否则0

    专业写法

        int reg = 0x0f;  //0000 1111
            //将bit[6] = 0 ;第七个引脚输出低电平
        //reg = reg & 0xffffffbf;//  1011->b
        reg = reg & ~(1<<6); //0100 0000   取反 -> 1011 1111
        printf("reg = 0x%x
    ",reg); //0x0f   

    条件运算 (三目运算符)

                   表达式1?表达式2:表达式3

         如果表达式1为真 执行表达式2 否则 执行表达式3

    /*
    * 输入一个整数
    * 如果是偶数 输出0
    * 如果是奇数 输出1
    * [输入一个0-100之间的数,如该用户输入不对,提示用户输入错误,如果是0-100输出 正确]
    */

        int r = 0;
        int num = 0;
        printf("输入一个整数:");
        scanf("%d",&num);
        //r = num%2?1:0;
        //printf("偶数0,奇数1 r=%d
    ",r);
        //num%2?printf("奇数
    "):printf("偶数
    ");
        num>=0 && num<=100?printf("正确
    "):printf("错误
    ");

    [使用条件运算]

    从键盘上 输入 一个年份
    输出 该年是否是闰年

    被4整除的年份但是不能被100整除
    或者能被400整除的也是

    用以下年份测试一下: 2000 2008 是闰年
    1900 2018 不是闰年

       (year%4 == 0) && (year%100 != 0) ||(year % 400==0)
       year%4 == 0 && year%100 != 0 ||year % 400==0

    对照 man operator 查看优先级





    何所为,不仅仅是一种态度,更是一种艺术!
  • 相关阅读:
    【NOIP2016练习】T3 subset (分块,状压DP)
    【CF173B】Chamber of Secrets(二分图,最短路)
    【CF721C】Journey(拓扑排序,最短路,DP)
    【BZOJ1040】骑士(基环树,树形DP)
    【CF725D】Contest Balloons(贪心,堆)
    【CF675E】Trains and Statistic(贪心,DP,线段树优化)
    【HDOJ2196】Computer(树的直径,树形DP)
    js继承
    原型模式
    创建对象
  • 原文地址:https://www.cnblogs.com/tanzizheng/p/12896020.html
Copyright © 2011-2022 走看看