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


相关文章
|
2月前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
|
3月前
|
存储 编译器 程序员
八:《初学C语言》— 函数的基本概念
【8月更文挑战第3天】本篇文章详细讲解了库函数与自定义函数的区别、函数的嵌套调用及链式访问、函数的声明和定义、static和extern等基础知识
34 1
八:《初学C语言》— 函数的基本概念
|
3月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
76 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
3月前
|
存储 编译器 程序员
【C语言篇】C语言常见概念
编译时,注释会被替换成⼀个空格,所以min/* 这⾥是注释*/Value会变成min Value,⽽不是minValue。这是C99标准新增的语法。
40 0
|
5月前
|
IDE Unix 编译器
一:《初学C语言》— C语言常见概念
在本篇文章中,详细讲述了C语言的常见概念。意在能够让读者初步了解C语言,为后续C语言的学习做铺垫
126 5
一:《初学C语言》—  C语言常见概念
|
4月前
|
存储 Java 程序员
【C语言入门】C语言入门:探索编程世界的基础概念
【C语言入门】C语言入门:探索编程世界的基础概念
105 2
|
5月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
5月前
|
存储 自然语言处理 编译器
C语言常见概念
C语言常见概念
|
5月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
108 7
|
6月前
|
Java C语言 C++
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现(上)
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现
52 4