- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
程序是由一个个函数组成的。我们之前虽然没有正式介绍函数,但是我们早已经开始使用函数了。因为离开了函数,我们的程序没有办法正常的工作。只不过我们使用的是 C 语言内置的标准函数库。
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码。函数还可以接收数据,并根据数据的不同做出不同的操作,最后再把处理结果反馈给我们。 在 C 语言中,我们必须要包含一个函数,就是我们最开始介绍的 mian 函数。
例如: 你用C语言编写了一个MP3播放器程序,那么它的程序结构如下图所示:
可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言
函数是现代编程语言中的重要组成部分。肩负着实现程序功能的职责。是程序的基本组成单元。好的函数往往只实现简单的单一的功能,而不是大而全的万金油。要尽量的瘦身。
在C语言中可从不同的角度对函数分类
从函数定义的角度看,函数可分为库函数和用户定义函数两种
从函数执行结果的角度来看, 函数可分为有返回值函数和无返回值函数两种
从主调函数和被调函数之间数据传送的角度看,又可分为无参函数和有参函数两种
函数头与函数体两部分组成 , 其中函数头部分包含函数的返回值类型,函数名,函数的参数, 函数体部分由实现函数功能的一条至多条语句组成。
定义函数的步骤:
注意: 在c语言中函数是没有重载的,也就是同一个.c文件内部定义的函数名称不能相同
格式:
void 函数名() {
函数体;
}
列:
void printRose() {
printf("Hello, World!\n");
}
注意: 如果函数不需要返回数据给调用者, 那么函数中的return可以不写 ,在合适的时候使用return可以用于直接结束当前函数
格式:
返回值类型 函数名() {
函数体;
return 值;
}
列:
int getMax() {
printf("请输入两个整数, 以逗号隔开, 以回车结束\n");
int number1, number2;
scanf("%i,%i", &number1, &number2);
int max = number1 > number2 ? number1 : number2;
return max;
}
形式参数表列表的格式: 类型 变量名,类型 变量2,......
格式:
void 函数名(参数类型 形式参数1,参数类型 形式参数2,…) {
函数体;
}
列:
void printMax(int value1, int value2) {
int max = value1 > value2 ? value1 : value2;
printf("max = %i\n", max);
}
格式:
返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) {
函数体;
return 0;
}
列:
int printMax(int value1, int value2) {
int max = value1 > value2 ? value1 : value2;
return max;
}
在定义函数时,函数名后面小括号()中定义的变量称为形式参数,简称形参, 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量
int max(int number1, int number2){ // 形式参数
return number1 > number2 ? number1 : number2;
}
在调用函数时, 传入的值称为实际参数,简称实参, 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参, 因此应预先用赋值输入等办法使实参获得确定值
在C语言中,函数的定义顺序是有讲究的, 默认情况下,只有后面定义的函数才可以调用前面定义过的函数, 如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数的前面进行函数的声明, 否则系统搞不清楚有没有这个函数, 系统搞不清楚这个函数接收几个参数,系统搞不清楚这个函数的返回值类型是什么, 所以函数声明,就是在函数调用之前告诉系统, 该函数叫什么名称, 该函数接收几个参数, 该函数的返回值类型是什么
函数的声明格式: 将自定义函数时{}之前的内容拷贝到调用之间即可,一般在当前文件所有函数前面位置
例如: int max( int a, int b ); int max( int, int );
函数声明仅仅代表着告诉系统一定有这个函数 ,和把这个函数的详细信息告诉系统, 让系统知道这个函数具体的业务逻辑是怎么运作的
函数声明注意事项:
main是函数的名称, 和我们自定义的函数名称一样, 也是一个标识符只不过main这个名称比较特殊, 程序已启动就会自动调用它
return 0; 如果main函数的执行正常, 那么就返回0, 如果main函数执行不正常, 那么就返回一个非0的数
以上我们根据之前学的,都能明白, 在main函数中还有一个内容非常重要,就是main函数的参数,main函数有三个参数argc、argv和envp
int argc
用于存放命令行参数的个数。 (第一个代表他自己)char *argv[]
是个字符串的数组,每个元素都是一个字符指针,指向一个字符串,即命令行中的每一个参数。char *envp[]
也是一个字符串的数组,这个数组的每一个元素是指向一个环境变量的字符指针。(在实际开发中,envp参数的应用很少,各位了解一下就行了。)#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[], char **env) {
int i = 0;
printf("******************* Begin argv *******************\n");
printf("argc: %d\n", argc); //程序名称; =1 只有一个
for (i = 0; i < argc; i++) {
printf("%s\n", argv[i]); //指向输入的程序路径及名称
}
printf("******************* End argv *******************\n");
printf("\n");
printf("\n");
printf("******************* Begin env *******************\n");
for (i = 0; env[i] != NULL; i++) {
printf("%s\n", env[i]); //为环境变量
}
printf("******************* End env*******************\n");
printf("\n");
system("pause");
return 0;
}
参数1是启动程序, 之后就是实际的参数,使用空格隔开
一般会这样使用,第三个参数基本不会用到的
int main(int argc, char *argv[]) {
return 0;
}
什么是递归函数? 函数递归就是函数自己调用自己。(自己搞自己)
那么递归的好处是什么呢? 它能够将复杂的问题,用少量的代码来表示,增加了代码的可读性。
递归的两个必要条件:
列: 按照顺序打印一个数的整形值
#include <stdio.h>
int print(int n) {
if (n > 9) {//递归结束条件
print(n / 10);
}
printf("%d", n % 10);
}
int main() {
int num ;
printf("请输入一个整数:");
scanf("%d", &num);
print(num);
return 0;
}
解析: 看懂下图你递归就入门了
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复感谢,配合,希望我的努力对你有帮助^_^
免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我。
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!