《C语言程序设计现代方法》note-1 C语言概述

news2024/11/5 14:37:10

文章目录

    • 助记提要
    • 1章 C语言概述
    • 2章 C语言基本概念
      • 2.1 C程序的一般形式
      • 2.2 C程序变为可执行文件的步骤
      • 2.3 C程序注释
      • 2.4 变量和赋值
        • 变量类型
        • 声明
        • 赋值
        • 初始化
        • 显示值
      • 2.5 读取输入
      • 2.6 定义宏
      • 2.7 标识符和关键字
        • 标识符
        • 不能作为标识符的关键字
      • 2.8 C程序书写规范

助记提要

这些知识都是之前学过,所以助记提要只写自己模糊的部分。

  1. C语言最基本的3要素;
  2. float型赋值需要在末尾加后缀f的原因;
  3. C语言的关键字;

1章 C语言概述

  1. C语言的优点
  • 高效。可以在有限的内存空间快速运行。
  • 可移植。C语言编译器规模小且容易编写,C语言没有不兼容的多个分支。
  • 功能强大。数据类型和运算符多。
  • 灵活。既可以系统编程,也可以编写各种应用程序。
  • 有标准库。涵盖了许多实用操作。
  • 和UNIX集成。擅长结合UNIX系统。
  1. C语言的缺点
  • 容易隐藏错误。C的灵活性导致它易出错,并且编译器无法检查到。
  • 可能难以理解。C语言有其他通用语言没有的特性,本身就常常被误解。这些特性互相结合使用,有些结合方式难以理解。
  • 难以修改。C语言没有类、包之类的特性,大规模的C程序必须提前考虑维护的问题。
  1. 高效使用C语言
  • 学习和规避C语言的缺陷
  • 使用调试工具发现错误
  • 使用编码规范
  • 要易于理解,避免过于简单或复杂的代码
  • 尽量使用标准库,保证程序的移植性

2章 C语言基本概念

预处理指令、函数、变量、语句

2.1 C程序的一般形式

指令

int main(void)
{
	语句
}

C程序必要的3个特性:指令、函数和语句。

  • 指令
    指令是指由预处理器执行的命令。所有的指令都是以字符#开头的,默认只占一行,结尾没有分号或其他特殊标记。

  • 函数
    函数是一系列组合在一起的语句。函数有两类,一是用户自己编写的,二是由C语言编译器提供的,后者称为库函数。
    C程序就是函数的集合。一个C程序可以包含多个函数,但是main函数是必须有的,系统在执行程序时会自动调用main函数。

  • 语句
    语句是程序运行时执行的命令。一个语句可以连续占用多行,有时很难确定结束位置。C语言使用分号作为语句的结尾。

2.2 C程序变为可执行文件的步骤

  1. 预处理。程序送给预处理器,预处理器执行以#开头指令。
  2. 编译。经过预处理后进入编译器,把程序翻译为机器指令(目标代码)。
  3. 链接。链接器把目标代码和所需的其他代码整合在一起,生成可执行程序。

2.3 C程序注释

注释可以在C程序的任何位置出现。可以单独占行,也能和其他命令出现在同一行中。
注释一般以/*开始,以*/结束。

单行注释的写法

/* 单行注释 */

// 单行注释

可执行的语句  // 注释

多行注释的写法

/* 第一行
   第二行*/

// 第一行
// 第二行

/* 第一行 */
/* 第二行 */

为了让注释更易读:

/***************
 * 注释         *
 * 注释         *
 ***************/

/*
 * 注释
 */

2.4 变量和赋值

变量是程序执行过程中临时存储数据的单元。

变量类型

类型用来说明变量存储的数据种类,每个变量都必须有类型。
类型影响变量的存储方式、变量能存储的值范围和允许对变量进行的操作。
最常用的两种类型:整型int和浮点型float
int类型用来存储取值范围有限的整数。
float类型可以存储带小数位的数。
float的算数运算比int类型慢,并且float类型存储的数值往往是是实数值的近似值,有时会出现误差。

声明

使用变量前必须对变量进行声明。
声明变量的语法是先指定变量的类型,然后说明变量的名字。

// 类型 变量名;
int height;
float area;
// 同类型的变量可以放到同一行声明,逗号隔开
int length, width;
float income, expend;

为了和旧版的C语言兼容,最好把函数中的变量声明都放在语句之前。

赋值

赋值,把值交给变量。使用等于号=,将右侧的值赋值给左侧的变量。赋值语句也必须是分号结尾。
赋值之前必须先声明。赋值之后,就可以使用变量进行各种计算了。

// 对已声明的变量赋值
height = 8;
area = 25.6;

一般整型的值赋给int型变量,浮点型的值赋给float型变量。不这么做也可以,但是会不安全。

float型的值在赋值时,最好在值后面加字母fF

area = 25.6f;

不加字母的f的赋值仍然可以编译成功,但是可能会引起编译器的警告。
系统把数值存在常量缓冲区,默认用int存储整数,用double存储浮点数(double是比float型使用更大空间的浮点类型)。不加f,系统会默认把带小数点的数值当成double浮点数处理,然后再转换为float类型,这样有可能导致精度丢失。

初始化

程序开始执行时,某些变量会被自动设置为0,有些则不会。
访问未初始化的值时,可能会得到不可预知的结果甚至导致程序崩溃。

可以在变量声明时加入初始值:

int height = 0;
int length = 0, width = 0;
显示值

C语言使用printf函数显示变量的当前值。
printf函数来自标准输入/输出库<stdio.h>,需要通过#include指令中引入。

#include <stdio.h>

int main(void) {
	int height = 8;
	float area = 25.6f;
	// 显示整型值
	printf("height: %d\n", height);
	// 显示浮点型值
	printf("area: %f\n", area);
	// 显示表达式的值
	printf("width: %f\n", area / height);
	return 0;
}
height: 8
area: 25.600000
width: 3.200000

%d%f是占位符,用来指明后面的变量值在显示的时候所处的位置。\n表示这一行结束,下次显示从下一行开始。
%d用于int变量,%f用于float型变量。
%f默认会显示小数点后6位数字,可以用%.nf的格式指定它显示n位小数:

printf("area: %.2f", area);
area: 25.60

2.5 读取输入

标准输入输出库中的另一个函数scanf可以读取用户的输入,把值传递给变量。
scanfprintf类似,都需要用到%d%f等格式来定义传入的数据:

// 接收值,存到指定的变量
scanf("%d", &height);
scanf("%f", &area);

运算符&用来把收到的值存给指定的变量,通常是scanf必须的。

2.6 定义宏

程序中经常使用到某些常量时,最好给这些常量命名,以便后期阅读程序的人明白该常量的含义。

C语言可以使用宏定义给常量命名,命名后的常量名称为宏。

#define PI 3.14159f

#define是类似#include的预处理指令,所以末尾不需要分号。
编译时,预处理器会把程序中出现PI的地方都替换为开头为它定义的值。

宏的名字只使用大写字母,是程序员遵循的代码规范。(并不是C语言的要求。)

2.7 标识符和关键字

标识符

标识符是程序中对变量、函数、宏和其他实体的命名。
标识符可以使用字母、数字、下划线,但是必须以字母或下划线开头。
C语言是区分大小写的,字母大小写不同的标识符有完全不同的意义,定义时尽量让无关的标识符看起来不同。

标识符的长度是有限制的。C89只要求编译器记住前31个字符(C99是63个),因此编译器无法区别前31个字符相同的两个标识符。

传统的程序员定义标识符一般使用小写字母加下划线的规范。另一种风格是把每个单词的首字母大写,不使用下划线。后一种风格由于在Java、C#中广泛使用而更加流行。

// 下划线连接单词
current_page
// 单词首字母大写
currentPage
不能作为标识符的关键字

C语言内置的关键字,对编译器来说有特殊意义,不能被用户当做标识符使用。
数据类型关键字

关键字说明
char声明字符变量
int声明整型变量
short声明短整型变量
long声明长整型变量
float声明浮点型变量
double声明双精度浮点型变量
signed声明有符号类型变量
unsigned声明无符号类型变量
struct声明结构体变量
union声明共用体或联合数据类型
void声明函数无返回值或无参数;声明无类型指针
enum声明枚举类型

控制语句关键字

关键字说明
if条件语句
else条件语句的否定分支
swich多条件判断语句
caseswitch语句的一个分支
defaultswitch语句的默认分支
for遍历型循环
while条件循环
do和while结合创建至少执行1次的循环
break退出循环或switch
continue跳过本轮循环,开始下轮循环
goto直接跳转到程序中的标记位置
return函数终止,返回结果

存储类型关键字

关键字说明
auto声明自动变量
extern声明其它文件定义的变量
register声明寄存器变量
static声明静态变量

其它关键字

关键字说明
const声明只读变量
sizeof计算数据类型的大小
typedef为数据类型取别名,用于自定义数据类型
volatile修饰的对象不能被编译器优化

C99新增的关键字

关键字说明
inline用于函数定义,让编译器把函数代码直接插入调用处,提高程序效率
restrict用于指针声明,该指针是访问某一块内存区域的唯一途径
_Bool引入布尔类型,存储0或1,使逻辑运算更直观
_Complex声明复数类型
_Imaginary声明纯虚数类型,和_Complex配合使用

2.8 C程序书写规范

C程序可以看作一连串记号组成的,每个记号是无法在不改变含义的条件下分割的字符组。
标识符和关键字是记号,运算符、逗号、分号也是记号。

一般情况下,记号之间的空格数量没有严格规定,除非他们并在一起后会产生第三个记号,否则它们之间是不需要留空格的。但是添加足够的间隔可以让程序变得易读。C语言允许在记号之间插入任意数量的空格符、制表符和换行符,C程序的书写规范由此而来。

  • 过长的语句可以分开放在任意多行内
  • 记号间尽量使用空格分开,便于区分
  • 嵌套程序使用缩进,更容易识别
  • 空行可以将程序分为不同的块,更易于辨别其逻辑结构

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

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

相关文章

第1篇 引言

一、AIGC概念 1、AIGC定义 AIGC&#xff0c;即生成式人工智能&#xff08;Artificial Intelligence Generated Content&#xff09;&#xff0c;是指利用人工智能技术自动生成或辅助创作内容的过程和结果。 简单来说&#xff1a;过去&#xff0c;写文章、画张图、唱首歌、弄个…

2. 从服务器的主接口入手

Webserver 的主函数 main.cpp&#xff0c;完成了哪些功能&#xff1f; #include "config.h"int main(int argc, char *argv[]) {string user "";string passwd "";string databasename "";Config config;config.parse_arg(argc, a…

向量数据库 PieCloudVector 进阶系列丨打造音乐推荐系统

在上一篇内容中&#xff0c;我们介绍了 PieCloudVector 如何助力构建基于图片数据的商品推荐系统&#xff0c;详细描述从数据集的准备到数据向量化处理&#xff0c;再到向量数据的存储和相似性搜索的完整流程。本文将进一步探讨如何将 PieCloudVector 应用于音频数据&#xff0…

python之数据结构与算法(数据结构篇)-- 栈

一、栈的概念 这里我们不去了解教科书上面的“教条概念”&#xff0c;其实“栈”的概念和古代的时候的“客栈”是有异曲同工之妙的。 在这里我们把客栈看成“栈”&#xff0c;旅客看作“栈元素” 1.当旅客进来住店时&#xff0c;叫做“入栈”&#xff1b; 2.当旅客退房时&#…

Java调用chatgpt

目前openai的chatgpt在国内使用有一定难度&#xff0c;不过国内的大模型在大部分情况下已经不弱于chatgpt&#xff0c;而且还更便宜&#xff0c;又能解决国内最敏感的内容安全问题。本文后续以spring ai调用国内chatgpt厂商实现为例&#xff0c;讲解怎么构建一个java调用chatgp…

web前端多媒体标签设置(图片,视频,音频)以及图片热区(usemap)的设置

多媒体标签运用 在HTML中有以下常见多媒体标签&#xff1a; <img> &#xff08;图像标签&#xff09; - 作用&#xff1a;用于在网页中嵌入图像。 - 示例&#xff1a; <img src"image.jpg" alt"这是一张图片"> 。其中 src 属性指定图像的…

安卓开发之数据库的创建与删除

目录 前言&#xff1a;基础夯实&#xff1a;数据库的创建数据库的删除注意事项 效果展示&#xff1a;遇到问题&#xff1a;如何在虚拟机里面找到这个文件首先&#xff0c;找到虚拟机文件的位置其次&#xff0c;找到数据库文件的位置 核心代码&#xff1a; 前言&#xff1a; 安…

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…

《AI在企业战略中的关键地位:以微软和阿里为例》

内容概要 在当今商业环境中&#xff0c;人工智能&#xff08;AI&#xff09;的影响力如滔滔洪水&#xff0c;愈演愈烈。文章将揭示AI在企业战略中的崛起&#xff0c;尤其以微软和阿里巴巴为代表的企业&#xff0c;这两家科技巨头通过不同方式&#xff0c;将智能技术融入其核心…

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>

【ESP32】ESP-IDF开发 | I2C从机接收i2c_slave_receive函数的BUG导致程序崩溃解决(idf-v5.3.1版本)

1. 问题 在调试I2C外设的demo时&#xff0c;按照官方文档的描述调用相关API&#xff0c;烧录程序后发现程序会不断崩溃&#xff0c;系统log如下。 初步分析log&#xff0c;原因是访问到了不存在的地址。一开始我以为是自己的代码问题&#xff0c;反反复复改了几次都会出现同样的…

企业数字化转型实施中的挑战与解决方案:架构引领的战略路径

在企业推动数字化转型的过程中&#xff0c;通常会面临复杂的挑战。随着技术的不断演进和业务环境的变化&#xff0c;企业架构&#xff08;Enterprise Architecture, EA&#xff09;成为帮助企业应对这些挑战的关键工具。通过提供一个全面的战略蓝图&#xff0c;EA使企业能够在保…

桑基图在医学数据分析中的更复杂应用示例

桑基图&#xff08;Sankey Diagram&#xff09;能够有效地展示复杂的流动关系&#xff0c;特别适合用于医学数据分析中的多种转归和治疗路径的可视化。接下来&#xff0c;我们将构建一个稍微复杂的示例&#xff0c;展示不同疾病患者在治疗过程中的流动&#xff0c;以及他们的治…

[SICTF Round4] PWN

这PWN题似乎是给我出的&#xff0c;4个一血1个2血。密码又过于简单。逆向太难了又不大会。 Stack fengshui main可以溢出覆盖rbpret所以它每一步都需要移栈。 可用的ROP里没有pop rdi,在4004c0里有错位的01 5d c3 &#xff1a;add DWORD PTR [rbp-0x3d], ebx 并且有对应的p…

消息中间件类型介绍

ActiveMQ&#xff1a; ActiveMQ可是个老将了&#xff0c;它功能全面、稳定可靠&#xff0c;还支持多种协议和编程语言。如果你需要一个兼容性好、易于集成的消息中间件&#xff0c;ActiveMQ可是个不错的选择。 RabbitMQ&#xff1a; RabbitMQ以其简单易用和高性能著称。它支持丰…

【设计模式系列】组合模式(十二)

目录 一、什么是组合模式 二、组合模式的角色 三、组合模式的典型应用 四、组合模式在Mybatis SqlNode中的应用 4.1 XML映射文件案例 4.2 Java代码使用案例 一、什么是组合模式 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;其核…

Ghidra无头模式(自动化批处理执行重复性任务)

Ghidra无头模式&#xff08;自动化批处理执行重复性任务&#xff09; 与Ghidra GUI探索单个项目中的单个文件不同&#xff0c;Ghidra headless analyzer&#xff08;Ghidra无头分析器&#xff09;更加适合批处理和用脚本控制Ghidra。 &#xff08;一&#xff09;启动analyzeHea…

【大众点评】店铺评论 加密参数生成逆向分析

点击好评 https://www.dianping.com/ajax/json/shopDynamic/allReview 分析参数_token 直接搜_token 共17个&#xff0c;优先看和请求相关的 给第一个_token打上断点&#xff0c;然后切换评论&#xff0c;就直接断住了 n h(i, e.sendData) _token: n 现在给它打上断点&am…

Fsm3

采用读热码编写方式&#xff1a; module top_module(input clk,input in,input areset,output out); ////reg [3:0]A 4d0001;// reg [3:0]B 4d0010;//reg [3:0]C 4d0100;// reg [3:0]D 4d1000; //1、首先用读热码定义四个状态变量parameter A 4d0001 ,B 4d0010, C 4d01…

在腾讯云服务器上部署MaxKB项目(基于LLM大语言模型的知识库问答系统)

前言 一&#xff0c; MaxKB介绍 MaxKB是基于LLM大语言模型的知识库问答系统&#xff0c;旨在成为企业的最强大脑。它支持开箱即用&#xff0c;无缝嵌入到第三方业务系统&#xff0c;并提供多模型支持&#xff0c;包括主流大模型和本地私有大模型&#xff0c;为用户提供智能问…