函数
函数有什么用呢?函数可以简化我们主函数的代码,可以帮助我们编码更加的机构化,使得我们的代码比较的有逻辑结构,一方面可以帮助我们的代码更有层次感,另一个面也是可以简化我们的代码量的!
一般而言,主函数的代码量不要超过500行,那么我们可以利用函数进行封装
函数又可以分为:有返回参数的函数和没有返回参数的函数(void)
输入一个数字,返回0-该数字里面有多少个奇数!并打印出来!
#include <stdio.h> int main() { int i = 0; int num = 0;//定义输入参数 int total = 0;//定义计数器 printf("请输入一个数字:"); scanf("%d", &num); for (int i = 0; i <= num; i++) { if (i % 2 == 0) { total+=1; } else { printf("奇数:%d\n", i); } } printf("一共有%d个奇数",total); return 0; }
在我运行的时候,我发现这个代码的运行了较长的时间,这说明时间复杂度比较高,而且代码的写的比较的冗余,所以导致了代码的长时间运行!后面我们可以采用递归,指针地址等方法进行优化!
利用函数进行封装
//定义函数 int sum_num(int num, int total) { for (int i = 0; i <= num; i++) { if (i % 2 == 0) { total += 1; } else { printf("奇数:%d\n", i); } } return total; } #include <stdio.h> int main() { int num = 0;//定义输入参数 int total = 0;//定义计数器 printf("请输入一个数字:"); scanf("%d", &num); printf("一共有%d个奇数", sum_num(num, total)); return 0; }
注意在定义函数的时候要分清楚,是否有返回参数,其次参数需要定义类型,之间是用逗号隔开的,每一个参数都需要定义类型
如果,在函数内部定义一些变量,那么在调用之后就会被销毁,如果需要在函数外部定义,就需要考虑到变量的生命周期
后续的指针和递归,包括数组,在函数的应用比较多,所以尤其需要注意!
数组
什么是数组,在哪里可以用到数组?首先假设一个场景,假设你现在需要记录你的每次消费记录,每次消费都将你的消费记录存放到一个内存中,那么传统的基本语法还可以实现吗?显然有点有心无力的感觉!
C语言中给了数组的定义:一组相同类型元素的集合
数组的定义
int arr[10] = { 0 };//初始化数组 int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
这里对数组进行初始化,我们首先定义了10个空间对其进行初始化,那么也就是说这个数组里面有10个0。
数组的下标
数组的访问和Python的索引比较的类似,数组的每个元素都有一个下标,下标是从0开始的。
通过增加一行代码,就可以实现数组的变化,这里也是充分利用到数组的访问规则
这里只是简单的介绍数组的概念,至于深入的讲解,我们会在后续的文章中继续深入剖析其本质原理的。
操作符
算术操作符
+ - * / %
简单的操作符,对其进行加减乘除,需要注意的是这里的/,如果除数和被除数都是整型的那么返回是一个有很多的小数点的数字。
7/2=3.00000
如果是包含浮点数的数字,那么结果也会出现什么呢?
7/2.0=3.5
%:取模,也叫求余,一定要注意的是取模操作符只能应用于整数哦,浮点数是不可以的,这点一定要注意。比如:7 % 2 = 1;(商3,余1)
移位操作符
为什么叫移位操作符呢?因为其作用于一个数的二进制位
>> <<
位操作符
这里的“位” 指的是二进制位
按位与&:对应的二进制位有0,则为0,全1在为1;
按位或|:对应的二进制位有1,则为1,全0才为0;
按位异或^:对应的二进制位相同,则为0,相异才为1;
注意:对位操作实际上是对存储在内存上的二进制位进行操作的,然而整数在内存上存储的是其二进制的补码形式,所以对位操作,也就是对二进制的补码进行的操作。
& ^ |
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
条件运算符,又称为三目运算符,表达式1为真,则计算表达式2的值,跳过表达式3。也就是说表达式2的结果就是整个表达式的结果;反之,若表达式1为假,跳过表达式2,直接计算表达式3的值,也就是说表达式3的结果就是整个表达式的结果。
exp1 ? exp2 : exp3
逗号表达式
注意:逗号表达式会从左向右依次计算,整个表达式的结果是最后一个表达式的结果
exp1, exp2, exp3, …expN
下标引用、函数调用和结构成员
[] () . ->
常见关键字
auto break case char const continue default do double else enum
extern float for goto if int long register return
short signed sizeof static struct switch typedef union unsigned
void volatile while
define不是关键字
其次关键词不能自己创建,也不能作为变量名
关键字typedef
typedef 顾名思义就是类型定义,这里应该理解为类型的重命名。
typedef unsigned int uint_32; /*由于unsigned int比较复杂,所以用typedef将它重命名为uint_32, 所以此时uint_32就是一个类型名,代表了unsigned int*/