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\n",average);
    printf("还剩下%d\n",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\n",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\n",0x3&0x1);  //0x1
    //0000 1010 0xa 
    //0000 1001 0x9  |
    //-------------
    //0000 1011 0xb
    printf("0xa | 0x9=0x%x\n",0xa|0x9);  //0xb
    //0000 1111 0xf
    //1111 0000 0xf0 ~
    printf("~0xf=0x%x\n",~0xf);  //0xf0
    //0000 1100
    //0000 1111   ^
    //------------
    //0000 0011
    printf("0xc^0xf = 0x%x\n",0xc^0xf);
    //0000 1100    0xc<<2
    //0011 0000   0x30
    printf("0x1<<1 = %d\n",0x1<<1);
    printf("0x1<<2 = %d\n",0x1<<2);
    printf("0x1<<3 = %d\n",0x1<<3);
    printf("0x3<<2 = %d\n",0x3<<2);
//0000 0001    1>>1
    printf("0x1>>1 = %d\n",0x1>>1);
    char c = 0x81;//1000 0001 ==>11110000
    printf("c>>3 = %x\n",c=c>>3); //0x10
    unsigned char uc = 0x81; 
    uc=uc>>3;
    printf("uc>>3 = 0x%x\n",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\n",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\n",reg);//;reg = 0x4f//将bit[6] = 0 ;第七个引脚输出低电平
int reg = 0x0f;  //0000 1111
        //将bit[6] = 0 ;第七个引脚输出低电平
    reg = reg & 0xffffffbf;//  1011->b
    printf("reg = 0x%x\n",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\n",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\n",r);
    //num%2?printf("奇数\n"):printf("偶数\n");
    num>=0 && num<=100?printf("正确\n"):printf("错误\n");[使用条件运算]
从键盘上 输入 一个年份
    输出 该年是否是闰年
被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 查看优先级