C语言学习笔记(二)
八进制
把二进制所有数位从右向左的每三个数位分成一组,每组用一个数字替代,替换后的结果叫八进制
0110 1010 01 101 010
1 5 2 (八进制) %o->占位符 0152 八进制开头数字必须用0开头
十六进制
把二进制所有数位从右向左的每四个数位分成一组,没组用一个数字替换,替换后的结果叫十六进制
1100 1010
C B (十六进制) %x/%X->占位符 0xCB 八进制开头数字必须用0x开头
%x--> 小写做站位符时显示结果所有字符都为小写的
%X--> 大写做站位符时显示结果所有字符都为大写的
操作符
单目操作符,双目操作符,三目操作符
printf("如果需要显示%符号需要用两个 %% 不能使用\%");
=赋值操作符从右向左计算
* 复合赋值操作符的优先级和赋值操作符的优先级一样低
* num *= 2+3; *号和=好一个优先级先算 2+3 再 *=
* ++与 -- 单目操作符,只能与存储区使用,不能和数配合使用
* 不要在一条语句里对同一变量进行多次自增或自减计算
** num=num+++ ++num;不要在程序里面同一变量进行两次自增自减操作
逻辑操作符——结果一定是布尔值
!相反数
位操作符
按位取反 ~是一个单目位操作符,把二进制内容按位求反
按位与 & 两个数只要一个位是0,当前位结果就是0
数与0与都为0,和1与数不变
按位或 | 两个数只要一个位是1,当前位结果就是1
按位异或 ^ 两个数位上的数字一样为 0 ,否则为 1
位移操作 >> / <<
无符号位类型数字右移动时左边空出来的位置填充0
有符号位类型数字右移动时左边空出来的位置填充符号位
一般情况下向左移动n位相当于乘以2的n次方
…… 向右…… 除以 ……
所有的位操作符不会修改存储区的值
三目运算符号
* 如果表达式里包含的数字类型不同,计算机必须首先把它们转换成同一个类型而后进行处理
* 这个转换过程叫隐式类型转换,完全由计算机完成
* 隐式类型转换中一定是把占地小的类型转换成占地大的类型
* sizeof(1?1:0.9)(sizeof输出的值是多少)
* 如果多个数字的类型不同但占地大小一样,就把有符号类型转换成无符号类型,把整数类型转换成浮点类型
* -7+ 3u > 0 (真)
强制类型转换有可能导致数据丢失
intnum = (char)300; num == 44;
占位符类型字符用于控制输出项
%d 十进制输出
%o 八进制输出023(八进制显示)
%xX 十六进制输出0xffff,大写%X是以大写输出0xFFFF
%u 十进制无符号输出23u无符号
%f/%g 单精度输出 12.2000f 表示/%g显示时忽略小数点后的零
%lf/%lg 双精度输出小数点默认双精度输出/%lg同上
%c 单字符输出
%s 字符串输出
格式输出
- 左对齐,右边填空格
+ 符号位输出
流程控制语句
if……else
switch……case……default……
for
goto
嵌套循环
while
break;
continue;
随机数
#include <time> //获取系统时间从而让随机数随时更新
#include <stdlib.h>
srand() ——设置随机数种子
rand() ——获取伪随机数
任何函数之需要设置一次随机数种子
缓冲区
输入缓冲区
scanf();
使用了输入缓冲区,用户在键盘上输入的数字首先进入输入缓冲区,而后才进入程序存储区
先进入输入缓冲区的数据首先被处理,如果先输入的数字没被处理,则后输入的数字不会被处理
如果用户输入的数据格式和程序要求的格式不一致就可能导致以后输入的数据都无法的到处理
scanf("%*[^\n]");
scanf("%*c"); --清空输入缓冲区
输出缓冲区
printf();
在以下四种情况输出缓存区里的东西会显示在屏幕上
1、'\n' \n前面的内容会显示在屏幕上
2、程序结束了,输出缓冲区的内容会显示在屏幕上
4、缓冲区填满了也会显示在屏幕上
3、fflush(stdout); 强制把输出缓冲的内容输出在屏幕上
scanf("%d",&num);//此语句类似fflush(stdout);机制强制刷缓冲区
数组
数组一旦存在则里面包含的存储区个数不可改变
数组声明的时候应该初始化
1.int arr[4] = {1, 2, 3, 4};
数组名称不可以代表存储区,所以不能放在赋值操作符的左边
int a[5]={0};
a= 0; //错误
a代表存储区呢第一个元素的地址
sizeof(a)关键字小括号里可以使用数组名称,这样计算出来的是整个数组包含的字节个数
变长数组
c99规范里允许使用边长数组
在程序一次运行过程中变长数组里的存储区个数是不能改变的
如果程序多次运行则每次数组里包含的存储区个数可以不同
边长数组不可以初始化
二维数组
它可以表示存储区的一次分组情况
多函数程序的执行模式
所有时间段必须连续的并且任何俩个时间段不能重叠
volatile可以用来声明变量,如果变量对应的存储区同时被多个程序使用就应该用这个关键字
+声明这个变量
不论那个方向的数据传递都需要使用被调用函数提供的一组存储区
数组形式参数
c语言里函数参数个数可以不固定这个参数叫做变长参数
编写变长参数函数时不能给参数命名,在被调用函数里需要使用特殊方法获得形式参数的内容
除了主函数以外的所有函数都应该显示声明,已防止函数与隐式声明产生冲突
exit(0); #include <stdlib.h> 退出整个程序
递归函数
如果一个问题很复杂,难以直接解决,它可以分解成几个小问题,其中至少有一个小问题和
+原来的问题本质上一样,只不过稍微简单一点,这种问题可以采用递归函数解决
递归函数编写的步骤:
1、编写语句描述问题的分解方式(假设递归函数已经完成)
2、在递归函数开头别写分支处理不能分解的情况(这个分支要保证能让递归函数结束)
采用循环解决问题的思路叫递推
采用递归函数解决同样问题的思路叫递归
<续 : C语言学习笔记(三)>