c语言学习笔记

数据类型

无符号数和有符号数

在正常编码没有明确指出时候,默认为有符号数。关键字为signed。

无符号变量输入负数会发生模数运算

#include<stdio.h>

int main(){
	unsigned short f= -20;
    printf("%u/n",f);
    
    return 0;
}

标识符命名规则

1.标识符只能由数字、字母、下划线(_)组成

2.标识符不能以数字开头

3.标识符不能是关键字比如if

4.标识符区分大小写

隐式转换规则

规则一

取值范围小的,和取值范围大的计算,小范围会自动转换为大范围

int a =10;
double b =12.3;
c = a + b;

从大到小

double ,float ,long long ,long ,int , short, char
规则二

short char 类型的数据,在运算的时候先提升为int,再计算

强制类型转换

格式:目标数据类型 变量名=(目标数据类型)被强转的数据;

当大的数据类型转换为小的数据类型的时候发生强制类型转换。

运算符

自增自减运算符
  1. 单独使用, ++和–放在前面和后面作用一样
  2. 参与计算

++在后面

int a = 10;
int b = a++;
//此时的b等于10

++在前面

int a = 10;
int b = ++a;
//此时b为11
#include<stdio.h>

int main(void){
	int i = 10;
	int j = 5;
	int k = i++ + ++i - --j - i--;//10+11-4-10
	printf("%d\n", k);
	/*windos系统结果为7
    前缀优先于后缀,前缀统一自增、自减,再把结果拿来用
    后缀统一先用,等整个表达式变量用完了再进行自增
	*/
	return 0;

}
#include<stdio.h>

int main(){
    int a = 10;
    int k1 = a++ + a++;//先用后加,加完进行下一行计算
    int k2 = ++a + ++a;
    int k3 = ++a + a++;
    int k4 = a++ + ++a;
    printf("%d\n", k1);//20
    printf("%d\n", k2);//28
    printf("%d\n", k3);//30
    printf("%d\n", k4);//34
    
    return 0;
}
赋值运算符
符号说明举例
=直接赋值int a=10,将10赋值给a
+=加后赋值a+=b,将a+b的值给a
-=减后赋值a-=b,将a-b的值给a
*=乘后赋值a*=b,将a*b的值给a
/=除后赋值a/=b,将a/b的值给a
%=取余赋值a%=b,将a除以b的余数给a
关系运算符

通常是比较,比如==就是比较两个数是否相等,相等为0,不相等为1。

逻辑运算符
符号作用说明
&&两边都为真,结果才为真
||两边都为假,结果才为假
取反
三元运算符

格式:关系表达式?表达式1:表达式2;

例如

a > b ? a : b;
//当a > b为真的时候,执行a:b的a;当a > b为假的时候,执行a:b的b式子

分支语句

if
	if(判断句1){

	}else if(判断句2)
    {
		...
	}else
    {

	}
switch语句

格式:

switch(){
	case 1:
		语句1;
		break;
	case 2:
		语句2:
		break;
	...
	default:
		语句体n;
		break;
}

细节说明:

  • 表达式:计算结果只能为(字符/整数)
  • case:值只能是(字符/整数)的字面量,不能是变量
  • case:值不允许重复
  • break:表示中断,结束的意思,结束switch语句
  • default:所有情况都不匹配,执行该处的内容

循环结构

for循环语句
for (初始化语句;条件判断语句;条件控制语句){
	循环体;
}

求一到五的和

#include<stdio.h>

int main(void){
    
	int sum = 0;//定义一个变量用于累加数据
	
	for (int i = 1; i <=5; i++)
	{
		sum = i + sum;
	}
    //打印sum
	printf("%d\n", sum);//15
	
	return 0;
}
while循环
初始化语句
while(条件判断语句)
{
	循环体语句
	条件控制语句
}

for和while的对比

 相同点:运行规则是一样的
 不同点:1. for循环中,控制循环的变量,因为归属for循环的	  语法结构中,在for循环结束后,就不能再次被访问到。
   	   2. while循环中,控制循环的变量,对于while循环来	   说不归属其语法结构中,在while循环结束后,该变量还        可以继续使用。
do…while循环
初始化语句;
do{
	循环体语句;
	条件控制语句;
}while(条件判断语句);
//先执行后判断,循环体至少执行一次
continue
#include<stdio.h>

int main(){
	//跳过第三个
	for(int i = 1; i <= 5; i++)
	{
		if(i == 3)
		{
			continue;
		}
		printf("%d\n", i);
	}
}
循环嵌套
#include<stdio.h>

int main(){
	//跳过第三个
	for(int i = 1; i <= 5; i++)
	{
		for(int j = 1; j <= 5; j++)
		{
			printf("内循环执行%d\n", j);
		}
		printf("内循环结束\n");
		
	}
	printf("外循环结束\n");
	
	return 0;
}
跳出循环语句
break

跳出循环

#include<stdio.h>

int main(){
	//跳过第三个
	for(int i = 1; i <= 5; i++)
	{
		for(int j = 1; j <= 5; j++)
		{
			printf("内循环执行%d\n", j);
            break;//跳出内循环
		}
		printf("内循环结束\n");
		
	}
	printf("外循环结束\n");
	
	return 0;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

continue

continue跳过当前循环

#include<stdio.h>

int main(){
	//跳过第三个
	for(int i = 1; i <= 5; i++)
	{
		for(int j = 1; j <= 5; j++)
		{
			printf("内循环执行%d\n", j);
			continue;
		}
		printf("内循环结束\n");
		
	}
	printf("外循环结束\n");
	
	return 0;
}

在这里插入图片描述

goto
#include<stdio.h>

int main(){
	//跳过第三个
	for(int i = 1; i <= 5; i++)
	{
		for(int j = 1; j <= 5; j++)
		{
			printf("内循环执行%d\n", j);
			goto a;
		}
		printf("内循环结束\n");
		
	}
	a: printf("外循环结束\n");
	
	return 0;
}

goto跳到指定语句

在这里插入图片描述

函数

带有参数函数
#include<stdio.h>

void sum(int num1, int num2)//形参
{
	int sum = num1 + num2;
	printf("%d\n", sum);
}
int main(){
	sum(30 , 40);//实参
	sum(10 , 20);
	
	return 0;
}
带有返回值函数
#include<stdio.h>

double getArea(double len, double width)
{
    double area = len* width;
    return area;
}
int main(){
	//函数比较两个长方形面积大小
    double area1 = getArea(5.3, 2.7);//调用函数,接受参数
	double area1 = getArea(1.5, 0.8);
    if (area1 > area2)
    {
        printf("1");
    }
    else if(area1 < area2)
    {
        printf("2");
    }
    else
    {
        printf("0");
    }
	return 0;
}
函数注意事项
  • 函数不调用不执行
  • 函数名不能重复
  • 函数与函数之间是平级关系,不能嵌套定义
  • 自定义函数写在main函数下面时候需要在上方声明函数
  • return下面不能编写代码,执行不到
  • 函数返回值类型为void时候,表示没有返回值,return可以省略不写,如果书写return,后面不能跟具体数据,仅仅表述接二叔函数
常见函数和其头文件
#include<math.h>
int main{
	pow();
	sqrt();
	fabs();
}
stdio.h

	printf();
	scanf();
stdlib.h
	
	malloc()
	free()
	calloc()
	realloc()
	rand()
string.h
	
	strlen()
	strcmp()
	strlwr()
	strupr()
	strcat()
	strcpy()
time.h
	
	time()//获取当前时间
#include<stdio.h>
#include<time.h>

int main{
	//time小括号中表述当前时间是否需要在其他地方进行存储
	//返回值long long
	//从1978年1月1日开始
	long long res = time(NULL);
	printf("%lld\n", res);
	
	return 0;
}

数组

数据类型 数组名[长度]

数组初始化

定义数组时候,第一次给数组赋值。

//数据类型 数组名[长度] = {数据值,数据值...}
int arr[] = {1,2,3};//长度省略时候,数据值的个数就是数组长度。
double arr[2] = {0.0};//不知道具体的,只给一个值,剩下的值都为默认0,double是0.0,int是0
索引
  • 索引就是数组的一个编号,也叫角标、下标、编号
  • 特点:从0开始的,连续+1,不间断
#include<stdio.h>

int main()
{
	int arr[] = {1, 2, 3, 4, 5};
    //获取索引为0,2,4的元素,并求和
    int num1 = arr[0];
    int num2 = arr[2];
    int num3 = arr[4];
    int sum = num1 + num2 + num3;//1 + 3 + 5
    printf("%d\n", sum);
    printf("修改前:%d\n", arr[4]);
    arr[4] = 10;//修改下标为4的数据
    printf("修改后:%d\n", arr[4]);
	return 0;
}


数组遍历
#include<stdio.h>

int main()
{
	int arr[5] = {1,2,3,4,5};
    //利用循环遍历数组
    for (int i = 0; i <=4 ; i++)
    {
        printf("%d\n", arr[i]);
    }
	return 0;
}

数组在内存中存储方式
#include<stdio.h>

int main()
{
    //获取数组的内存地址
    int arr[] = {1,2,3};
    printf("%p\n", &arr);//数组首地址
    printf("%p\n", &arr[0]);//[]中的表示偏移量
    printf("%p\n", &arr[1]);//内存角度:首地址+偏移量
    printf("%p\n", &arr[2]);//
    //结果:00BEF9D8
    //00BEF9D8
    //00BEF9DC
    //00BEF9E0
    //差一个int类型的长度
	return 0;
}
数组注意事项

数组作为参数时候需要获取数组长度

#include<stdio.h>
void printArr(int arr[]);

int main()
{
    //获取数组的内存地址
    int arr[] = {1,2,3};
    //数组作为函数的参数,实际上传递的是数组的首地址,如果在在函数中对数组进行遍历,一定要把数组长度一起传递过去
    //定义处arr表示的就是完整的数组
    //函数中的arr只是一个变量,用来记录数组的首地址
	printArr(arr);
	return 0;
}
void printArr(int arr[])
{
	int len = sizeof(arr)/sizeof(arr[0]);
	for (int i= 0; i <= len; i++)
	{
		printf("%d\n", arr[i]);
	}
}
#include<stdio.h>
void printArr(int arr[], int len);

int main()
{
    int arr[] = {1,2,3};
    int len = sizeof(arr) / sizeof(int);
	printArr(arr, len);
	return 0;
}
void printArr(int arr[], int len)
{
	for (int i= 0; i <= len; i++)
	{
		printf("%d\n", arr[i]);
	}
}

数组练习

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
	//生成10个1-100之间的随机数存入数组
	//求出所有数据的和
	int arr[10] = { 0 };
	int len = sizeof(arr) / sizeof(int);
	//生成10个1-100之间的随机数存入数组
	//设置种子
	//生成随机数
	srand(time(NULL));//srand函数是用于生成随机数种子,决定随机数序列的起始值,用于每次生成的随机数序列不同。
	for (int i = 0; i < len; i++)
	{
		int num = rand() % 100 + 1;
		//随机数存入数组
		printf("%d\n", num);
		arr[i] = num;
	}
	//利用累加思想求和
	int sum = 0;
	for (int i = 0; i < len; i++)
	{
		sum = sum + arr[i];
	}
	printf("%d\n", sum);

	return 0;
}

反转数组

#include<stdio.h>
void printArr(int arr[], int len);

int main() 
{
	int arr[5] = { 0 };
	int i = 0;
	int len = sizeof(arr) / sizeof(int);//长度
	for (i;i<len ; i++)
	{
		printf("输入第%d个数\n", i+1);
		scanf_s("%d", &arr[i]);//存入数组
	}
	printArr(arr, len);
	printf("反转数组后:\n");
	int j = 0;
	int k = len - 1;
	while (j < k) 
	{
		int temp = 0;//临时的第三方变量,用于交换数据
		temp = arr[j];//反转数组
		arr[j] = arr[k];
		arr[k] = temp;
		j++;
		k--;
	}


	printArr(arr, len);

	return 0;
}

void printArr(int arr[],int len)
{	//函数打印数组
	for (int i = 0; i<len; i++)
	{
		printf("%d\n", arr[i]);
	}

}
数组查找

顺序查找

#include<stdio.h>
int order(int arr[], int len, int num);

int main()
{
	int arr[5] = { 1,1,3,4,4 };
	int i = 0;
	int len = sizeof(arr) / sizeof(int);//长度
	int num = 1;
    //index:-1表示无匹配数据,其他数字表示索引,索引是从零开始
	int index = order(arr, len, num);
	printf("%d\n", index);
	//缺点是数组中如果有多个相同数据时,只能返回第一个
	//在函数中遇到第一个匹配值就返回index值
	//终止函数继续循环
    //如果想要解决,需要把索引存入数组,函数返回数组指针。
	return 0;
}

int order(int arr[], int len,int num )
{
	int ar[10] = { 0 };
	for (int i = 0; i < len; i++) 
	{
		if (arr[i] == num) {
			//ar[i] = i;
			return i;
		}
	}
	return -1;
}
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值