C语言-c语言组成
1.C语言的组成
一个C源程序是由 一个或者多个.c文件 和 0个或者多个.h 文件 组成
源程序: 是指未编译的 按照一定的程序设计语言规范书写的文本文件
.c文件 : c源代码
.h文件 : 头文件(接口文件)
2. .c文件
1)预处理命令
以#开头的行,在编译之前 会事先做处理
在C语言中的预处理命令: 文件包含, 宏定义, 条件编译
(1)文件包含
#include <stdio.h>
把include后面的那个文件的内容 在此处展开
例子:
gcc -E xxx.c -o xxx.i //预处理, test.i 还是C源代码文件
gedit xxx.i //gedit文件编辑器,可用于查看文本文件的内容
头文件的引用
#include <> 从系统标准的头文件路径下进行搜索 (如: /usr/include/ )
#include "" 先从当前的工程路径下进行搜索, 再从系统标准的头文件路径下进行搜索
(2)宏定义
宏定义: 定义一个宏
☆☆☆
宏: 是一个批量处理的称谓, 它只是简单替换, 不作计算, 也不作表达式
使用宏可以提高程序的通用性和可移植性
分类:
(2.1)不带参数的宏, 符号常量
语法:
#define 宏名 要替换的内容
例子:
#define Pi 3.14
double s = r*r*Pi; // OK r*r*3.14
Pi = 3; // error 3.14 = 3;
(2.2)带参数的宏
语法:
#define 宏名(参数列表) 要替换的内容
"参数列表": 在宏里面的参数, 不需要类型
例子:
定义一个宏, 求两个整数的最大值
#define MAX(a,b) a>b ? a : b
int c = MAX(3,5); // 3>5 ? 3 : 5
printf("c = %d\n", c ); // c = 5;
int i = 6;
c = MAX( i++, 5 ); // i++>5 ? i++ : 5 ==> 7 (此时i==8)
//宏定义只是简单替换,不作计算,也不作表达式
c = MAX( 1+2, 3+4 ); // 1+2>3+4 ? 1+2 : 3+4 ==> 7
c = MAX( 1>2, 3<4 ); // 1>2>3<4 ? 1>2 : 3<4 ==> 0
更正:
#define MAX(a,b) ( { typeof(a) _a = a; \
typeof(b) _b = b; \
(_a)>(_b) ? (_a) : (_b); \
} )
练习:
1)定义一个宏, 求数组a的元素个数
#define ARRAY_SIZE(a) ( sizeof(a)/sizeof(a[0]) )
2)定义一个宏, 取一个整数x中的第n个bit位
xxxxaxxx
xxxxxxxa x>>n
00000001 &1
----------------
0000000a
#define GET_BIT(x,n) ({ typeof(x) _x = x; \
typeof(n) _n = n; \
( ( _x >> _n ) & 1 ); \
})
#include <stdio.h>
#include "sum.h"#define N 10 //带参数的宏
// #define MAX(a,b) a>b ? a : b //有副作用#define MAX(a,b) ( { typeof(a) _a = a; \typeof(b) _b = b; \(_a)>(_b) ? (_a) : (_b); \} )#define ARRAY_SIZE(a) ( sizeof(a)/sizeof(a[0]) )#define GET_BIT(x,n) ({ typeof(x) _x = x; \typeof(n) _n = n; \( ( _x >> _n ) & 1 ); \})int main()
{int a[N];printf("%ld\n", ARRAY_SIZE(a) );int c = MAX(3,5); printf("c = %d\n", c ); // 5int i = 6;c = MAX( i++, 5 );printf("c = %d\n", c ); // 7c = MAX( 1+2, 3+4 );printf("c = %d\n", c ); // 7c = MAX( 1>2, 3<4 );printf("c = %d\n", c ); // 0int x = 7;if( GET_BIT(x, 3) ){printf("1\n");}else {printf("0\n");}//条件编译#if 1 printf("123\n");#endif#if 0 printf("456\n"); //少了一个分号#endif
}
(3)条件编译
(3.1)条件编译一般在.h文件中
#ifndef __XXX_H__
#define __XXX_H__
#endif
为了防止重复包含
(3.2)
#if 表达式
语句
#endif
"表达式"的值为真, 那么就编译"语句" ,
如果为假, 则不编译
类似于if语句
例子:
//条件编译
#if 1
printf("123\n");
#endif
#if 0
printf("456\n"); //不参与编译了
#endif
2)声明
"声明" :
在C语言中, 声明 是用来声明一个已经存在的标识符(对象的名字)
声明就是用来表示一个标识符(对象的名字)到底是什么东西
为什么需要声明?
C语言编译源文件时, 是从第一行到最后一行, 一行一行的进行编译
而且在编译多个文件的时候, 也是一个文件一个文件的编译的
有时候1.c可能会用到2.c中定义的对象(变量/函数等)
在编译1.c时,碰到这个对象的名字, c语言编译器就可能不认识这个标识符,
即使是在同一个文件中, 在前面碰到的标识符,而这个标识符的定义在后面
此时 编译器也会不知道这个标识符是什么东西
一般来说, 在源文件的前面 要进行标识符的声明
约定:
将声明 放在 使用的前面
声明的格式:
(1) 外部变量的声明
extern 变量的类型 变量名; //外部变量声明时, 不能给它初始化
(2) 函数的声明
(2.1) 外部函数的声明:
extern 函数的返回值类型 函数名(参数列表); //extern 函数头;
(2.2)本文件内部的 函数的声明
函数的返回值类型 函数名(参数列表); // 函数头;
例子: 参考函数的例子
注意:
函数声明,形参的名字是可以省略的,但是类型不能省略
int sum( int x, int y ); // OK
int sum( int, int); // OK
int sum( x, y ); // error
3) 全局变量 和 函数的定义
int a = 10;
int fun()
{}
int main()
{
}
在C语言中, 语句必须在函数的内部, 一个.c文件可以由多个函数组成
一个工程(程序)只能 有且仅有一个main()函数 , 可以有0个或者多个非主函数
main()函数是程序的入口, 程序从这里开始执行, main函数结束了, 那么整个程序就结束了
3. .h文件
.h文件的作用
1.c sum()
然后 2.c中需要用到1.c中的sum()函数
在2.c中进行外部函数的声明 就可以了
但是 如果 3.c 4.c 5.c ... 都需要用到这个函数?
只需要创建已给1.h文件 进行声明
int sum(int a, int b);
那么 2.c 3.c 4.c .... 只需要包含这个头文件即可
#include "1.h"
.h 头文件 (接口文件)
头文件的格式:
例子: sum.h
#ifndef __SUM_H__ //防止重复包含 //和文件名一致,建议全部大写
#define __SUM_H__
//头文件 一般包含 宏定义, 函数声明, 类型构造等
#endif
编程规范:
一般头文件的内容 不产生指令 或者 分配空间(比如:定义空间) 代码
头文件的引用
#include <> 从系统标准的头文件路径下进行搜索 (如: /usr/include/ )
#include "" 先从当前的工程路径下进行搜索, 再从系统标准的头文件路径下进行搜索
4. 模块化设计思想
例子:
造一架飞机
驾驶舱, 机翼, 引擎, 起落架
main.c 包含main()主函数 , 程序的入口 , 进行功能的调用
cockpit.c / cockpit.h 跟驾驶舱相关的功能代码
wing.c / wing.h 跟机翼相关的功能代码
engine.c / engine.h 跟引擎修改的功能代码
...
.c文件 包含具体功能函数的实现
.h文件主要是函数的声明
编译:
gcc main.c cockpit.c wing.c engine.c ... -o main
练习:
1) 提取字符串中的数字
输入一串字符串, 该字符串中可能包含数字, 把里面找到的数字 进行求和
例如:
输入: abc123def45ghijk6mn
输出: 174 ( <== 123 + 45 + 6 )
#include <stdio.h>
#include <string.h>int get_num_in_string( char *s )
{int num = 0;int sum = 0; //保存结果int i;for( i=0; i<strlen(s); i++ ) //遍历的字符串s{if( s[i]>='0' && s[i]<='9' ) //是数字 {num = num*10 + s[i] - 48; //合成数字if( s[i+1]<'0' || s[i+1]>'9' ) //下一个不是数字{sum = sum + num;num = 0;}}}return sum;
}int main()
{char buf[64] = {0};scanf("%s", buf );int sum = get_num_in_string( buf );printf("sum = %d\n", sum );
}
相关文章:
C语言-c语言组成
1.C语言的组成 一个C源程序是由 一个或者多个.c文件 和 0个或者多个.h 文件 组成 源程序: 是指未编译的 按照一定的程序设计语言规范书写的文本文件 .c文件 : c源代码 .h文件 : 头文件(接口文件) 2. .c文件 1)预处理命令 以#开头的行,在编译之前 会事…...
编程题 7-13 日K蜡烛图【PAT】
文章目录 题目输入格式输出格式输入样例1输出样例1输入样例2输出样例2输入样例3输出样例3 题解解题思路完整代码 编程练习题目集目录 题目 股票价格涨跌趋势,常用蜡烛图技术中的 K K K 线图来表示,分为按日的日 K K K 线、按周的周 K K K 线、按月的…...
iOS开发工程师面试
iOS开发工程师面试题可以涵盖多个方面,包括但不限于iOS开发的基础知识、高级概念、性能优化、架构设计、最新技术等。 1. 基础知识 1.1 请解释iOS中的Xcode是什么,以及它在开发中的作用和功能有哪些? Xcode是用于iOS和macOS等苹果平台开发的集成开发环境(IDE),提供了代…...

无人机避障—— 激光雷达定高北醒TF03-UART(二)
无人机避障过程,光靠大疆飞控内部的气压计不准,很容易在高度较低的时候受到地面植被等障碍物影响,使得掉高严重,因此采用激光雷达定高模块进行定高。 硬件: 北醒TF03-UART、Xavier-NX 软件代码: 北醒官…...

在虚幻引擎中实现Camera Shake 相机抖动/震屏效果
在虚幻引擎游戏中创建相机抖动有时能让画面更加高级 , 比如 遇到大型的Boss , 出现一些炫酷的特效 加一些短而快的 Camera Shake 能达到很好的效果 , 为玩家提供沉浸感 创建Camera Shake 调整Shake参数 到第三人称或第一人称蓝图 调用Camera Shake Radius值越大 晃动越强...

SQL Server的文本和图像函数
新书速览|SQL Server 2022从入门到精通:视频教学超值版_sql server 2022 出版社-CSDN博客 《SQL Server 2022从入门到精通(视频教学超值版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) SQL Se…...

PN8034非隔离12V300MA,SOP7/DIP7开关电源芯片
PN8034宽输出范围非隔离交直流转换芯片 PN8034SSC-R1B----SOP7, PN8034NSC-T1 ----DIP7, PN8034概述 PN8034集成PFM控制器及650V高雪州能力智能功本MOSFET,用于外图元器件极精简的小功率非隔离开关电源。PN8034内置高压启动模块,…...

VMware下Ubuntu找不到共享文件夹
在VMware的设置中已经设置了共享文件夹,在Ubuntu系统中找不到,参考了网上其他的文章,发现还是不能解决问题,无意中尝试了一小步,没想到成功解决了,在这里记录一下。 1)首先查询本机的gid 2&…...

银河麒麟桌面操作系统V10登录闪退问题解决
银河麒麟桌面操作系统V10登录闪退问题解决 1、问题描述2、问题分析3、问题解决方法第一步:修改/tmp文件夹权限第二步:重启图形化服务 💐The Begin💐点点关注,收藏不迷路💐 在使用银河麒麟桌面操作系统V10时…...

【Git原理与使用】分支管理
分支管理 1.理解分支2.创建分支2.1创建分支2.2切换分支2.3合并分支 3.删除分支4.合并冲突4.分支管理策略5.分支策略6.bug分支7.删除临时分支8.小结 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励&…...

Linux操作系统分析实验-多线程与内核模块编程,实验一
实验一 多线程与内核模块编程 一、实验目的 1、理解Linux下进程的结构; 2、理解Linux下产生新进程的方法(系统调用—fork函数); 3、掌握如何启动另一程序的执行; 4、理解Linux下线程的结构; 5、理解…...

AI绘画Stable Diffusion人物背景替换实操教程,让创意无限延伸
大家好,我是灵魂画师向阳 Stable Diffusion以其强大的能力可以实现人物背景的更换。本文将带你深入了解如何利用Stable Diffusion中的Inpaint Anything插件快速且精准地实现人物背景的替换,从而让你的图片焕发新生。 前期准备 本文会使用到Inpaint An…...

linux环境oracle11.2.0.4打补丁(p31537677_112040_Linux-x86-64.zip)
上传补丁及opatch工具 创建目录并上传opatch工具和补丁包 百度网盘地址 链接: https://pan.baidu.com/s/1EA5oerm52aesZUnb5OnQsA 提取码: ib8f [oraclerhel64 ~]$ mkdir /u01/psu [oraclerhel64 ~]$ cd /u01/psu [oraclerhel64 psu]$ ll total 514572 -rw-r--r-- 1 oracle o…...

华为 HCIP-Datacom H12-821 题库 (29)
🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.运行 IS-IS 的两台路由器,只有 IIH 发送的时间间隔相同才可以建立邻接关系 A、正…...
MySQL 为什么一定要有一个主键
引言 在数据库设计中,主键(Primary Key)是一个至关重要的概念。MySQL 作为最广泛使用的关系型数据库之一,主键在 MySQL 表设计中扮演着关键角色。主键不仅决定了表中数据的唯一性和完整性,还对数据库性能、数据查询、…...

Pycharm 本地搭建 stable-diffusion-webui
一、下载工程源码 Github官方连接 https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、Pycharm打开工程 1、设置环境 文件-设置-项目-Python解析器-添加解释器-添加本地解释器 Conda环境-创造新环境-Python版本3.10 注意一定要选择Python3.10版本,否…...
python/爬虫技术/lxml工具介绍/XML和HTML解析
1.lxml介绍: lxml 是一个Python库,它提供了非常强大的XML和HTML解析功能。它基于libxml2和libxslt,是处理XML和HTML文档的首选库之一。 2.安装 首先,需要安装lxml库。可以通过pip来安装,在控制台内执行安装命令。 p…...
Kafka技术详解[5]: 集群启动
目录 集群启动 相关概念 代理:Broker 控制器:Controller 启动ZooKeeper 启动Kafka 初始化ZooKeeper 初始化服务 启动任务调度器 创建数据管理器 创建远程数据管理器 创建副本管理器 创建ZK元数据缓存 创建Broker通信对象 创建网络通信对象 注册Brok…...

记一次教学版内网渗透流程
信息收集 如果觉得文章写的不错可以共同交流 http://aertyxqdp1.target.yijinglab.com/dirsearch dirsearch -u "http://aertyxqdp1.target.yijinglab.com/"发现 http://aertyxqdp1.target.yijinglab.com/joomla/http://aertyxqdp1.target.yijinglab.com/phpMyA…...

[Python学习日记-31] Python 中的函数
[Python学习日记-31] Python 中的函数 简介 语法定义 函数的参数 简介 引子: 你是某公司的一个高级程序员,现在老板让你写一个监控程序,需要24小时全年无休的监控公司网站服务器的系统状况,当 CPU、Memory、Disk 等指标的使用…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...