3.C语言:函数与程序结构

Function

  • 函数定义与声明
  • 外部变量与作用域
  • 头文件
  • 静态变量static
  • 寄存器变量
  • 程序块结构(作用域)
  • 初始化
  • 递归
  • C预处理器

函数定义与声明

函数定义形式:

返回值类型函数明(参数声明表)
{声明和语句
}

函数定义中的各构成部分都可以省略。

不执行任何操作的函数有时很有用,它可以在程序开发期间用以保留位置(留待以后填充代码)。如果函数定义中省略了返回值类型,则默认为int类型。
程序可以看成是变量定义和函数定义的集台。函数之间的通信可以通过参数、函数返回值以及外部变量进行。

被调用函数通过return语句向调用者返回值,return语句的后面可以跟任何表达式:

return 表达式;

如果函数带有参数,则要声明它们;如果没有参数,则使用void进行声明。函数声明和定义的参数类型一定要对应。

外部变量与作用域

C语言程序可以看成由一系列的外部对象构成,这些外部对象可能是变量或函数。
默认情况下,外部变量与函数具有下列性质:通过同一个名字对外部变量的所有引用(即使这种引用来自于单独编译的不同函数)实际上都是引用同一个对象(标准中把这一性质称为外部链接)。
因为外部变量可以在全局范围内访问,这就为函数之间的数据交换提供了一种可以代替函数参数与返回值的方式。任何函数都可以通过名字访问一个外部变量,当然这个名字需要通过某种方式进行声明。
如果函数之间需要其享大量的变量,使用外部变量要比使用一个很长的参数表更方便、有效。

  • 名字的作用域指的是程序中可以使用该名字的部分。
    另一方面,如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个源文件中,则必须在相应的变量声明中强制性地使用关键extern。
  • 定义:
int sp;
double val[MAXVAL];
  • 声明
extern int sp;
extern double val[];

在一个源程序的所有源文件中,一个外部变量只能在某个文件中定义一次,而其它文件可以通extern声明来访问它(定义外部变量的源文件中也可以包含对该外部变量的extern 声明)。外部变量的定义中必须指定数组的长度,extern声明则不一定要指定数组的长度。
外部变量的初始化只能出现在其定义中。

头文件

对于某些中等规模的程序,最好只用一个头文件存放程序中各部分共享的对象。较大的程序需要使用更多的头文件,我们需要精心地组织它们。

静态变量static

与extern关键字是冲突的。
static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分。通static限定外部对象,可以达到隐藏外部对象的目的。

  1. 静态外部变量:只能被当前文件下的函数使用,不会和同一程序中的其他文件中的相同名字相冲突。
  2. 静态函数:,如果把函数声明static类型,则该函数名除了对该函数声明所在的文件可见外,其它文件都无法访问。(单个文件内部使用)
  3. 静态内部变量:stati类型的内部变量是一种只能在某个特定函数中使用但一直占据存储空间的变量。

寄存器变量

register声明告诉编译器,它所声明的变量在程序中使用频率较高。其思想是,将register变量放在机器的寄存器中,这样可以使程序更小、执行速度更快。但编译器可以忽略此选项。
registe 声明只适用于自动变量以及函数的形式参数。声明形式:

register int x;
register char c;
f(register unsigned m, register long n)
{register int i;
}

另外,无论寄存器变量实际上是不是存放在寄存器中,它的地址都是不能访问的。

程序块结构(作用域)

自动变量(包括形式参数)也可以隐藏同名的外部变量与函数。如

int x;
int y;
f(double x)
{double y;
}

在一个好的程序设计风格中,应该避免出现变量名隐藏外部作用域中相同名字的情况,否则,很可能引起混乱和错误。

初始化

  • 在不进行显式初始化的情况下,外部变量和静态变量都将被初始化,而自动变量和寄存器变量的初值则没有定义(即初值为无用的信息)。
    对于外部变量与静态变量来说,初始化表达式必须是常量表达式,且只初始化一。
    对于自动变量与寄存器变量,则在每次进入函数或程序块时都将被初始化。
  • 数组的初始化可以在声明的后面紧跟一个初始化表达式列表,初始化表达式列表用花括号括起来,各初始化表达式之间通过逗号分隔。当省略数组的长度时,编译器将把花括号中初始化表达式的个数作为数组的长,如下数组长度为12.
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

如果初始化表达式的个数比数组元索数少,则对外部变量、静态变量和自动变量来说,没有初始化表达式的元素将被初始化为0,如果初始化表达式的个数比数组元素数多,则是错误的。

  • 字符数组的初始化比较特殊:可以用一个字符串来代替用花括号括起来并用逗号分隔的
    初始化表达式序列
char pattern[] = "ould ";
char pattern[] = { 'o', 'u', 'l', 'd'}; //这种情况下,数组的长度个字符加上一个字符串结束符'\0'

递归

语言中的函数可以递归调用,即函数可以直接或间接调用自身。
递归并不节省存储器的开销,因为递归调用过程中必须在某个地方维护一个存储处理值的栈。递归的执行速度并不快,但递归代码比较紧凑,并且比相应的非递归代码更易于编写与理解。在描述树等递归定义的数据结构时使用递归尤其方便。
每个递归函数都有两个部分:基线条件和递归条件。递归条件指的是函数调用自身,而基线条件则指的是函数不再调用自身,从而避免无限循环。

  • 栈(stack)
    栈是一种简单的数据结构。
    栈有两种操作:压入和弹出。(先进后出)
  • 调用栈:用于存储多个函数的变量,被称为调用栈。
    计算机在内部使用被称为调用栈的栈。
    在递归函数使用过程中。调用另一个函数时,当前函数暂停并处于为完成状态。

C预处理器

预处理器是编译过程中单独执行的第一个步骤。

  1. 文件包含
    文件包含指令(即#include指令)使得处理大量的的#define指令以及声明更加方便。
#include "文件名"
#include <文件名>

有上述文件包含的行都将被替换为由文件名指定的文件的内容。如果文件名用引号引起来,则在源文件所在位置查找该文件;如果在该位置没有找到文件,或者如果文件名用尖括号括起来,则将根据相应的规则查找该文件。
源文件的开始处通常都会有多个#include指令,它们用以包含常见的#define语句和extern声明,或从头文件中访问库函数的函数原型声明,比如<stdio.h>。
在大的程序中,#include指令是将所有声明捆绑在一起的较好的方法。它保证所有的源文件都具有相同的定义与变量声明,这样可以避免出现一些不必要的错误。很自然,如果某个包含文件的内容发生了变化,那么所有依赖于该包含文件的源文件都必须重新编译。

  1. 宏替换
    宏替换
#define 名字 替换文本

后续所有出现名字记号的地方都将被替换为替换文本。

如果在替换文本中,参数名以#作为前缀则结果将被扩展为由实际参数替换该参数的带引号的字符串。

#define dprint(expr) printf(#expr " = %g\n", expr)

预处理器运算符##为宏扩展提供了一种连接实际参数的手段。如果替换文本中的参数与##相邻,则该参数将被实际参数替换,##与前后的空白符将被删除,并对替换后的结果重新扫描。

#define paste(front, back) front ## back
  1. 条件包含
#if
#endif
#elif
#else
#ifndef
#define

还可以使用条件语句对预处理本身进行控制,这种条件语句的值是在预处理执行的过程中进行计算。这种方式为在编译过程中根据计算所得的条件值选择性地包含不同代码提供了一种手段。
如果多个头文件能够一致地使用这种方式,那么,每个头文件都可以将它所依赖的任何头文件包含进来,用户不必考虑和处理头文件之间的各种依赖关系。
常用为了保证文件的内容只被包含过一次,将文件的内容包含在以下形式的条件语句中。

#ifndef HDR
#define EDR
/* hdr.文件的内容放在这*/
#endif

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

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

相关文章

数据库开发工具Navicat Premium 15 mac软件特色

Navicat Premium 15 mac版是一款数据库开发工具&#xff0c;Navicat Premium 15 Mac版可以让你以单一程序同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。 Navicat Premium mac软件特色 无缝数据迁移 数据传输&#xff0c;数据同步和结构同步…

婚恋/社交娱乐/同城相亲/红娘相亲交友软件开发小程序

需求分析&#xff1a;首先明确小程序的目标、功能和用户需求。确定小程序的主要功能&#xff0c;例如用户注册、登录、个人资料编辑、浏览其他用户资料、发送消息等。 技术选型&#xff1a;选择适合的开发框架和技术工具。在小程序开发中&#xff0c;可以使用微信小程序原生开…

电脑开启虚拟化如何查看自己的主机主板型号

问题描述 在使用virtualbox、vmware安装虚拟机的时候&#xff0c;需要本机电脑能够支持虚拟化。 但是不同厂家的主机&#xff08;主板&#xff09;幸好并不一致&#xff0c;所以需要先了解自己的电脑主板型号 操作方法 1、win r 键打开运行窗口&#xff0c;输入cmd并确定打开…

3D PDF查看器HOOPS Publish助力Smartscape拓展日本AEC市场!

​ 公司&#xff1a;Smartscape Co., Ltd. 行业&#xff1a;建筑、工程和施工(AEC) 软件&#xff1a;适用于AEC行业的3D PDF工具 软件开发工具包&#xff1a;Hoops Publish HOOPS_3D软件开发工具_HOOPS中文网慧都科技是HOOPS全套产品中国地区指定授权经销商&#xff0c;提供3D…

流畅芯视界 | 极海APM32F411 OLED驱动方案

随着技术的不断革新与进步&#xff0c;OLED显示技术以其在显示画质、设备厚度和能耗方面的显著表现&#xff0c;正在改变着人们的视觉体验。相较于传统液晶显示技术&#xff0c;OLED凭借更好的色彩表现力、更高对比度、以及能够实现更加轻薄的产品设计而日益受到消费者的青睐。…

zabbix部署

zabbix部署 部署zabbix服务被监测主机部署zabbix-agent2 使用版本 组件版本centos7.9zabbix5.0php7.2.24MariaDB5.5.68 部署zabbix服务 关闭防火墙和selinux [rootnode ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: …

Vue-8、Vue事件处理

1、点击事件 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml" xmlns:v-bind"http://www.w3.org/1999/xhtml"xmlns:v-on"http://www.w3.org/1999/xhtml"> <head><meta charset&quo…

0108作业

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setWindowTitle("腾讯会议");this->resize(470,800);//设置界面大小this->setFixedSize(470,800);//锁定界面大小this->setStyleSheet("background-color:w…

信息系统安全——基于 AFL 的模糊测试

实验 3 基于 AFL 的模糊测试 3.1 实验名称 《基于 AFL 的模糊测试》 3.2 实验目 1 、熟悉模糊测试方法 2 、熟悉模糊测试工具 AFL 的使用 3.3 实验步骤及内容 1 、 安装 AFL 2 、 任意选择一个有源代码的样本 这里采用教材上一个包含栈溢出漏洞的样本。 3 、 结合源代码分析用 …

2024.1.8力扣每日一题——回旋镖的数量

2024.1.8 题目来源我的题解方法一 双层哈希表方法二 哈希表优化版 题目来源 力扣每日一题&#xff1b;题序&#xff1a;447 我的题解 方法一 双层哈希表 构造如下的哈希表&#xff1a;{节点i&#xff1a;{距离1&#xff1a;数量&#xff0c;…距离n&#xff1a;数量}} 相当于…

LinkedBlockingQueue原理探究

类图结构 同样首先看一下LinkedBlockingQueue的类图结构&#xff0c;以便从全局对LinkedBlockingQueue有个直观的了解。 由类图可以看到&#xff0c;LinkedBlockingQueue也是使用单向链表实现的&#xff0c;其也有两个Node,分别用来存放首、尾节点&#xff0c;并且还有一个初始…

Shell脚本入门实战:探索自动化任务与实用场景

引言 Shell脚本作为一种强大的自动化工具&#xff0c;在现代操作系统中具有广泛的应用。无论是简单的文件操作&#xff0c;还是复杂的系统管理&#xff0c;Shell脚本都能提供高效、快速的解决方案。在本文中&#xff0c;我们将探索Shell脚本的基础知识&#xff0c;并通过实战场…

x-cmd pkg | rg - 文本搜索工具,grep 命令的现代化替代品

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 rg&#xff08;ripgrep&#xff09; 是一个逐行方式进行&#xff08; line-oriented &#xff09;的文本搜索工具&#xff0c;能够递归搜索目录中的文件内容。默认情况下&#xff0c;rg 将遵守 .gitignore 文件规则自…

偷偷读个中国社科院与新加坡新跃社科联合培养博士惊艳你们

近期&#xff0c;华尔街量化圈应届生的年薪超200万刷屏&#xff01;国内量化的人才市场又是怎样的呢&#xff1f;据记者调查&#xff0c;当前在应届生的招聘上主要以顶尖高校的博士为主&#xff0c;年薪百万起步&#xff0c;同时为实习人才提供每日1500元的实习津贴。一般情况下…

内衣洗衣机哪些品牌质量好实惠?五款好用的迷你洗衣机

随着人们的生活水平的提升&#xff0c;越来越多小伙伴来开始追求更高的生活水平&#xff0c;一些智能化的小家电就被发明出来&#xff0c;而且内衣洗衣机是其中一个。现在通过内衣裤感染到细菌真的是越来越多&#xff0c;所以我们对内衣裤的清洗频次会高于普通衣服&#xff0c;…

视频号小店和抖音小店相比,新手做哪个比较好?

我是电商珠珠 抖音小店在19年被抖音所发展&#xff0c;在这过程中&#xff0c;抖音小店通过自身的不断完善&#xff0c;从兴趣电商到全域兴趣电商模式&#xff0c;从直播电商到商城的出现&#xff0c;凭借着门槛低流量高的优势&#xff0c;让很多商家尝到了红利。 尤其是在20…

大创项目推荐 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

Cookie Session和过滤器Filter

会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪&#xff1a;一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请求是否来自…

Java程序员面试-场景篇

前言 裁员增效潮滚滚而来&#xff0c;特总结一些实际场景方案的面试题&#xff0c;希望对大家找工作有一些帮助。 注册中心 题目&#xff1a; 有三台机器&#xff0c;分别部署了微服务A、微服务B、注册中心&#xff0c;其中A和B都有服务接口提供并正常注册到了注册中心&…

HttpServletRequest setHeader

HttpServletRequest setHeader