数据类型
有符号char型的取值范围:-128~127,无符号的:0~255
当超过取值范围时,由于char为8个字节,溢出后截取后八位并把最高为符号位也拿来使用
1.%d 有符号10进制整数
2.%i 有符号10进制整数
3.%o 无符号8进制整数
4.%u 无符号10进制整数
5.%x 无符号的16进制数字,并以小写abcdef表示
6.%X 无符号的16进制数字,并以大写ABCDEF表示
7.%F/f 浮点数
8.%E/e 用科学表示格式的浮点数
9.%g在输出的时候我们使用%g会有什么样的奇特用法呢,比如我们想要输出一个12.3,但是如果你选择使用%f作为格式符,就会输出12.300000。但是很多时候我们只想要打印出12.3,这个时候可以选择%g进行格式化,输出结果就会变成12.3。它将后面无用的0全部舍去
10.%c 单个字符
11.%s 字符串
静态变量和动态变量的区别
动态变量:每次被调用都会被赋初值。
静态变量:多次调用函数时,只有第一次会被赋初值,其余调用时,其值都是上次该函数执行结束后的值。
全局变量都是静态变量,函数中加static关键词修饰的变量也是静态变量,格式为static+类型名+变量
常见的预处理指令
使用ifndef防止头文件被重复包含和编译
#ifnfef x //先测试x是否被宏定义过
#define x //如果没有宏定义下面就宏定义x并编译下面的语句
...
...
#endif //如果已经定义了则编译#endif后面的语句
宏定义相关作用符
换行符 “\”
#define print printf("1");\
printf("2");\
printf("3")
片段连接符“##”
“##”是一种分隔连接方式,作用:先分隔,后强制连接。
scanf混合使用输入需要注意:
当用到%c%c%c时,空格也是一个字符
在输入输出数值数据时,如输入空格、回车、Tab键或遇非法字符,认为该数据结束
puts和printf的区别
puts输出后会自动换行;
puts就是输出字符串,printf支持多种输出格式
if语句代数法交换值
#include <stdio.h>
int main()
{
int data1;
int data2;
int datatemp;
printf("请输入\n");
scanf("%d %d",&data1,&data2);
if(data1 > data2)
{
datatemp = data1;
data1 = data2;
data2 = datatemp;
}
printf("%d %d",data1,data2);
}
Switch...case语句
#include<stdio.h>
int main()
{
int data;
printf("请输入一个数:\n");
scanf("%d\n",&data);
switch(data)
{
case 1:
puts("满足条件1\n");
break;
case 2:
puts("满足条件2\n");
break;
case 3:
puts("满足条件3\n");
break;
default:
puts("其他非列表的情况\n");
}
return 0;
}
break与continue的区别
break是跳出整个循环,而continue是跳出当前循环,当前循环不执行后面的语句,但是会继续下一次的循环
for(let i =0;i<5; i++){
console.log('第'+i+'次循环');
}
for(let i =0;i<5; i++){
if (i==3) {
continue;
}
console.log('第'+i+'次循环');
}
or(let i =0;i<5; i++){
if (i==3) {
break;
}
console.log('第'+i+'次循环');
}
while循环、for循环、do-while循环
while语句是一种入口条件循环,也就是说,在执行多次循环之前已决定是否执行循环。因此,循环有可能不被执行。
for循环结构:for(初始化表达式;循环控制语句;增值表达式)
{
语句序列;
}
初始化表达式,循环控制语句,增值表达式都是可以不写的
int i=0;
int n=10;
for(;;)
{
if(i<10)
break;
printf("循环\n");
i++;
}
do...while语句:会在执行循环控制表达式前先执行一遍循环体(这第一遍循环体是不进行判断的,直接执行)
数组
一维数组
数据类型 数组名[常量表达式]
int a[6]
数组不初始化,其元素是随机数。
对static数组元素不赋初值,系统会自动辅以0值。
当全部元素赋以初值时,可不指定数组长度。
冒泡排序法
#include<stdio.h>
int main()
{
int array[] = {12,3,4,9};
int i = 0;
int j = 0;
int length = sizeof(array)/sizeof(array[0]);
for(i=0;i<length-1;i++)
{
for(j=0;j<length-1-i;j++)
{
if(array[j]<array[j+1])
{
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
}
for(i=0;i<length;i++)
{
printf("%d",array[i]);
}
return 0;
}
运行结果:12,9,4,3
二维数组
数据类型 数组名[常量表达式][常量表达式]
行 列
int a[3][2];
a->数组的起始地址,a[0][0]->0行0列元素的地址
字符数组
字符串结束标志:‘\n’
函数
实参:在进行函数调用时,必须要有确定的值,以便把这些值传给形参
形参:形式参数只有在调用时才会实例化(分配内存单元),调研完后自动销毁了,因此形式参数只在函数中有效
形参和实参可以一样
函数的调用
传值调用
调用时系统先计算实参表达式的值,再将实参按位置赋给形参,即对形参的初始化
传址调用
把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式
函数可以嵌套但不可以嵌套使用
在main函数先定义函数,可以不声明函数
先定义再调