首页 > 其他分享 >c语言学习笔记

c语言学习笔记

时间:2024-07-20 20:27:57浏览次数:12  
标签:arr main return 语言 int 笔记 学习 printf include

数据类型

无符号数和有符号数

在正常编码没有明确指出时候,默认为有符号数。关键字为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;
}

标签:arr,main,return,语言,int,笔记,学习,printf,include
From: https://blog.csdn.net/wotub/article/details/140449511

相关文章

  • Maskrcnn学习笔记--个人向
    论文名称:MaskR-CNN论文下载地址:https://arxiv.org/abs/1703.06870在阅读本篇博文之前需要掌握FasterR-CNN、FPN以及FCN相关知识。FasterR-CNN视频讲解:FasterRCNN_哔哩哔哩_bilibiliFPN视频讲解:1.1.2FPN结构详解_哔哩哔哩_bilibiliFCN视频讲解:FCN网络结构详解(语义分割......
  • 大模型如何学习知识?
    HowDoLargeLanguageModelsAcquireFactualKnowledgeDuringPretraining?通常认为,LLM在预训练中学习知识。但是LLM对长尾知识的习得很差。有观点认为,Attention的qkv结构是对知识进行抽取(q*k计算attn_score对v加权平均),MLP结构是知识记忆。下面通过实验进行深入分析。创建虚......
  • 第三周学习报告
    又经过了一周的学习,今天对本周学习进行总结本周学习了Java中数组、方法的相关知识。数组数组的定义格式一:数据类型[]数组名;格式二:数据类型数组名[];静态初始化在声明数组的同时,就为数组的每个元素分配初始值。数据类型[]数组名=new数据类型[]{元素一、元素二...};简化......
  • CNE-SUE论文阅读笔记
    NeuralNewsRecommendationwithCollaborativeNewsEncodingandStructuralUserEncoding论文阅读笔记Abstract存在的问题:​ 现有的研究通常将新闻标题和内容分开编码,而忽略了它们之间的语义交互,这对于新闻文本的理解是不够的。此外,以往的模型只对用户的浏览历史进行编码,......
  • 苍穹外卖学习笔记——第十二天
    数据统计(Excel报表)工作台需求分析和设计工作台是系统运营的数据看板,并提供快捷操作入口,可以有效提高商家的工作效率。产品原型工作台展示的数据今日数据订单管理菜品总览套餐总览订单信息名词解释营业额:已完成订单的总金额。有效订单:已完成订单的数量。订单完成......
  • BRAVE:扩展视觉编码能力,推动视觉-语言模型发展
    视觉-语言模型(VLMs)在理解和生成涉及视觉与文本的任务上取得了显著进展,它们在理解和生成结合视觉与文本信息的任务中扮演着重要角色。然而,这些模型的性能往往受限于其视觉编码器的能力。例如,现有的一些模型可能对某些图像特征视而不见,或者在处理图像时产生视觉幻觉,这些局限严重......
  • Datawhale AI 夏令营——CV图像竞赛(Deepfake攻防)——Task3学习笔记
        这一篇是在数据增强的方向上发力,尝试提升模型的表现。        数据增强的目的是通过人工方式增加训练数据的多样性,从而提高模型的泛化能力,使其能够在未见过的数据上表现得更好。对于图像而言,数据增强包括例如视角、光照、遮挡等情况,使得模型能够学习到......
  • Java学习路线图-进阶版
    好看的皮囊千篇一律、有趣的灵魂万里挑一文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。还有机会获得内推名额。文章目录一、Java基础二、MyS......
  • 第三周学习日历
    这一周在练车,感觉练学车好难...在空余时间我也学习了Java的一些知识,在学习中自己敲了一些代码记录下来...这周最大的进步是自己根据要求写了一个学生管理系统,虽然之前用C++写过类似的,但是用一门新的语言,有不同的成就感>_<7月15日参加了睿康的编程赛写出来3题半1000多名......
  • acwing学习笔记-数学知识
    文章目录数学知识一、质数1、试除法判定质数2、开方判定质数3、分解质因数4、筛质数(1)、埃氏筛法(2)、线性筛二、约数1、试除法求约数2、约数个数总结数学知识数学真是一个令人摸不着头脑的一个东西,小小的质数都可以把你拿捏得死死的一、质数1、试除法判定质......