C语言要点细细梳理(上)

1.类型转换

1.1 隐式类型转换

在两个不同类型数据进行运算时,会把低精度类型的数据转为与高精度类型一致的数据类型然后计算,然后再根据赋值的需要把计算结果转回去

1.2 强制类型转换

可以将某种类型的数据转换为想要的精度,一般int、double、float可以相互转,但是可能会损失精度。

  • 注意,如果想要将字符串强制转为int类型将会报编译错误

2. 输入输出控制

2.1 输出控制:printf

格式控制符%d的数量可以不与需要输出的字符数量对应,不会报错,但是会造成输出与预期不符的情况。
如果没有格式控制符,只有想要输出的变量,将会报编译错误

2.2 输入控制:scanf

输入存入的数据需要提供该数据的地址,形如&a(变量a的地址)
有两种典型的错误:

  • 未提供地址:如下所示,将会报编译错误
scanf("%d",a);
  • 提供地址数少于输入:如下所示,将会报运行时错误
scanf("%d %d",&a);//输入两个数据

2.3 输出格式控制(C风格)

指定解读方式

  • %d: 解读为有符号十进制(decimal)整数
  • %f:解读为单精度浮点数(float)
  • %u:解读为无符号(unsigned)十进制整数
  • %c:解读为单个字符(character)

例子:

int a =65;
printf("%d %c %f",a,a,a);
//输出结果为:65 A 0.000000

指定数据格式

控制宽度
  • %md:指定输出宽度为m,默认右对齐,如果不足则补空格
    在这里插入图片描述
控制小数位数
  • %.mf:指定暴力小数点后m位,四舍五入
    在这里插入图片描述
同时控制宽度和小数位数
  • %n.mf:指定宽度为n(默认右对齐),并且保留小数点后m位,注意小数点也占一个宽度,不足宽补空格
    在这里插入图片描述
指定输出整数的进制
  • %0x:将数据理解为整数,并且输出16进制表示,注意是零和x(x小写则16进制字母小写)(X大写则16进制字符大写)

在这里插入图片描述

使用指定字符控制宽度
  • %0md:指定整数宽度为m,宽度不足用0补齐
    在这里插入图片描述
需要输出%

连续使用两个%,前一个%作为转义符号

输入格式控制
scanf("Please input:%d",&a);
  • 上述代码指明了程序期望的用户输入格式
  • 如果用户按照Please input:1的格式输入,则可以正常运行
  • 如果直接输入1,不会报错,但是读取的输入会与预期不符合
一些例子

在这里插入图片描述

3.宏定义与不变量

3.1 宏(文本批量替换功能)

  • 在编程领域,“宏”就是指通过预设,对指定的文本内容进行替换
  • c语言中,通过#define预编译指令定义一个宏
  • 如下宏定义代码,在预编译阶段(即编译前),把源码中所有的PI改成对应的数字
#define PI 3.141592679545215498795461648794856213245978945123126748974653126857984653268757712954728768654554
  • 宏定义不止可以定义常量,也可以带参数定义:
    在这里插入图片描述
  • 需要注意宏定义是简单机械的替换,注意下面这个例子,为了避免这样的问题,可以在宏定义时对计算的值加上括号
    在这里插入图片描述

3.2 不变量

  • 不变量是加限制的变量,即不可通过赋值符号进行改变(i.e. 不可作为等号左值),在普通变量定义前加上const即可定义为不变量(注意是加在最前面)
  • 注意,试图通过等号为不变量赋值,将会报编译错误
  • 事实上,不变量只是限定为不能通过赋值符号赋值,不可以作为左值,但是可以作为右值参与运算,如果需要修改值,可以通过指针+间接引用改变绕过限制,但是不建议这么做

常见的错误理解:(A、B、D会编译错误,C绕过限制不报错,但是不推荐这样做)
在这里插入图片描述

3.3 宏定义与不变量辨析

  • 宏定义是预编译指令,本质是文本的替换,支持复杂的带参数的文本模式替换
  • 不变量是语句,本质是对变量的修饰,限定其不能通过赋值号赋值
#define定义的常量和const限定的不变量的区别

在这里插入图片描述

4.技术知识

4.1 转义字符

  • ‘\n’、‘\0’、‘\t’、‘’‘、’"‘、’\'等使用反斜杠

4.2 “溢出”

  • 例如unsigned int加到最大值,再加一会溢出,显示出来的值是0
  • 溢出其实是,最大值再加1回到最小值,最小值再减1回到最大值

4.3 小数

  • 整数除法的本质是做隐式类型转换:int=>float=>int
  • float=>int的类型转换是截除小数的,会损失精度,不会进行四舍五入
  • printf使用的格式控制用于指定对数据的理解和呈现方式,不是类型转换
  • %.mf指将数据理解为浮点数,并且呈现m为,涉及对数据的理解,会进行四舍五入

5. 函数

5.1 函数定义——做饼

明确函数 :

  1. 接收的参数
  2. 返回值类型
  3. 具体操作

函数的定义主要包括:指明返回值、明确参数列表、编写函数逻辑三部分

5.2 函数声明——画饼

明确函数:

  1. 接收的参数
  2. 返回值的类型

函数定义是函数的实际执行部分(工人师傅),函数声明就是明确接收什么返回什么(名片),不涉及细节

5.3 函数调用与传参

调用时找到声明即可。

  • 如果调用时看不到声明,则报编译错误
  • 如果找到声明找不到定义,则报链接错误
    在这里插入图片描述

5.4 函数返回值

  • 无论再函数内部何处,return语句的执行将立即结束函数并提交返回值
  • 函数结束后,再调用位置原地替换为返回值
  • 无需提供返回值用void

5.5 注意点

  • 函数声明可以放在另一个函数的定义中,但函数定义不可以,不同函数的定义需要隔离开来
  • 一个函数只能返回一个值

5.6 实参与形参

int sum(int a,int b){return a+b;
}
int main(){int m = 1,n=2;int res = sum(m,n);return 0;
}

上述代码中:

  • a,b是形式参数
  • m,n是实际参数

注意:

  • 函数声明的形参只是一个说明,其实没有变量名都可以,但是函数定义的形参真实存在
  • 函数传参其实是将实际参数的值copy给形式参数作为初始化,不变量也允许作为形参,请见下面的例题:

在这里插入图片描述

6. 分支结构branch

6.1 if-else-else if语句

判断闰年的if语句
闰年:

  • (1)四年一闰百年不闰:即如果year能够被4整除,但是不能被100整除,则year是闰年。
  • (2)每四百年再一闰:如果year能够被400整除,则year是闰年。
int a;
scanf("%d",&a);
if(a%4){printf("NO");
}else{if(a%100){ printf("YES");}else if(a%400){printf("NO");}else{printf("YES");}
}

6.2 条件表达式

  • 比较运算符:==、>、<、>=、<=、!=
  • 条件表达式:通过比较运算符对左右操作数进行运算
  • 逻辑运算符:&&、||、!

使用逻辑表达式表达复杂的组合判断逻辑,仍然是闰年问题:

if(a%4!=0||a%100==0&&a%400!=0){printf("NO");
}else{printf("YES");
}

运算符优先级

  • 算数运算符>!>比较运算符>&&>||
  • 即:先运算,再比较,最后组合

逻辑表达式的短路

  • 如果a=1,那么a||b一定是1,不用考虑b,即b被短路
  • 如果a=0,那么a&&b一定是0,不用考虑b,即b被短路

7. 循环结构

循环三要素:起点、终点、步长

7.1 while

  • while的执行:出口判断->执行一次循环->出口判断…
  • do-while的执行:执行一次循环->出口判断->执行一次循环…

为了避免将形如a==0的判断语句写成a=0造成不执行的情况,可以写成0==a,因为0=a会报编译错误

7.2 for

  • for适用于迭代:能够不重不漏地访问范围内所有元素
    for (int i = 0; i < 1; ++i) {printf("%d",a++);}
  • for执行的顺序:

      1. int i =0;
      1. i<1;
      1. printf(“%d”,a++);
      1. ++i
      1. 回到2
  • for括号内的两个分号不能少

7.3 循环控制

  • break:提前终止当前整个循环
  • continue:跳过本轮循环剩下的执行内容,直接开始下一次

8.数组

8.1 数组组成

  • 基础数据类型:int、float类型的数组
  • 自定义数据类型:struct、union类型的数组

8.2 数组初始化

  • 通过列表初始化:
//全部初始化
int a[7]={0,1,2,3,4,5,6};
//部分初始化
int b[7]={0,1,2};//未初始化默认为0,故b[7]={0,1,2,0,0,0,0};
//不确定个数初始化
int c[]={0,1,2};
int c_size = sizeof(c)/4;//c_size=3
//注意sizeof计算的是字节数
  • 注意,只有数组定义时才能批量初始化,定义完成后只能通过索引 访问

8.3 数组长度

  • C语言中的数组特指定长数组
  • 因此定义数组元素数量必须使用常量或不变量
  • 准确来说,是编译期能直接确定数值的量
  • 已经定义好长度的数组,访问超过长度范围的索引值,会报数组越界(运行时错误)
获取已定义数组的元素数量
int length = sizeof(a)/sizeof(int);

8.4 数组遍历

形如下:

int a[n];
for(int i=0;i<n;i++){a[i]=i;
}

8.5 多维数组

  • 实际上是按顺序排列的

9. 结构体

9.1 声明结构体

struct item{	//1.声明结构体int id;
};
struct item a;	//2.定义结构体变量a.id = 10;		//3.访问结构体变量的成员
  • 声明:让编译器知道存在这么一个东西
  • 定义:让编译器实际生成一个东西(分配空间)
声明与定义的两种形式
  • 先声明后定义
  • 声明并定义
    在这里插入图片描述
typedef关键字
typedef unsigned long long uint64;uint64 a;//= unsigned long long a;
  • typedef不是宏定义替换
  • typedef可以给类型取别名

注意与结构体声明并定义的区别!!
在这里插入图片描述

9.2 使用结构体

初始化结构体内部的成员变量
typedef struct student{char name[20];unsigned long long id;int age;float score;
}S;
//不得用等号,要用冒号
S s1 = {"Mike",2222,age:19,score:100.0f};//如果按照顺序初始化,可以不标注所赋值变量名 
结构体大小
  • 使用sizeof获取结构体变量所占内存大小,原则上来说,大小等于其所有数据成员大小之和
  • 例外情况:内存对齐:通常是4字节对齐,即如果定义结构体大小不是4字节的整数倍那么将向上对4取整

在这里插入图片描述

9.3 联合体union

联合体存在的意义

为什么有了结构体还要有联合体?

  • 场景1:各个成员互斥,同一时间只有一项生效
  • 场景2:同一个数据可以合起来解读,也可以分开多部分解读

联合体在内存资源紧张的平台(如嵌入式)广泛使用
在这里插入图片描述

计算内存空间占用问题
  • union没有内存空间对齐的要求,内存空间占用即为最大成员的内存空间占用
  • struct有内存空间对齐的要求,内存空间占用是所有成员占用空间总和,还要注意对4向上取整

在这里插入图片描述

联合体各个数据成员共享空间,对任意成员的修改都会反映到所有数据上

在这里插入图片描述

9.4 枚举类型enum

    enum day {a=1,b,c,d,e,f,g};enum day dd = b;printf("%d %d",dd,e);//输出:2 5

参考上述代码可知,enum相当于定义了一系列变量,默认按照递增顺序给未赋值的变量赋值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postman和Python Request测试多行Form-data

1、请求参数有多个&#xff0c;F12查看请求体如下&#xff1a; 查看源代码&#xff1a; ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-data; name"custId"IICON004 ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-da…

java数据结构与算法刷题-----LeetCode417. 太平洋大西洋水流问题

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 深度优先遍历 深度优先遍历 解题思路&#xff1a;时间复杂度O( …

【Pt】马灯贴图绘制过程 04-玻璃脏迹

目录 效果 步骤 一、透明玻璃 二、烟熏痕迹 三、粗糙 四、浮尘 效果 步骤 一、透明玻璃 1. 打开纹理集设置&#xff0c;着色器链接选择“新的着色器链接” 在着色器设置中可以看到此时名称为“Main shader &#xff08;Copy&#xff09;” 这里修改名称为“玻璃” 在…

非关系型数据库-----------Redis的主从复制、哨兵模式

目录 一、redis群集有三种模式 1.1主从复制、哨兵、集群的区别 1.1.1主从复制 1.1.2哨兵 1.1.3集群 二、主从复制 2.1主从复制概述 2.2主从复制的作用 ①数据冗余 ②故障恢复 ③负载均衡 ④高可用基石 2.3主从复制流程 2.4搭建redis主从复制 2.4.1环境准备 2.4…

文件夹0字节:数据恢复全攻略与防范之道

在日常使用电脑或移动设备的过程中&#xff0c;我们经常会遇到各种各样的问题&#xff0c;其中文件夹突然变为0字节的情况尤为令人头疼。这种情况通常意味着原本存储着重要文件的文件夹突然变得空空如也&#xff0c;文件大小显示为0字节。面对这样的数据灾难&#xff0c;许多人…

VSCode调试C++

1、环境准备 1.1、g的安装与使用 1.1.1、安装 方式一&#xff1a;Xcode安装 苹果的开发集成工具是Xcode.app&#xff0c;其中包含一堆命令行工具。 在 App store 可以看到其大小有好几个G&#xff0c;有点大。 方式二&#xff1a;Command Line Tools 安装 Command Line Too…

03 Python进阶:MySQL - mysql-connector

mysql-connector安装 要在 Python 中使用 MySQL 数据库&#xff0c;你需要安装 MySQL 官方提供的 MySQL Connector/Python。下面是安装 MySQL Connector/Python 的步骤&#xff1a; 首先&#xff0c;确保你已经安装了 Python&#xff0c;如果没有安装&#xff0c;可以在 Python…

从零到一:基于 K3s 快速搭建本地化 kubeflow AI 机器学习平台

背景 Kubeflow 是一种开源的 Kubernetes 原生框架&#xff0c;可用于开发、管理和运行机器学习工作负载&#xff0c;支持诸如 PyTorch、TensorFlow 等众多优秀的机器学习框架&#xff0c;本文介绍如何在 Mac 上搭建本地化的 kubeflow 机器学习平台。 注意&#xff1a;本文以 …

js表达式

js 数据&#xff1a; 字面量 1 123 变量 a 表达式 12 2*2 a&&b 表达式都会有一个返回结果。表达式仍然是数据&#xff0c;所有可以写字面量&#xff0c;变量的地方都可以写表达式 在JavaScript中&#xff0c;表达式中的运算符具有不同的优先级&#xff0c;这决定…

【.NET全栈】ZedGraph图表库的介绍和应用

文章目录 一、ZedGraph介绍ZedGraph的特点ZedGraph的缺点使用注意事项 二、ZedGraph官网三、ZedGraph的应用四、ZedGraph的高端应用五、、总结 一、ZedGraph介绍 ZedGraph 是一个用于绘制图表和图形的开源.NET图表库。它提供了丰富的功能和灵活性&#xff0c;可以用于创建各种…

国外媒体推广软文宣发:促进海外宣发新风尚,迈向国际舞台

大舍传媒http://www.dashemeijie.com 序言 伴随全球经济一体化发展趋向&#xff0c;越来越多的中国企业希望在国际舞台上表现自己的总体水平。而国外媒体软文发稿作为一种全新的海外宣传方式&#xff0c;正逐渐成为促进海外宣发新风尚的主要常用工具。接下来我们就探讨国外媒…

uniapp自定义卡片轮播图

效果图 1、封装组件 <template><view><!-- 自定义卡片轮播 --><swiper class"swiperBox" :previous-margin"swiper.margin" :next-marginswiper.margin :circular"true"change"swiperChange"><swiper-ite…

Vue项目中 安装及使用Sass(scss)

普通方法 一、安装使用scss 1. 安装 scss npm install scss --save2. 安装 node-sass 和 sass-loader sass-loader&#xff1a;把 sass编译成css node-sass&#xff1a;nodejs环境中将sass转css 提示&#xff1a;限制 node-sass&#xff0c;sass-loader 版本号&#xff0c;…

华为服务器RAID配置教程 服务器硬盘故障处理帮助 浪潮RAID配置教程 磁盘阵列配置通用教程

前言&#xff08;本文档持续更新&#xff09; 本文主要记录服务器配置RAID&#xff08;磁盘阵列&#xff09;过程中存在的细节问题及官方文档无法解决的问题的解决方案 配置环境 华为 RH2288 v3服务器配置RAID组 如何快速配置 1.找到服务器品牌的阵列卡型号&#xff0c;找不到…

了解 Solidity 语言:构建智能合约的首选编程语言

了解 Solidity 语言&#xff1a;构建智能合约的首选编程语言 Solidity 是一种用于编写智能合约的高级编程语言&#xff0c;广泛应用于以太坊和其他以太坊虚拟机&#xff08;EVM&#xff09;兼容的区块链平台。它是以太坊智能合约的首选语言之一&#xff0c;具有丰富的功能和灵活…

hexo博客7:构建简单的多层安全防御体系

【hexo博客7】构建简单的多层安全防御体系 写在最前面理解全面安全策略的重要性防御常见的网络攻击1. SQL注入攻击2. 文件上传漏洞3. 跨站脚本攻击&#xff08;XSS&#xff09;4. 跨站请求伪造&#xff08;CSRF&#xff09;5. 目录遍历/本地文件包含&#xff08;LFI/RFI&#x…

基础篇3 浅试Python爬虫爬取视频,m3u8标准的切片视频

浅试Python爬取视频 1.页面分析 使用虾米视频在线解析使用方式&#xff1a;https://jx.xmflv.cc/?url目标网站视频链接例如某艺的视频 原视频链接 解析结果: 1.1 F12查看页面结构 我们发现页面内容中什么都没有&#xff0c;video标签中的src路径也不是视频的数据。 1.2 …

SCP 从Linux快速下载文件到Windows本地

需求&#xff1a;通过mobaxterm将大文件拖动到windows本地速度太慢。 环境&#xff1a;本地是Windows&#xff0c;安装了Git。 操作&#xff1a;进入文件夹内&#xff0c;鼠标右键&#xff0c;点击Git Bash here&#xff0c;然后输入命令即可。这样的话&#xff0c;其实自己本…

LabVIEW电力设备在线监测系统

LabVIEW电力设备在线监测系统 在电力行业中&#xff0c;变电站的稳定运行对于保障电力系统的安全性和可靠性至关重要。开发了一种基于LabVIEW软件开发的变电站电力设备在线监测系统&#xff0c;实时监控变电站内部的电力设备状态&#xff0c;确保电力传输的高效与安全。通过对…

Hadoop和zookeeper集群相关执行脚本(未完,持续更新中~)

1、Hadoop集群查看状态 搭建Hadoop数据集群时&#xff0c;按以下路径操作即可生成脚本 [test_1analysis01 bin]$ pwd /home/test_1/hadoop/bin [test_01analysis01 bin]$ vim jpsall #!/bin/bash for host in analysis01 analysis02 analysis03 do echo $host s…