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

C语言之函数详解

目录

函数的定义

函数的调用

变量的存储类型

auto自动变量

extern外部变量

static静态变量

register寄存器变量


函数的定义

在C语言中,函数是一段可重复使用的代码块,用于执行特定的任务。函数的定义包括函数的声明和函数体两个部分。

函数的声明指明了函数的名称、参数列表和返回值类型,它告诉编译器函数的存在和如何使用。函数的声明通常放在头文件中或者提前放置在调用函数的代码之前。

函数的定义通常包含以下内容:

返回值类型 函数名(形参表说明) /*函数首部*/
{说明语句 /*函数体*/执行语句
}

对上面的定义形式进行以下说明:
(1)“返回值类型”是指函数返回值的类型。函数返回值不能是数组,也不能是函数,除此之外任何合法的数据类型都可以是函数的类型,如:int,long,float,char等。函数类型可以省略,当不指明函数类型时,系统默认的是整型。
(2)函数名是用户自定义的标识符,在C语言函数定义中不可省略,须符合C语言对标识符的规范,用于标识函数,并用该标识符调用函数。另外函数名本身也有值,它代表了该函数的入口地址,使用指针调用函数时,将用到此功能。
(3)形参又称为“形式参数”。形参表是用逗号分隔的一组变量说明,包括形参的类型和形参的标识符,其作用是指出每一个形参的类型和形参的名称,当调用函数时,接收来自主调函数的数据,确定各参数的值。
(4)用{ }括起来的部分是函数的主体,称为函数体。函数体是一段程序,确定该函数应完成的规定的运算,应执行的规定的动作,集中体现了函数的功能。函数内部应有自己的说明语句执行语句,但函数内定义的变量不可以与形参同名。花括号{ }是不可以省略的。

以下是一个函数声明的示例:

int add(int a, int b);

这个函数声明的名称是add,它接受两个int类型的参数a和b,并且返回一个int类型的值。

函数的定义包括函数的声明和函数体。以下是一个函数的定义示例:

int add(int a, int b) {int sum = a + b;return sum;
}

在这个示例中,我们定义了一个名为add的函数,它接受两个int类型的参数a和b。函数体内部的代码计算a和b的和,并将结果存储在局部变量sum中。最后,通过return语句将sum作为函数的返回值返回。

需要注意的是,函数的定义必须在函数被调用之前。一般情况下,函数的定义放在程序的开头或者单独的源文件中,并通过头文件进行声明。

函数可以有返回值,也可以没有返回值。如果函数没有返回值,可以使用void作为返回类型。以下是一个没有返回值的函数定义示例:

void greet() {printf("Hello, world!\n");
}

这个示例中的greet函数没有参数,也没有返回值。函数体内部的代码打印出"Hello, world!"的字符串。

函数的调用

在C语言中,函数的调用是通过函数名称和参数列表进行的。当程序执行到函数调用语句时,会跳转到函数定义处执行函数体内的代码,并将参数传递给函数。函数执行完毕后,程序会返回到函数调用的位置继续执行后续的代码。

函数的调用通常采用以下的格式:

return_value = function_name(argument1, argument2, ...);

其中,return_value是函数的返回值,function_name是函数的名称,argument1, argument2, ...是函数的参数列表。

以下是一个函数调用的示例:

int result = add(3, 5);

这个示例中,我们调用了一个名为add的函数,传递了两个参数3和5。函数调用的结果被存储在变量result中。

需要注意的是,函数调用时的参数类型、数量和顺序必须与函数定义中的参数类型、数量和顺序相匹配。如果函数定义中有返回值,那么函数调用时也需要使用相应的变量来接收返回值。

另外,函数的调用可以作为表达式的一部分,也可以独立使用。例如:

printf("The sum is: %d\n", add(3, 5));

这个示例中,我们直接在printf函数的参数列表中调用了add函数,并将其返回值作为printf函数的参数之一。

变量的存储类型

在C语言中,变量就像是一个存储箱,你可以在其中存储信息(数据)。每个存储箱都有一个名字(变量名)和一个类型(数据类型,比如整数、浮点数、字符等)。

在计算机中,保存变量当前值的存储单元有两类,一类是内存,另一类是CPU的寄存器。变量的存储类型关系到变量的存储位置,有四种不同类型的存储箱,它们在电脑里的存放地点和存在的时间都有所不同:

  • 自动变量(auto):这些存储箱只在函数被调用的时候出现,函数结束后就消失了。
  • 外部变量(extern):这些存储箱在整个程序运行期间都存在,可以在不同的函数之间共享。
  • 静态变量(static):这些存储箱也在整个程序运行期间都存在,但只能在一个特定的函数或文件中使用。
  • 寄存器变量(register):这些存储箱存放在CPU的寄存器中,访问速度非常快,但数量有限。

变量的保留时间又称为生存期,从时间角度,可将变量分为静态存储和动态存储两种情况。

生存期:这是存储箱存在的时间。

  • 静态存储的存储箱在整个程序运行期间都存在。
  • 动态存储的存储箱只在特定的函数调用期间存在。

变量的作用范围又称为作用域,从空间角度,可以将变量分为全局变量和局部变量。

  • 局部变量:只有在特定的函数或代码块中才能访问的存储箱。
  • 全局变量:在整个程序中都可以访问的存储箱。

后面,我们将对这四种类型变量逐一展开实例讲解。

auto自动变量

C语言的自动存储类(auto)是默认的存储类,当没有显式地指定存储类时,变量会被默认为自动存储类。自动变量在函数内部声明,它们在函数被调用时创建,并在函数执行完毕后销毁。

以下是关于C语言自动存储类的一些详细说明:

  • 生命周期:自动变量的生命周期与其所在的块(通常是函数)的执行周期相对应。当程序执行到包含自动变量声明的块时,会为该变量分配内存空间;当块执行完毕或离开作用域时,自动变量的内存空间会被释放。这意味着自动变量只在其所在的块中可见和有效,超出该块的范围后无法访问。
  • 存储位置:自动变量通常存储在栈(stack)上。栈是一种后进先出(LIFO)的数据结构,用于存储函数的局部变量、函数的参数、返回地址等信息。每当函数被调用时,会在栈上为自动变量分配一段内存空间,函数执行完毕后,这些内存空间会被自动释放,供其他函数使用。
  • 默认行为:在C语言中,当变量声明时没有指定存储类时,默认为自动存储类。例如,函数内部声明的变量通常是自动变量。
  • 初始化:自动变量可以在声明时进行初始化,也可以在后续的代码中赋值。未初始化的自动变量会被分配一个未定义的值(即垃圾值),因此在使用之前应该确保对其进行初始化。
  • 作用域:自动变量的作用域仅限于声明它们的块内部。这意味着自动变量只在其所在的块中可见,超出该块的范围后无法访问。同名的自动变量可以在不同的块中声明而互不干扰,每个块中的自动变量都有自己的作用域。

需要注意的是,自动存储类在C语言中已经成为默认的存储类,通常情况下不需要显式地指定自动存储类。但为了代码的可读性和明确性,有时候还是会将自动存储类关键字"auto"加在变量声明前面。

总结起来,C语言的自动存储类(auto)用于声明函数内部的局部变量,它们在函数调用时创建,在函数执行完毕后销毁。自动变量的存储空间通常位于栈上,其作用域仅限于声明它们的块内部。

例如声明一个自动变量:

int fun(int a)
{auto int b,c=3;/*定义b,c为自动变量*/
}

 a是函数fun()的形参,b、c是自动变量,并对c赋初值3。执行完fun()函数后,自动释放a、b、c所占的存储单元。

extern外部变量

C语言的extern关键字用于声明外部变量,它用于在一个源文件中引用另一个源文件中已经定义的全局变量。外部变量是在一个源文件中定义,而在其他源文件中使用的。

以下是关于C语言extern外部变量的一些详细说明:

  • 声明外部变量:在一个源文件中,如果要引用另一个源文件中已经定义的全局变量,可以使用extern关键字进行声明。这样,在当前源文件中就可以使用该全局变量,而无需重新定义它。
  • 全局作用域:被extern声明的变量具有全局作用域,即可以在整个程序的任何地方访问。它们的生命周期从程序启动到程序结束,不会因为函数的执行而改变。
  • 存储位置:外部变量通常存储在全局数据区或静态数据区。全局数据区用于存储全局变量和静态变量,而静态数据区用于存储仅在当前源文件中可见的静态变量。
  • 初始化:外部变量可以在定义时进行初始化,也可以在后续的代码中赋值。未初始化的外部变量会被默认初始化为0或空指针,具体取决于其类型。
  • 多文件共享:extern关键字的主要作用是在多个源文件之间共享变量。通过在一个源文件中定义变量,并在其他源文件中使用extern关键字声明该变量,可以实现对全局变量的共享访问。
  • 注意事项:在使用extern声明外部变量时,要确保已经在其他源文件中定义了该变量。否则,在链接阶段可能会出现链接错误。

需要注意的是,外部变量的使用应当谨慎。过度使用外部变量可能会导致代码的可读性和可维护性下降。通常情况下,应该尽量避免过多使用外部变量,而是通过函数参数和返回值来传递和获取数据。

总结起来,C语言的extern关键字用于声明外部变量,它允许在一个源文件中引用另一个源文件中已经定义的全局变量。外部变量具有全局作用域,存储在全局数据区或静态数据区,可以在整个程序中进行访问。通过extern关键字,可以在多个源文件之间共享变量。

以下是一个简单的代码示例,展示了如何在多个源文件中使用extern关键字声明和共享外部变量:

在文件A.c中定义外部变量:

// A.c
int globalVariable = 10;

在文件B.c中使用extern关键字声明并使用外部变量:

// B.c
#include <stdio.h>extern int globalVariable; // 使用extern关键字声明外部变量int main() {printf("全局变量的值为: %d\n", globalVariable);return 0;
}

在上述示例中,文件A.c中定义了一个名为globalVariable的全局变量,并初始化为10。在文件B.c中,通过使用extern关键字声明了globalVariable,并在main函数中使用它打印出其值。

static静态变量

C语言中的静态变量(static variable)是一种具有特殊属性的变量,它们与普通的自动变量(局部变量)和全局变量有所不同。下面是关于C语言静态变量的详细说明:

  1. 存储位置:静态变量存储在静态数据区(或称为全局数据区)中,而不是栈上。与自动变量不同,静态变量在程序的整个生命周期内都存在,并且只被初始化一次。
  2. 生命周期:静态变量的生命周期从程序开始到程序结束,与全局变量类似。它们在程序启动时被初始化,并在程序结束时被销毁。
  3. 作用域:静态变量可以具有不同的作用域,取决于它们的声明位置。当静态变量在函数内部声明时,它们在声明的函数范围内可见,但在函数调用结束后仍然保留其值。当静态变量在函数外部声明时,它们在整个程序中可见,但只能在声明的源文件中访问。
  4. 初始化:静态变量可以在声明时进行初始化,也可以在后续的代码中赋值。与全局变量类似,未显式初始化的静态变量将被默认初始化为0(对于静态整型变量)或空指针(对于静态指针变量)。
  5. 作用:静态变量的主要作用之一是保持变量的值在函数调用之间的持久性。当函数被多次调用时,静态变量的值将保持不变,而不会像自动变量那样在每次函数调用之后被重置。
  6. 访问控制:静态变量的作用域仅限于声明它们的源文件。这意味着其他源文件无法直接访问静态变量,从而提供了一定的封装性和信息隐藏。

需要注意的是,静态变量的使用应当谨慎。过度使用静态变量可能导致代码的可读性和可维护性下降,因为它们具有全局的可见性。通常情况下,我们应该优先使用局部变量,并通过函数参数和返回值来传递和获取数据。

以下是一个简单的示例代码,展示了静态变量的使用:

#include <stdio.h>void increment() {static int count = 0; // 静态变量在函数内部声明count++;printf("Count: %d\n", count);
}int main() {increment(); // 输出 Count: 1increment(); // 输出 Count: 2increment(); // 输出 Count: 3return 0;
}

在上述示例中,increment函数内部声明了一个静态变量count。每次调用increment函数时,count的值会递增,并打印出当前的count值。由于count是静态变量,它的值在函数调用之间保持不变,而不会被重置为初始值。

总结起来,C语言中的静态变量具有特殊的属性,它们存储在静态数据区,具有全局的生命周期和作用域。静态变量在程序运行期间保持其值的持久性,常用于需要保留状态或计数的情况。然而,我们应当谨慎使用静态变量,并确保其使用符合设计和代码结构的最佳实践。

register寄存器变量

C语言的register关键字用于向编译器建议将变量存储在寄存器中,以便快速访问。下面是关于C语言register寄存器变量的详细说明:

  • 存储位置:register关键字用于向编译器建议将变量存储在寄存器中。寄存器是位于CPU内部的高速存储器,可以比主存储器更快地访问。使用register关键字并不直接将变量放入寄存器,而是向编译器发出建议。
  • 限制:register关键字具有一些限制。它只能应用于自动变量(即局部变量),而不能应用于全局变量、静态变量或函数参数。此外,由于寄存器的数量有限,编译器可能会忽略对register关键字的建议,将变量存储在内存中。
  • 作用:将变量存储在寄存器中可以提高访问速度,因为寄存器可以更快地读取和写入数据。这在需要频繁访问的变量上尤为有效,例如循环计数器或其他需要高性能的计算。
  • 可能影响:使用register关键字并不保证变量一定存储在寄存器中。编译器可以根据自身的策略和优化规则来决定是否将变量存储在寄存器中。如果编译器无法满足所有register变量的要求,它可能会忽略一些建议,将变量存储在内存中。
  • 注意事项:由于编译器对register关键字的处理是可选的,因此不应过度依赖它来改善性能。编译器通常会根据代码的上下文和优化策略自动选择最佳的存储位置。在现代的编译器中,对于大多数情况,使用register关键字并不会带来显著的性能提升。

以下是一个简单的示例代码,展示了register关键字的使用:

#include <stdio.h>int main() {register int i; // 建议将i存储在寄存器中for (i = 0; i < 10; i++) {printf("%d ", i);//输出:0 1 2 3 4 5 6 7 8 9}return 0;
}

在上述示例中,变量i被声明为register类型,以便将其存储在寄存器中。这样做可以提高循环的执行速度,因为i是一个频繁访问的计数器。

总结起来,C语言的register关键字用于向编译器建议将变量存储在寄存器中,以提高访问速度。然而,由于编译器对register关键字的处理是可选的,使用它并不一定会带来显著的性能提升。在编写代码时,应该谨慎使用register关键字,并确保性能优化的需求真正存在。

相关文章:

C语言之函数详解

目录 函数的定义 函数的调用 变量的存储类型 auto自动变量 extern外部变量 static静态变量 register寄存器变量 函数的定义 在C语言中&#xff0c;函数是一段可重复使用的代码块&#xff0c;用于执行特定的任务。函数的定义包括函数的声明和函数体两个部分。 函数的声…...

华纳云:mysql创建触发器报错的原因及解决方法是什么

在 MySQL 中创建触发器时可能会出现错误&#xff0c;这些错误通常是由于多种原因引起的&#xff0c;包括语法错误、权限问题、表结构问题等。以下是一些常见的创建触发器报错的原因和相应的解决方法&#xff1a; 1. 语法错误&#xff1a; 原因&#xff1a; 创建触发器的SQL语句…...

C++笔记之初始化二维矩阵的方法

C笔记之初始化二维矩阵的方法 —— 2023年5月20日 上海 code review! 文章目录 C笔记之初始化二维矩阵的方法一.常见方法1. 使用数组2. 使用向量3. 使用数组的动态分配4. 使用嵌套的 std::vector 并使用resize方法5. 初始化固定大小的 std::array 二.C中使用vector初始化二维矩…...

ArrayList与List的层级关系及ArrayList解析

List与ArrayList的关系 List List是一个接口&#xff0c;不能直接实例化。如果要使用必须去实例化List的实现类——ArrayList和LinkedList站在数据结构的角度看&#xff0c;List就是一个线性表。常见的线性表&#xff1a;顺序表、链表、栈、队列等 线性表 线性表是n个具有相…...

智慧公厕设备选型攻略,打造智能化便利生活体验

智慧公厕设备的选型对于打造智能化便利生活体验起着至关重要的作用。在不断提升城市品质的背景下&#xff0c;智慧公厕已成为城市建设中的一项重要内容。在选购智慧公厕设备时&#xff0c;我们需要考虑到不同版本的功能要求&#xff0c;确保公厕设备的质量和性能。本文以智慧公…...

TCP 协议的可靠传输机制是怎样实现的?

TCP 协议是一种面向连接的、可靠的、基于字节流的传输层协议。 1 它通过以下几种方法来保证数据传输的可靠性&#xff1a; 检验和&#xff1a;TCP 在发送和接收数据时&#xff0c;都会计算一个检验和&#xff0c;用来检测数据是否在传输过程中发生了错误或损坏。如果检验和不匹…...

Antv G6入门之旅--combo图

目录 什么是AntV G6 G6 的特性 G6 文档 安装 1 在项目中使用 NPM 包引入 2 在 HTML 中使用 CDN 引入 使用 Step 1 创建容器 Step 2 数据准备 Step 3 创建关系图 Step 4 配置数据源&#xff0c;渲染 React 中使用 G6 Combo图 什么是AntV G6 G6 是一个图可视化引擎…...

聊聊分布式架构09——分布式中的一致性协议

目录 01从集中式到分布式 系统特点 集中式特点 分布式特点 事务处理差异 02一致性协议与Paxos算法 2PC&#xff08;Two-Phase Commit&#xff09; 阶段一&#xff1a;提交事务请求 阶段二&#xff1a;执行事务提交 优缺点 3PC&#xff08;Three-Phase Commit&#x…...

探索流视频的发送

1.网络连接 2.主设备将某处视频开始的视频数据发送给从设备。 之前有读取本地视频并播放的demo,所以可以先测试网络连接的问题。 先用模拟器进行模拟吧。方便进行测试。 是的&#xff0c;可以使用Android设备使用上述库或框架来构建实时Web应用程序。虽然这些库和框架在Java服…...

[ACTF2020 新生赛]Include 1

题目环境&#xff1a;超链接&#xff0c;点进去看看你能找到flag吗&#xff1f;除了这些网页什么都没有&#xff0c;但是不当紧&#xff0c;因为我们有一双善于发现的眼睛&#x1f440;F12瞅瞅无&#xff0c;并无其他等等URL看了吗&#xff1f;发现存在一个参数file&#xff0c…...

教师必备宝藏,强烈推荐

亲爱的教师朋友们&#xff0c;你们是不是在为学期末成绩查询而头疼呢&#xff1f;一学期下来&#xff0c;成堆的试卷和成绩单&#xff0c;还有学生家长的各种咨询&#xff0c;让人应接不暇。现在&#xff0c;我给你们分享一个教师必备的宝藏&#xff0c;让你们的成绩查询工作变…...

「北大社送书」学习MATLAB—从算法到实战

MATLAB科学计算从入门到精通 一句话推荐书籍特色内容简介书籍概览 从代码到函数&#xff0c;从算法到实战&#xff0c;从问题到应用&#xff0c;由浅入深掌握科学计算方法&#xff0c;高效解决实际问题。 一句话推荐 科学计算基础入门&#xff0c;高效解决实际问题。 书籍特色…...

clion安装C++远程linux开发并调试 从装centos虚拟机到完美开发调试

下载镜像 阿里云镜像 从vmware上安装虚拟机并提权开放ssh 更新编译环境 一般 gcc gdb 版本都是比较低的&#xff0c;适配不了clion的最低要求。 升级gdb参考博客 升级gcc参考博客 安装CMAKE 官方的源使用wget即可下载 未找到openssl的解决办法 注意版本&#xff0c;又踩个…...

Android笔记

目录 触摸事件java弱引用WorkerThread注解NonNull注解camera.setFrameProcessingFormat(ImageFormat.YUV_420_888);YUV_420_888的字节数据长啥样YUV_420_888的字节数组长啥样 触摸事件 java弱引用 创建对象的弱引用&#xff0c;在没有强引用指向改对象的情况下&#xff0c;垃圾…...

Java虚拟机内存区域、异常、垃圾收集器

java虚拟机 java内存区域 jvm的主要组成部分及作用 主要包含两个子系统和两个组件 子系统 类加载器&#xff08;Class loader&#xff09;&#xff1a;根据给定的类路径来装载class文件到运行时数据区 …...

深入理解JVM虚拟机第十三篇:详解JVM中的程序计数器

文章目录 一:程序计数器 1:概念 2:官方说法 3:图解 4:特点...

《合成孔径雷达成像算法与实现》Figure5.5

clc clear close all%% 参数设置 Ta 64; % 脉冲持续时间 Ka -1.56e-2; % 方位向调频率 Delta_f_dop abs(Ta*Ka); …...

leetcode经典面试150题---2.移除元素

题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新…...

【尘缘赠书活动:01期】Python数据挖掘——入门进阶与实用案例分析

引言 本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功率等情况&#xff0c;分析各电力设备的实际用电量&#xff0c;进而为电力公司制定电能能源策略提供一定的参考依据。更多详细内容请参考**《Python数据挖掘&#xff1a;入门进阶与实用案例…...

计算机网络(谢希仁)第八版课后题答案(第二章)

1.物理层要解决哪些问题&#xff1f;物理层的主要特点是什么&#xff1f; (1)物理层要尽可能地屏蔽掉物理设备和传输媒体&#xff0c;通信手段的不同&#xff0c;使数据链路层感觉不到这些差异&#xff0c;只考虑完成本层的协议和服务。 (2)给其服务用户&#xff08;数据链路…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...