当前位置: 首页 > news >正文

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 题解解题思路完整代码 编程练习题目集目录 题目 股票价格涨跌趋势&#xff0c;常用蜡烛图技术中的 K K K 线图来表示&#xff0c;分为按日的日 K K K 线、按周的周 K K K 线、按月的…...

iOS开发工程师面试

iOS开发工程师面试题可以涵盖多个方面,包括但不限于iOS开发的基础知识、高级概念、性能优化、架构设计、最新技术等。 1. 基础知识 1.1 请解释iOS中的Xcode是什么,以及它在开发中的作用和功能有哪些? Xcode是用于iOS和macOS等苹果平台开发的集成开发环境(IDE),提供了代…...

无人机避障—— 激光雷达定高北醒TF03-UART(二)

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

在虚幻引擎中实现Camera Shake 相机抖动/震屏效果

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

SQL Server的文本和图像函数

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

PN8034非隔离12V300MA,SOP7/DIP7开关电源芯片

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

VMware下Ubuntu找不到共享文件夹

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

银河麒麟桌面操作系统V10登录闪退问题解决

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

【Git原理与使用】分支管理

分支管理 1.理解分支2.创建分支2.1创建分支2.2切换分支2.3合并分支 3.删除分支4.合并冲突4.分支管理策略5.分支策略6.bug分支7.删除临时分支8.小结 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&…...

Linux操作系统分析实验-多线程与内核模块编程,实验一

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

AI绘画Stable Diffusion人物背景替换实操教程,让创意无限延伸

大家好&#xff0c;我是灵魂画师向阳 Stable Diffusion以其强大的能力可以实现人物背景的更换。本文将带你深入了解如何利用Stable Diffusion中的Inpaint Anything插件快速且精准地实现人物背景的替换&#xff0c;从而让你的图片焕发新生。 前期准备 本文会使用到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)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.运行 IS-IS 的两台路由器&#xff0c;只有 IIH 发送的时间间隔相同才可以建立邻接关系 A、正…...

MySQL 为什么一定要有一个主键

引言 在数据库设计中&#xff0c;主键&#xff08;Primary Key&#xff09;是一个至关重要的概念。MySQL 作为最广泛使用的关系型数据库之一&#xff0c;主键在 MySQL 表设计中扮演着关键角色。主键不仅决定了表中数据的唯一性和完整性&#xff0c;还对数据库性能、数据查询、…...

Pycharm 本地搭建 stable-diffusion-webui

一、下载工程源码 Github官方连接 https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、Pycharm打开工程 1、设置环境 文件-设置-项目-Python解析器-添加解释器-添加本地解释器 Conda环境-创造新环境-Python版本3.10 注意一定要选择Python3.10版本&#xff0c;否…...

python/爬虫技术/lxml工具介绍/XML和HTML解析

1.lxml介绍&#xff1a; lxml 是一个Python库&#xff0c;它提供了非常强大的XML和HTML解析功能。它基于libxml2和libxslt&#xff0c;是处理XML和HTML文档的首选库之一。 2.安装 首先&#xff0c;需要安装lxml库。可以通过pip来安装&#xff0c;在控制台内执行安装命令。 p…...

Kafka技术详解[5]: 集群启动

目录 集群启动 相关概念 代理&#xff1a;Broker 控制器&#xff1a;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 中的函数 简介 语法定义 函数的参数 简介 引子&#xff1a; 你是某公司的一个高级程序员&#xff0c;现在老板让你写一个监控程序&#xff0c;需要24小时全年无休的监控公司网站服务器的系统状况&#xff0c;当 CPU、Memory、Disk 等指标的使用…...

Kafak入门技术详解

抱歉&#xff0c;没有太多的时间进行详细校对 目录 一、Kafka简介 1.消息队列 1.1为什么需要消息队列 1.2消息队列 1.3消息队列的分类 1.4P2P和发布订阅MQ的比较 1.5消息系统的使用场景 1.6常见的消息系统 2.Kafka简介 2.1简介 2.2设计目标 2.3 kafka核心的概念 二…...

X-Spreadsheet:Web端Excel电子表格工具库

在数字化时代&#xff0c;数据管理与分析的重要性日益凸显。传统的电子表格软件如Microsoft Excel和Google Sheets在数据处理方面发挥着重要作用&#xff0c;但在Web端&#xff0c;一款名为X-Spreadsheet的工具库正以其独特的优势逐渐崭露头角。本文将详细介绍X-Spreadsheet&am…...

为什么很多APP取消网页版

厂商为了增加用户黏度把所有的内容都放在 APP 上&#xff0c;京东的网页也搜索不到东西了&#xff0c;就算看到东西要跳转过来还需要先登录一下。 对比亚马逊这类的其他的购物网站&#xff0c;基本上都是网页内容和 APP 的内容都是同步的&#xff0c;网页直接看也可以下单&…...

Kubernetes高级功能

资源配额 什么是资源配额 资源配额&#xff0c;通过 ResourceQuota 对象来定义&#xff0c;对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限&#xff0c;也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。 资源配额应用 创建的…...

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识

关卡任务 闯关任务需要在关键步骤中截图&#xff1a; 任务描述 完成所需时间 闯关任务 完成SSH连接与端口映射并运行hello_world.py 10min 可选任务 1 将Linux基础命令在开发机上完成一遍 10min 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 10min 可选任务 3 创…...

【python爬取网页信息并存储】

爬取网页信息并存储是一个常见的任务&#xff0c;通常涉及以下几个步骤&#xff1a; 发送HTTP请求&#xff1a;使用库如requests来发送HTTP请求获取网页内容。解析网页内容&#xff1a;使用库如BeautifulSoup或lxml来解析HTML内容&#xff0c;提取所需信息。存储数据&#xff…...

TCP、UDP

TCP和UDP的区别 是否面向连接&#xff1a;UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务&#xff0c;在传送数据之前必须先建立连接&#xff0c;数据传送结束后要释放连接。 是否是可靠传输&#xff1a;远地主机在收到 UDP 报文后&#xff0c;不需要给出任…...

聊聊暖通空调系统的优化控制方法

目录 暖通空调系统的优化控制方法✈️part1 初版回归网络建模✈️part2 更新的回归网络✈️ 聊聊暖通空调系统的优化控制方法 这篇文章简单分享一下暖通空调&#xff08;HVAC&#xff09;领域常常提到的”优化控制“这一概念指的是什么&#xff0c;它控制的是哪些参数&#…...

2024年合肥市职业院校技能大赛(中职组)赛 网络安任务书样题

2024年合肥市职业院校技能大赛--中职组赛 网络安任务书样题 一、竞赛项目简介&#xff1a;二、竞赛注意事项模块A: 理论技能与职业素养模块B: 网络安全事件响应、数字取证调查和应用安全任务一:应急响应任务二:操作系统取证任务三:网络数据包分析任务四:代码审计 模块C:CTF 夺旗…...

制造企业如何提升项目管理效率?惠科股份选择奥博思PowerProject项目管理系统

全球知名的显示方案综合服务商 - 惠科股份有限公司与北京奥博思达成合作&#xff0c;基于奥博思 PowerProject 搭建企业级项目管理平台。满足惠科多产品多业务领域的项目全周期管理。助力企业在技术研发、产品创新等方面继续取得行业领先优势。 同时&#xff0c;PowerProject …...

企业网站开发外包/可以投放广告的网站

为什么80%的码农都做不了架构师&#xff1f;>>> 1.批量注释 用“#”可以注释一行&#xff0c;想要注释整段的便捷方法可以采用“EOF”&#xff1a; : << COMMENTBLOCK#your shell code... COMMENTBLOCK 这个用来注释整段脚本代码。 : 是shell中的空语句。 …...

附近做网站/网络推广项目外包公司

神经网络的结构设计有3个主流的高级技巧&#xff1a;1&#xff0c;高低融合 (将高层次特征与低层次特征融合&#xff0c;提升特征维度的丰富性和多样性&#xff0c;像人一样同时考虑整体和细节)2&#xff0c;权值共享 (一个权值矩阵参与多个不同的计算&#xff0c;降低参数规模…...

一个企业做网站推广的优势/百度导航官网

1.新建Gui工程&#xff0c;在主界面上添加一个标签label&#xff0c;并设置其显示内容为“0000-00-00 00:00:00 星期日”。2.在mainwindow.h中添加槽函数声明。private slots:void timerUpDate();3.在mainwindow.cpp中添加代码。添加#include 的头文件包含&#xff0c;这样就包…...

开淘宝店怎么做充值网站/今日疫情最新消息全国31个省

最近为了收集一些数据&#xff0c;花了15元申请了1个接口网站的月度vip&#xff0c;本着不浪费的精神&#xff0c;把能用的接口都采了一遍&#xff0c;看到有的采集能动态显示才到的内容&#xff0c;于是sham也自己动手做了1个&#xff0c;实现的功能如下 根据选择和条数设置&a…...

行业网站建设哪家好/百度竞价排名费用

这两年&#xff0c;线上办公逐渐常态化&#xff0c;相信大家对ftp这个概念也比较熟悉了。ftp&#xff0c;即文件传输协议&#xff0c;线上办公就是用ftp软件进行文件传输的。那ftp传输文件大小有限制吗,ftp文件传输工具有哪些我们一起来看看。 一、ftp传输文件大小有限制吗 f…...

设计制作个人网站/国内网络销售平台有哪些

学习内容简单查询汇总分析复杂查询多表查询如何提高SQL查询效率简单查询创建学校数据库的表查找学生查询姓‘猴’的学生名单查询姓名中最后一个字是‘猴’的学生名单查询姓名中带‘猴’的学生名单select * from student where 姓名 like 猴%;select * from student where 姓名 …...