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 查看优先级