感兴趣的朋友们可以留个关注,我们共同交流,相互促进学习。
文章目录
前言
我们在上个文章学习了,常量变量的作用域,生命周期以及等等,我们了解了字符串,转义字符注释等相关了解,我们还了解了选择语句和循环语句中的while语句,剩下的for和do while 循环之后会进行详细分析。
。
八、函数
就像数学中的函数,y=f(x)
C语言中的函数也跟数学中的函数也差不多。
例如以下代码,一下代码是求两个和:
cpp
#include <stdio.h>
int main( )
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d %d",&num1,&num2);//输入
sum = num1+num2;//求和
printg("%d\n",sum);
return 0;
}
我们用函数来写求两个数的和:
cpp
#include <stdio.h>
int main( )
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d %d",&num1,&num2);//输入
sum =Add(num1,num2);//求和
printg("%d\n",sum);
return 0;
}
这里的Add就是一个函数,来进行相加,我们可以把它想象成为一个工厂,对输入的材料进行加工,最后产出产品。这里的Add要进行加法操作,所以传进来的要是两个数,加数和被加数,也就是num1和num2,之后返回一个结果;
cpp
Add(int x,int y)
{
int z = 0;
z = x+y;
return z;
}
我们来进行Add函数的实现,首先是Add函数的名字,函数里面要传入两个数,我们在这里认为传入的数是两个整数,所以定义这两个数分别是x和y,函数的外壳写好了,接下来该分析函数内部如何实现,要计算两个数相加,我们定义一个整形z来表示结果,z等于这两个数进行相加,最后返回z,因为z是整形,所以函数返回的类型是整形。这时这个函数就写好了,在main函数中调用和传入参数就可以了。这里num1和num2叫做传入参数。
函数比较方便,随时调用,避免了重复。
九、数组
(1)数组的定义
当我们存储1-10的数字,我们是否要定义十个变量来进行存储,那样就会很麻烦,也许会觉得也就写十行代码的事,但要是要存储100个数字呢,是否还是一句一句打出来,那样是真的很麻烦。所以才会出现数组这个概念。
数组中可以存放一组相同类型的元素,也就是一组相同类型元素的集合。
cpp
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
上列代码就是数组的创建和初始化,我们命名数组的名字为arr,想让它里面有十个元素,所以定义里面10,又想让它的元素都是整形,所以在前面定义Int,添加等号来写数组里面的十个数从1-10。这样就创建了一个包括10个整形元素的数组。
(2)数组的下标和使用
数组里的元素是放在内存里面的,数组里每个元素都有下标的,而下标是从0开始的,如下:

是可以通过下标的方法来找到数组中的元素的,如下,如果我们想要通过下标来找到数字7,那么就要访问下标为6的元素。
cpp
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[6]);
如果我们想把所有元素打印出来,可以通过while和下标来打印出来,while使i从0循环到9,也就是arr元素的下标,也就打印出来了这十个数:
cpp
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[6]);
int i = 0;
while(i<10)
{
printf("%d",arr[i]);
}
十、操作符
C语言中提供了非常丰富的操作符,使得C语言非常的灵活,什么事都可以干。
(1)算数操作符
算数操作符
- * / %
算数操作符就是加减乘除和取余(%),当我们用15除(/)上一个2的时候,结果就是7 ,除法默认是整形,取余(模)就是得到余数。
如果我们除法想要得到小数的时候,我们前面给这个变量定义成float浮点数类型,之后用%f来输出结果,也就是打印浮点数类型,如果你那么想,那就错了哈哈。
如果除号的两端都是整数,那么执行的是整数的除法,除号两边至少有一个是浮点数才能执行浮点数的除法。
但是当取模的时候,两边都是整数才行。
(2)移位操作符
移位操作符
>> <<
左移和右移,这些都跟二进制有关,后续会进行深入了解
(3)位操作符
位操作符
& ^ |
按位与 按位或 按位异或,也与二进制有关,到后面深入了解
(4)赋值操作符
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
cpp
int main( )
{
int a = 0;//初始化
a = 20; //赋值
a = a+5; //a+=5;
return 0;
}
当我们初始化一个变量a,并且赋值给20,想要加5还赋给a,也可以写成a=a+5, 这与a=a+5一样,没有差别。其它的也都一样,进行操作后又赋值给自己。
(5)单目操作符
单目操作符
! 逻辑反操作
- 负值
- 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置,后置--
++ 前置,后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
cpp
// ! 的使用
int main( )
{
int a =5;
if(a)
{
printf("OK\n");
}
if(!a)
{
printf("NO\n");
}
return 0;
}
在C语言中,非零为真,0为假,所以在这里,a不为假,在这里会进行下一步操作,也就是打印OK,如果我们想要进行打印NO,那么就要a为假,这里就用到了!,表示相反的逻辑,如果这时候a为0,所以这时候就打印NO。
cpp
// -
int a = 10;
int b = -a;
这里b的数就是-10,这就是负号的使用,而当用到正号的时候。
cpp
// +
int a = -10;
int b = +a;
当时我也以为b是10,但是结果出来后确是-10,没有发生变化,所以正号也可以省略不用写。
&后续会进行分析。
重点:sizeof是操作符
cpp
int a =10;
float f =5.5f;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(f));
sizeof 是操作符 ,是计算变量所占内存空间的大小,单位是字节,这里a和f的字节数都是4,我们也可以将a和f换成int和float,所以里面放变量名也好,或者是变量的类型来说,结果都是一样的,两种写法都可以。
而我们之前提到的strlen是库函数,是计算字符串长度的,统计的是字符串\0之前出现的个数。而sizeof不管里面是什么,它只统计占用的字节内存是多少。
cpp
// ++
int a =100;
int b = a++;
当++在后面的时候,这是后置++,先使用,后++,也就是先使用100,之后在自增1,变成了101。
当++在前面的时候,就是前置++,与之前的相反,也就是先加1,再使用,这时候a和b都是101。
--操作符也是这个原理,相同的逻辑但是不同的运算。
cpp
//(类型)强制类型转换
int main( )
{
int a =(int)3.14;
printf("%d\n",a);
return 0;
}
当我们写一个整形变量a的时候 ,想把3.14赋值给a,如果不加(Int),编辑器就会报错,说你可能会丢失数据,当加上(int)的时候,就将3.14强制类型转换,转换为整形,只保留正数部分。
(6)关系操作符
>
>=
<
<=
!= 用于测试"不相等"
== 用于测试"相等"
关系操作符就这么几个,用来表示关系,判断大小关系,其中==是判断相等的,而一个等号=就是赋值,当写选择语句的时候,要考虑清楚,两个等号是用来判断,一个是用来赋值。
(7)逻辑操作符
&& 逻辑与
|| 逻辑或
逻辑与的意思就是并且,两个都需要,而逻辑或是或者的意思,来一个就行或者两个都来,
cpp
int a =3;
int b =5;
if(a && b)
{
printf("OK\n");
}
一般是用来判断真假,也可以用来选择范围,这里a为3,b为5,两个同时是真,所以会打印OK,如果有一个是0,则不会打印,因为非0为真。
&&两边同时为真才为真,有一个为假了就为假。
|| 两边同时为假才为假,有一个为真就为真。
(8)条件操作符
exp1 ? exp2 : exp3
cpp
int a = 0;
int b = 0;
int m = 0;
scanf("%d %d", &a,&b);
if(a>b)
m=a;
else
m=b;
printf("%d\n",m);
这是一个比较两个数输出较大值的一个简单写法,如果觉得这样写繁琐,就可以用条件逻辑符来进行写:
cpp
m=(a > b ? a : b);
如果表达式1里面的a>b这个条件为真,表达式2就执行,也就是返回a的值,如果表达式为假,就返回b的值,这个只能用于简单的语句。
(9)逗号表达式
exp1 , exp2 , exp3 , ...expN
(10)下标引用、函数调用和结构成员
\] ( ) . -\>
\]下标引用操作符 下标引用,就是刚才用数组通过下标来访问元素的符号。 ()函数调用操作符 上文中写了一个两个数相加的函数,Add来调用的时候,后面的()就是函数调用操作符。 . 和 -\>是结构成员访问操作符 操作符非常的丰富 ,后续都进行深入了解。这里先简单的了解一下,不同场景用不同操作符。 ## 十一、常见关键字 关键字必须要知道有什么,因为当我们在定义变量的时候,如果不知道关键字,就有可能会用关键字名字来命名变量名字,这些关键字是C语言事先预定好的,变量的命名之前说事不能有关键字的。 > auto break case const continue default do else enum > > extern for goto if register return sizeof static struct > > switch typedef union volatile while char double float int > > long short signed unsigned void **auto**关键字一般被省略了,因为局部变量一般都是在作用域里面自动创建自动销毁的,所以它其实前面有一个auto ,由于所有局部变量前面都有auto,所以就省略掉了。 **break**可以打破循环,在循环中可以使用。 **case**是在分支语句switch中使用。 **类型**有关:auto cha r int short long float double signed(有符号的) unsigned(无符号) static void enum const union typedef **循环**有关:break continue do while **分支**有关:if else switch case break default goto **声明外部符号**:extern **寄存器**:reister **函数**:return **计算所占内存大小**:sizeof 先进行了解,用多了就记住了。 *** ** * ** *** ## 总结 码要用手敲才会熟练 先了解,后续会一个个进行详解,对于我来说也是受益匪浅。