手写C语言之基本概念及编程技巧总结(04)

简介: 手写C语言之基本概念及编程技巧总结

函数

函数有什么用呢?函数可以简化我们主函数的代码,可以帮助我们编码更加的机构化,使得我们的代码比较的有逻辑结构,一方面可以帮助我们的代码更有层次感,另一个面也是可以简化我们的代码量的!

一般而言,主函数的代码量不要超过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;
}

image.png


在我运行的时候,我发现这个代码的运行了较长的时间,这说明时间复杂度比较高,而且代码的写的比较的冗余,所以导致了代码的长时间运行!后面我们可以采用递归,指针地址等方法进行优化!

利用函数进行封装

//定义函数
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;
}

image.png


注意在定义函数的时候要分清楚,是否有返回参数,其次参数需要定义类型,之间是用逗号隔开的,每一个参数都需要定义类型


如果,在函数内部定义一些变量,那么在调用之后就会被销毁,如果需要在函数外部定义,就需要考虑到变量的生命周期


后续的指针和递归,包括数组,在函数的应用比较多,所以尤其需要注意!



数组

什么是数组,在哪里可以用到数组?首先假设一个场景,假设你现在需要记录你的每次消费记录,每次消费都将你的消费记录存放到一个内存中,那么传统的基本语法还可以实现吗?显然有点有心无力的感觉!

C语言中给了数组的定义:一组相同类型元素的集合


数组的定义

int arr[10] = { 0 };//初始化数组
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素

这里对数组进行初始化,我们首先定义了10个空间对其进行初始化,那么也就是说这个数组里面有10个0。


image.png


数组的下标

数组的访问和Python的索引比较的类似,数组的每个元素都有一个下标,下标是从0开始的。

image.png


通过增加一行代码,就可以实现数组的变化,这里也是充分利用到数组的访问规则


image.png


这里只是简单的介绍数组的概念,至于深入的讲解,我们会在后续的文章中继续深入剖析其本质原理的。


操作符

算术操作符


+ - * / %


简单的操作符,对其进行加减乘除,需要注意的是这里的/,如果除数和被除数都是整型的那么返回是一个有很多的小数点的数字。


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*/


相关文章
|
16天前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
27 1
|
18天前
|
C语言 开发者
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
31 5
|
16天前
|
程序员 编译器 C语言
C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项
本文深入解析C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项,并通过实际案例分析,展示预处理器指令在代码编写与处理中的重要性和灵活性。
48 2
|
18天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
29 2
|
3月前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
170 8
|
4月前
|
存储 编译器 程序员
八:《初学C语言》— 函数的基本概念
【8月更文挑战第3天】本篇文章详细讲解了库函数与自定义函数的区别、函数的嵌套调用及链式访问、函数的声明和定义、static和extern等基础知识
38 1
八:《初学C语言》— 函数的基本概念
|
4月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
96 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
6月前
|
IDE Unix 编译器
一:《初学C语言》— C语言常见概念
在本篇文章中,详细讲述了C语言的常见概念。意在能够让读者初步了解C语言,为后续C语言的学习做铺垫
135 5
一:《初学C语言》—  C语言常见概念
|
4月前
|
存储 编译器 程序员
【C语言篇】C语言常见概念
编译时,注释会被替换成⼀个空格,所以min/* 这⾥是注释*/Value会变成min Value,⽽不是minValue。这是C99标准新增的语法。
44 0
|
5月前
|
存储 Java 程序员
【C语言入门】C语言入门:探索编程世界的基础概念
【C语言入门】C语言入门:探索编程世界的基础概念
118 2