☆数据类型
类型/名称 分类 作用 打印方式 字符长度(一个字符8位)
int/整形 long/short 返回量为整数 printf("%d\n", i); 占4个字符/long/short占用4/2
float/浮点型 double 双精度 返回量均可为小数 printf("%f\n",i) 4个字符/8个字符
char/字符型 字符串常量和字符常量:打印一串或者一个字符 printf("%c\n",i); 占1个字符
signed/unsigned有符号类型,无符号类型
#define标识常量 定义之后可以全局引用
☆Aacall码:十进制Ascall码48 -57对应字符0~9,十进制A-Z对应字符97-122 ‘空格’对应32
'\n'对应10
☆变量
储存类型:自动型变量默认不写:auto不在程序中体现出来。
寄存器变量:register int a; 寄存器不用打印取地址&a。寄存器与cpu内部连接与内存位置无关
静态变量:static int a;
特点:a不赋值时默认为0,内存在全局区中存放,变量只会随着程序结束而结束
static 修饰变量的区别:修饰局部变量时仅能用于函数局部,修饰全局变量时仅能作用于当前文件调用
外部变量extern fun() :可以调用fun()函数个所有文件使用
全局变量:定义在函数体外部,未初始化初始值默认为0。 extern int global_a;
任意文件2只要在全局中添加extern int global_a; 则文件2可以调用global_a文件内容,编译时gcc 文件1.c 文件2.c -o文件12。
生命周期:同程序共存亡
存储位置:全局区存放未初始化的全局和静态
局部变量:定义在函数体内部,未初始化为初始值随机。
生命周期:同函数共存亡
存储位置:栈区存放局部变量
大小端:多字节数据在存储时,会以某种大端和小段两种方式放到内存中
小端存储:低到低,高到高
大端存储:低到高,高到低
☆运算符:在程序中经常与if中条件结合,用来判定不符合
算数运算符: +-*/这里注意/是向下取整砍掉小数 "="是赋值运算, "=="才是等于
sum%2:取sum这个数对2的余数,如果==0,那么说明整除是偶数
sum/数:sum对这个数取整。求num的个位:num%10. 求sum的十位:num/10%10。求sum的百位就是sum/100%10......
逻辑运算符:&&有0出0,全1才1。 || :有1出1,全0才0。^异或:相异出1,相同出0。 !():将()里的内容取反 ,特别注意与或运算有截断原则。 左移n位 << 右边补n个0相当于数乘2^n次方。 右移n位 >> 左边要补n个1 相当于数/2^n,特别注意!这里的右移运算是向下取整-50 >> 2 = -50 / 4 = -13
运算优先级背诵口诀:单算移关羽,异或罗条赋
自增自减(重点!!!)
++i:是i先加1后在输出值
--i:是i减1后在参与取值
i++:是先取i的值后在加1
i--:是先取i的值后在减1
类型1:int x, y=1; x=y++; printf("x=%d y=%d", x, y); 输出结果x=1,y=2
类型2:int x =1; printf("x=%d", x++); 先打印x=1这步运算 printf("x=%d\n",++x); 前一步输出后+1=2 在打印++x之后等于3。
类型3独立成句 int x =1; x++;printf("%d\n",x); ++x;printf("%d\n",x); 输出结果都为2.
☆控制语句
☆if分支语句---应用于范围较大的选择
单纯if(非0为真)
执行printf("\n".)
if()
printf("\n",)
多重if选一个,如果符合第一个条件下面的条件23就不执行了
if(条件1)
{
表达式(1);
}
else if(条件2)
{
表达式2;
}
else
{
表达式3;
}
☆if嵌套
if(条件1成立)
{
if(条件2成立)
{
表达式1;
}
else若干语句后必须打括号
{
表达式2;
}
}
else
{
表达式3;
}
return 0;
注意! 括号问题:如果if不打括号就仅顺序执行第一个语句,esle前面必须要跟上if对应,且else后面不允许跟条件,if else后面跟若干语句则必须要打{}。
个人需注意的问题:
if(区别x=1是赋值将1给x,x==1是逻辑判断是x为1)
printf("请输入:");后面必须跟上scanf("%",&i)不要落下&
if的应用:海伦公式求三角形面积; 输入三个数按照大->小排序; 按照成绩排序;
排序注意!这里的交换顺序需要多定义一个中间商变量t:如果a>b;先将a赋值给t然后a空了,在将b赋值给a然后b空了,再将t中a的值赋值给b,完成ab交换。
海伦公式注意:三条边的条件分别是两边之和不能大于第三边,area面积和p半周长的公式要背过。sqrt函数在调用是需要引用数学库文件#include<math.h> 并且在编译时需要后面加上 -lm!!
☆switch分支语句--用于关系明确的选择条件
功能:判断switch后面表达式结果,和case后面的常量进行匹配,匹配成功实现case功能。
int a = 常量;
switch(变量或表达式):要判断啥switch括号里就写啥
{
case (常量1):printf("");
break;
case (常量2):printf("");
break;
....
....
default:默认放最后:匹配不上执行其他情况
printf("");
}
return 0;
注意!switch(不能是表达式或者浮点型)
如果case后面的语句不加break;就会一直向下执行不结束。
case空格+常量 后面一定加:
向下取整只能用整形(int)score/10
case字符要加单引号,case字符串要加双引号。
应用:加减乘除分别匹配并且计算
注意的问题case 后面的+-*/均为字符需要用单引号
while循环三要素:初值,终止条件,变化
while循环求对100求和
int i = 1;初值
while(i <= 100)终止条件
{ sum =sum +i; i++;}自增自减 printf("%d\n",sum);
do while循环
int i = 1;先做在循环
do
{
sum = sum + i;
i++;
}while(i <= 100);
while(1)死循环
{
break语句与continue的区别
for(i=0; i<3; i++)
{
if(n%3 == 0)
break/continue;终止当前for循环/ 跳出本次循环直接进行下一次
}
printf("%d",n);
注意! continue,break必须要写在循环里面。
}
for循环(初始值;结束条件;自增)
for(一i=1; 二i<=100; 四i++)
{
三sum = sum + i;
}
执行顺序:先执行表达式一 给循环变量赋初值,判断表达式二是否成立,如果成立就进入循环执行语句块三,执行完语句三就执行四在回来判断表达式2是否成立。
☆for循环嵌套
for(一i=0; 二i<3; 三i++)
{
for(四j=0; 五j<4; 六j++)
语句块;
}
执行顺序:先执行一,判断二,如果符合则进入下面for循环,再次先执行四,判断五如果符合五,则执行语句块,运行六自增直到不符合条件五之后,则进行三自增一次,一次进行。
应用99乘法表。水仙花数。输入任意两个整数,输出两数之间(包括这两个数)偶数之和。
注意!水仙花数的范围是100~999,对个位,十位,百位的获得方式 ,pow(,)需要引用#include<math.h>头文件。
偶数之和:需要注意输入的两个数不光是从小到大能取得偶数只和,还要从大到小取得。偶数就是对2取余==0
getchar()按照字符输入
功能:从终端输入一个字符/ int ret;
参数:没有 ret = getchar();
返回值:Ascall码 printf("%d\n", ret);
应用大小写字母的转化
☆垃圾字符
getchar() / scanf("%*c", &a); / scanf("空格%c",a);
注意!如果单独打印字符就用getchar(); 吃掉'回车'
putchar()打印字母输出函数
功能:向终端输出一个字符
参数:要输出字符的Ascall码值
返回值:一般不接受返回的Ascall
功能:键盘输入
数组:有顺序关系的若干变量的元素集合。
一维数组定义常量: int a[6]; a:数组在内存中首地址,是个地址常量,是不能被赋值和a++的。
访问元素:数据组[下标]; 下标范围[0到n-1];千万不要越界;
特点:1)数据类型相同
2)数组内存是连续的 并且每个地址相差4个字节。
数组的初始化
全部初始化:a[5] = {1,2,3,4,5};
部分初始化:没被赋值的元素全部为0 例如a[5] = {1,2,3}; 那么a[3] a[4]均为0
定义一个空数组 int a[5] = {};
定义一个空数组的方式:int a[5] = {};
引用时需注意!
必须先定义在引用
每次只能引用一次a[i]
打印数组元素地址用%p
想引用所有数组中元素,需要循环遍历用for,打印时一定是&a[i],数组遍历肯定用
int main()
{
int a[] = {1, 2, 4, 7, 8, 98};
int i,n;
n = sizeof(a) / sizeof(i); 计算数组a的总长度 n = 数组个数/数组类型
for(i=0; i<n-1; i++)
{
printf("%p\n", &a[i]);
}
puts("");
}
return 0;
注意!数组和指针取地址时必须用%p。
数组名字定义好了之后不允许修改。
数组不做越界检查,编写时注意定义的a[6],i值最大只能是0~5。
应用斐波那契前15项求和的思路:先找到数列的规律是前两个数相加等于后面的那个数,通过int a a[15] ={1,1};将a[0], a[1]赋值为1 剩下的13个数通过for循环找规律依次累加。在通过for循环i自减的形式打印出所有逆序数。
注意:打印时数组的下标,还有数组千万不能越界问题。