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

004_stdc_C语言基础

单目 --> 一个操作数 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 查看优先级