『C语言入门』探索C语言函数
文章目录
- 导言
- 一、函数概述
- 定义与作用
- 重要性
- 二、函数分类
- 库函数
- 自定义函数
- 定义
- 使用
- 好处
- 三、函数参数
- 实际参数(实参)
- 形式参数(形参)
- 内存分配
- 四、函数调用
- 传值调用
- 传址调用
- 五、函数嵌套调用与链式访问
- 嵌套调用
- 链式访问
- 六、函数声明与定义
- 函数声明
- 函数定义
- 七、递归
- 概念
- 核心思想
- 满足条件
- 举例
- 总结
导言
在现代编程中,函数被视为软件开发的基石,无论是小型脚本还是大型应用程序,都离不开函数的支持。C语言,作为一门广泛使用的编程语言,深刻地体现了函数在构建可维护、高效和模块化代码方面的重要性。在本篇博客中,我们将深入探讨C语言函数的各个方面,从基础概念到高级应用,帮助你更好地理解和应用函数。
一、函数概述
定义与作用
函数是一段封装了特定任务或操作的代码块。它接受输入,执行操作,并可能返回输出。**函数通过将代码逻辑划分为小块,使得问题更易于处理和理解。**这种模块化方法有助于减少代码复杂性,提高代码质量。
重要性
- 模块化和可维护性: 函数允许将复杂任务分解为更小、更易管理的部分。这种模块化方法使得定位和修复问题更加容易,提高了代码的可维护性。
- 代码重用: 编写一次函数,可以在多处地方调用。这消除了重复编写类似代码的需要,节省了时间和工作量。
- 可读性: 函数将任务划分为逻辑块,使得代码逻辑更加清晰。合理的函数命名和抽象层级可以使代码更易于理解。
- 团队协作: 函数使团队成员能够独立地开发和维护不同的功能模块,提高了团队的效率和协作能力。
二、函数分类
库函数
库函数是在C语言中预先定义好的函数,它们提供了许多常见任务的实现方法。这就像一个程序员的工具箱,你可以随时拿来使用,而不必从头开始编写代码。
-
输入输出函数 (
stdio.h
):printf
:用于在屏幕上输出格式化的信息。scanf
:用于从键盘读取输入,并根据格式化字符串解析输入。
#include <stdio.h>int main() {printf("Hello, World!\n");int num;scanf("%d", &num);return 0; }
-
数学函数 (
math.h
):sqrt
:计算给定数字的平方根。pow
:计算一个数字的指数幂。
#include <math.h>int main() {double squareRoot = sqrt(25.0);double power = pow(2.0, 3.0);return 0; }
-
字符串函数 (
string.h
):strlen
:计算字符串的长度。strcpy
:将一个字符串复制到另一个字符串。
#include <string.h>int main() {char str1[] = "Hello";char str2[10];strcpy(str2, str1);return 0; }
通过使用这些库函数,你可以轻松地执行各种任务,而不必从头编写代码。库函数已经经过优化和测试,因此它们可以提高代码的稳定性和效率。
自定义函数
自定义函数是你自己编写的、用于完成特定任务的代码块。通过将代码划分为自定义函数,你可以使程序更加模块化和可维护。让我们更详细地了解如何定义、调用和使用自定义函数。
定义
自定义函数由程序员根据需要编写,通常包括以下组成部分:
- 返回类型(Return Type): 表示函数返回的数据类型,可以是整数、浮点数、字符等。
- 函数名(Function Name): 函数的标识符,用于在程序中唯一标识函数。
- 参数列表(Parameter List): 一组用逗号分隔的参数,用于向函数传递数据。
- 函数体(Function Body): 包含实际的代码,执行特定的任务。
// 自定义函数的定义
返回类型 函数名(参数列表) {// 函数体// 执行任务的代码
}
使用
让我们通过一个例子来演示如何定义和使用自定义函数。我们要编写一个函数,计算两个整数的和。
#include <stdio.h>// 自定义函数,计算两个整数的和
int add(int a, int b) {return a + b;
}int main() {int num1 = 5, num2 = 3int result = add(num1, num2); // 调用自定义函数printf("Sum: %d\n", result);return 0;
}
在这个示例中,我们首先定义了一个名为
add
的自定义函数。它接受两个整数参数a
和b
,并在函数体中将它们相加后返回结果。在main
函数中,我们调用了这个自定义函数,并将num1
和num2
作为参数传递给它。最终,我们将结果输出。
好处
- 模块化: 将复杂任务拆分成小块,易于管理和理解。
- 重用性: 编写一次函数,多处调用,避免重复编写代码。
- 可读性: 函数名和功能描述清楚,提高代码可读性。
- 维护性: 修改功能只需在一个地方进行,不影响其他代码。
三、函数参数
实际参数(实参)
实际参数,也称为实参,是在函数调用时传递给函数的值或变量。它们是函数调用中的真实数据,供函数在执行时使用。实际参数可以是常量、变量、表达式等。
让我们通过一个例子来理解实际参数的概念:
#include <stdio.h>// 自定义函数,计算两个数的平均值
double average(double num1, double num2) {return (num1 + num2) / 2;
}int main() {double a = 10.0, b = 20.0;double result = average(a, b); // 传递实际参数 a 和 bprintf("Average: %lf\n", result);return 0;
}
在这个示例中,a
和 b
是实际参数,它们被传递给 average
函数,用于计算平均值。
形式参数(形参)
形式参数,也称为形参,是在函数定义时声明的参数。它们是函数定义的一部分,用于接收调用函数时传递的实际参数。形式参数在函数体内部被当作变量来使用。
让我们通过一个例子来理解形式参数的概念:
#include <stdio.h>// 自定义函数,计算两个数的平均值
double average(double num1, double num2) { // 形式参数 num1 和 num2return (num1 + num2) / 2;
}int main() {double a = 10.0, b = 20.0;double result = average(a, b); // 传递实际参数 a 和 bprintf("Average: %lf\n", result);return 0;
}
在这个示例中,num1
和 num2
是形式参数,在函数定义中声明。当函数被调用时,实际参数 a
和 b
会被传递给形式参数。
函数的参数是在函数调用中传递数据的重要方式。实际参数是函数调用时传递的实际值,而形式参数是在函数定义中声明的变量,用于接收实际参数的值。通过理解参数的作用,你可以更好地控制函数的行为和功能。
内存分配
实际参数(实参)的内存分配:
实际参数在函数调用时传递给函数,通常通过值传递的方式。这意味着函数接收到的是实参的值的拷贝,而不是实参本身。这样做可以确保函数调用不会影响实参的原始值。
形式参数(形参)的内存分配:
形式参数在函数定义中声明,用于接收实际参数的值。它们通常是在函数调用时自动分配的局部变量。当函数被调用时,形式参数的内存会被分配,并且在函数执行结束后会被释放。
注意事项:
- 值传递和指针传递: 在C语言中,参数传递可以通过值传递或指针传递来实现。值传递会复制实参的值,而指针传递会传递实参的内存地址。使用指针传递时,函数可以修改实参的值。
- 内存开销: 在函数调用时,每个实参的拷贝都需要一定的内存开销。如果实参很大,多次函数调用可能会导致内存占用过大。这时可以使用指针传递来减少内存开销。
- 内存管理: 如果函数内部动态分配了内存(如使用
malloc
函数),确保在函数结束后释放这些内存,以避免内存泄漏。 - 作用域: 形式参数的作用域仅限于函数内部。它们不能在函数外部访问。而实际参数的作用域是在函数调用的上下文中。
- 返回值传递: 函数的返回值也是通过值传递的方式传递给调用者。如果返回的是一个复杂类型(如结构体),系统会自动处理其复制。
理解实际参数和形式参数在内存上的处理方式,以及值传递和指针传递的区别,对于正确使用函数参数非常重要。合理管理内存,避免内存泄漏,并了解数据在函数调用过程中的传递方式,将有助于编写更健壮和高效的程序。
四、函数调用
当我们在程序中调用函数时,参数传递的方式会影响函数如何处理数据。让我们更详细地探讨函数的调用方式,以及它们在内存中的操作,通过实例来进一步理解。
传值调用
传值调用是一种参数传递方式,意味着在函数调用时,函数会得到实际参数的一个副本。这样,函数内部的操作不会影响原始实际参数的值。让我们看一个交换两个整数值的例子:
#include <stdio.h>void swapByValue(int a, int b) {int temp = a;a = b;b = temp;
}int main() {int x = 5, y = 10;printf("Original values: x = %d, y = %d\n", x, y);swapByValue(x, y);printf("After swapByValue: x = %d, y = %d\n", x, y);return 0;
}
在这个例子中,swapByValue
函数虽然对 a
和 b
进行了交换,但函数外的 x
和 y
值却没有改变,因为函数得到的是 x
和 y
的复制品。
传址调用
传址调用使用指针传递参数,这意味着函数获得实际参数的内存地址。通过操作这些内存地址,函数可以直接改变实际参数的值。让我们再次使用交换函数来演示传址调用:
#include <stdio.h>void swapByReference(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}int main() {int x = 5, y = 10;printf("Original values: x = %d, y = %d\n", x, y);swapByReference(&x, &y);printf("After swapByReference: x = %d, y = %d\n", x, y);return 0;
}
在这个例子中,我们传递了 x
和 y
的地址给 swapByReference
函数。通过操作这些地址,函数成功地实现了 x
和 y
的交换。
五、函数嵌套调用与链式访问
嵌套调用
函数的嵌套调用是指在一个函数内部调用另一个函数。通过这种方式,你可以将一个大任务分解为更小的子任务,并将其分配给不同的函数来完成。嵌套调用可以使代码更加模块化和可读。
让我们通过一个例子来理解嵌套调用:
#include <stdio.h>// 函数A:打印数字
void printNumber(int num) {printf("Number: %d\n", num);
}// 函数B:调用函数A两次
void callPrintNumberTwice(int num1, int num2) {printNumber(num1);printNumber(num2);
}int main() {int x = 5, y = 10;callPrintNumberTwice(x, y); // 嵌套调用return 0;
}
在这个例子中,callPrintNumberTwice
函数在内部两次调用了 printNumber
函数,实现了对两个数字的打印。
链式访问
链式访问是指在一个表达式中连续调用多个函数。这种方式可以使代码更加紧凑和易于理解,特别适用于一系列相关的操作。
让我们通过一个例子来理解链式访问:
#include <stdio.h>// 函数A:返回数字的平方
int square(int num) {return num * num;
}// 函数B:返回数字的两倍
int doubleNumber(int num) {return num * 2;
}int main() {int x = 5;int result = doubleNumber(square(x)); // 链式访问printf("Result: %d\n", result);return 0;
}
在这个例子中,我们在一行中调用了 doubleNumber
函数和 square
函数,实现了对数字的平方和两倍的操作。
函数的嵌套调用和链式访问是提高代码模块化和可读性的有效手段。嵌套调用可以将大任务分解为小任务,使代码更加结构化。链式访问可以在一行代码中完成多个操作,使代码更加紧凑。通过理解这些概念,你可以更好地设计和组织你的程序。
六、函数声明与定义
函数声明
函数声明是在使用函数之前告诉编译器函数的存在和怎么使用。它们包括函数的名称、返回类型和参数列表。通过声明,编译器知道如何正确调用这个函数。
让我们看一个例子:
// 函数声明
int add(int a, int b);int main() {int x = 5, y = 10;int result = add(x, y); // 使用函数之前进行了声明return 0;
}// 函数定义
int add(int a, int b) {return a + b;
}
在这个例子中,我们在 main
函数之前声明了 add
函数。这允许我们在 main
函数中调用它,因为编译器知道 add
函数需要两个整数参数并返回一个整数。
函数定义
函数定义是给函数提供实际的代码实现,它告诉编译器函数应该做什么。定义包括函数的名称、返回类型、参数列表和函数体(代码块)。
再看一次例子:
// 函数声明
int add(int a, int b);int main() {int x = 5, y = 10;int result = add(x, y); // 使用函数return 0;
}// 函数定义
int add(int a, int b) {return a + b; // 函数的具体代码实现
}
在这个例子中,add
函数的定义包括函数体中的代码,即实际的加法操作。
函数的声明告诉编译器函数的签名,使得在调用函数之前编译器知道函数的存在和参数。函数的定义提供了函数的具体代码实现。通过这两者,我们可以更好地组织和使用函数。正确的声明和定义对于编写易于维护和理解的代码非常重要。
七、递归
概念
递归是一种编程技术,它指的是一个函数在其自身内部调用自己。换句话说,递归是一种通过重复将问题分解为更小的相似子问题来解决问题的方法。这种方法特别适用于那些可以被分解成相同类型问题的情况。
核心思想
递归的核心思想是将一个大问题分解成一个或多个小问题,然后通过递归调用来解决这些小问题。每次递归调用都会缩小问题的规模,直到问题变得足够小,可以通过简单的方法解决,通常称为**“基本情况”**。
满足条件
递归的实现需要满足两个主要条件:
- 基本情况: 每个递归函数必须有一个或多个基本情况,即不再递归调用而是直接返回结果的情况。这些基本情况是递归的终止条件,防止函数无限递归。
- 递归情况: 除了基本情况,递归函数在解决问题时会调用自身,但是问题规模会减小,以便最终达到基本情况。
举例
例子:计算阶乘
阶乘是一个正整数的所有小于等于它的正整数的乘积。
- 基本情况: 基本情况是递归的终止条件。在这个例子中,基本情况是当计算阶乘的数为 0 或 1 时,阶乘结果是 1。这是因为 0 的阶乘和 1 的阶乘都是 1。
- 递归情况: 递归情况是指我们如何将问题分解成更小的子问题。在计算阶乘时,我们将问题分解为计算
(n - 1)!
,其中n
是当前数。这是因为n!
等于n
乘以(n - 1)!
。我们通过递归调用来解决(n - 1)!
这个子问题。
让我们用代码来表示:
#include <stdio.h>// 递归函数计算阶乘
int factorial(int n) {if (n == 0 || n == 1) {return 1; // 基本情况} else {return n * factorial(n - 1); // 递归情况}
}int main() {int num = 5;int result = factorial(num);printf("Factorial of %d is %d\n", num, result);return 0;
}
在这个例子中,当我们计算 5!
时,递归会依次计算 4!
、3!
、2!
、1!
,直到达到基本情况为止。然后,所有这些部分结果会合并起来得到 5!
的最终结果。
通过满足基本情况和递归情况,我们能够在递归中解决问题,将问题分解为越来越小的子问题,直到基本情况可以直接返回结果。
总结
本篇博客我们深入探讨了C语言中函数的各个方面,从基本概念到高级应用,帮助你更好地理解和运用函数编程。
- 函数的基本概念: 我们从函数是什么开始,它是一个独立的代码块,接受输入并产生输出。函数帮助我们将代码模块化,提高可维护性和重用性。
- C语言中函数的分类:
- 库函数: 库函数是预先定义好的函数,通过
#include
引入库文件就可以使用。我们详细讨论了库函数的使用和目的。 - 自定义函数: 自定义函数由程序员编写,用于解决特定问题。我们探讨了如何定义和调用自定义函数,并通过例子展示了它们的用法。
- 库函数: 库函数是预先定义好的函数,通过
- 函数的参数: 我们讨论了实际参数和形式参数,以及在函数调用过程中内存上的注意事项。函数参数是传递数据和信息的桥梁,正确的参数使用对于函数的正确运行至关重要。
- 函数的调用: 我们详细介绍了传值调用和传址调用,通过举例说明了它们的不同。理解这些调用方式有助于我们更好地控制函数之间的数据传递和交互。
- 函数的嵌套调用和链式访问: 嵌套调用和链式访问是函数调用的进阶技巧。我们阐述了它们的概念,并通过例子解释了如何在程序中应用它们,提高代码的模块化和紧凑性。
- 函数的声明和定义: 函数的声明和定义是代码组织中的关键。我们解释了函数声明和定义的目的,以及它们如何帮助我们在程序中正确地使用函数。
- 函数递归: 递归是一种强大的编程技巧,通过在函数内部调用自身来解决问题。我们详细讨论了递归的概念、两个必要条件以及与迭代的对比,通过计算阶乘的例子来阐述递归的工作原理。
通过这篇博客,你应该对C语言中函数的各个方面有了更深入的理解。函数是编程的基础,掌握好函数的使用和原理将帮助你编写更加清晰、模块化和高效的代码。
相关文章:
『C语言入门』探索C语言函数
文章目录 导言一、函数概述定义与作用重要性 二、函数分类库函数自定义函数定义使用好处 三、函数参数实际参数(实参)形式参数(形参)内存分配 四、函数调用传值调用传址调用 五、函数嵌套调用与链式访问嵌套调用链式访问 六、函数…...

Django基础3——视图函数
文章目录 一、基本了解1.1 Django内置函数1.2 http请求流程 二、HttpRequest对象(接受客户端请求)2.1 常用属性2.2 常用方法2.3 服务端接收URL参数2.4 QueryDict对象2.5 案例2.5.1 表单GET提交2.5.2 表单POST提交2.5.3 上传文件 三、HttpResponse对象&am…...
python 基础篇 day 4 选择结构—— if 结构
文章目录 if 基础结构单 if 语句if-else 语句if-elif-else 语句嵌套的 if 语句 if 进阶用法使用比较运算符使用逻辑运算符使用 in 关键字range() 函数使用 is 关键字使用 pass 语句 三目运算符语法例子注意补充举例注意 if 基础结构 单 if 语句 if 条件: 执行条件为真时的代码…...

科技赋能,教育革新——大步迈向体育强国梦
在 "全民健身"、"体育强国建设"战略的推进下,体育考试成绩被纳入重要升学考试且分值不断提高,体育科目的地位逐步上升到前所未有的高度,在此趋势下,体育教学正演变出更多元化、个性化的需求。然而现实中却面临…...
【秋招基础】后端开发——笔面试常见题目
综述: 💞目的:本系列是个人整理为了秋招算法的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于网上知识点进行的,每个代码参考热门博客和GPT3.5࿰…...

自定义loadbalance实现feignclient的自定义路由
自定义loadbalance实现feignclient的自定义路由 项目背景 服务A有多个同事同时开发,每个同事都在dev或者test环境发布自己的代码,注册到注册中心有好几个(本文nacos为例),这时候调用feign可能会导致请求到不同分支的服务上面,会…...

论文笔记:从不平衡数据流中学习的综述: 分类、挑战、实证研究和可重复的实验框架
0 摘要 论文:A survey on learning from imbalanced data streams: taxonomy, challenges, empirical study, and reproducible experimental framework 发表:2023年发表在Machine Learning上。 源代码:https://github.com/canoalberto/imba…...
C#设计模式六大原则之--迪米特法则
设计模式六大原则是单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则。它们不是要我们刻板的遵守,而是根据实际需要灵活运用。只要对它们的遵守程度在一个合理的范围内,努为做到一个良好的设计。本文主要介绍一下.NET(C#)…...
一次js请求一般情况下有哪些地方会有缓存处理?
目录 1、DNS缓存 2、CDN缓存 3、浏览器缓存 4、服务器缓存 1、DNS缓存 DNS缓存指DNS返回了正确的IP之后,系统就会将这个结果临时储存起来。并且它会为缓存设定一个失效时间 (例如N小时),在这N小时之内,当你再次访问这个网站时࿰…...
CSDN编程题-每日一练(2023-08-24)
CSDN编程题-每日一练(2023-08-24) 一、题目名称:计算公式二、题目名称:蛇形矩阵三、题目名称:小玉家的电费一、题目名称:计算公式 时间限制:1000ms内存限制:256M 题目描述: 给定整数n。 计算公式: n i-1 ∑ ∑ [gcd(i + j, i - j) = 1] i=1 j=1 输入描述: 输入整数n…...

怎么把PDF转成Word?需要注意什么事项?
PDF是一种常见的文档格式,但是与Word文档不同,PDF文件通常不能直接编辑。如果您想编辑PDF文件中的文本,或者想将PDF文件转换为Word文档,下面我们就来看一看把PDF转成Word有哪些方法和注意事项。 PDF转Word工具 有许多将PDF转换为…...
USACO22OPEN Pair Programming G
P8273 [USACO22OPEN] Pair Programming G 题目大意 一个程序由一系列指令组成,每条指令的类型如下: d \times d d,其中 d d d是一个 [ 0 , 9 ] [0,9] [0,9]范围内的整数 s s s,其中 s s s是一个表示变量名称的字符串ÿ…...
实战分享之springboot+easypoi快速业务集成
1.依赖引入 <!--引入EasyPOI--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</group…...
金字塔原理(思考的逻辑)
前言:前面学习了表达的逻辑,那在表达之前,如何组织内容?如何进行思考?接下来看第二篇——思考的逻辑。 目录 应用逻辑顺序 时间顺序 结构顺序 程度顺序 概括各组思想 什么是概括? 思想表达方式 如…...
机器学习之前向传播(Forward Propagation)和反向传播(Back propagation)
前向传播(Forward Propagation)和反向传播(Back propagation)是深度学习中神经网络训练的两个关键步骤。 前向传播(Forward Propagation): 定义:前向传播是指从神经网络的输入层到输…...

Matlab高光谱遥感数据处理与混合像元分解实践技术
光谱和图像是人们观察世界的两种方式,高光谱遥感通过“图谱合一”的技术创新将两者结合起来,大大提高了人们对客观世界的认知能力,本来在宽波段遥感中不可探测的物质,在高光谱遥感中能被探测。以高光谱遥感为核心,构建…...

Docker consul的容器服务注册与发现
前言一、服务注册与发现二、consul 介绍三、consul 部署3.1 consul服务器3.1.1 建立 Consul 服务3.1.2 查看集群信息3.1.3 通过 http api 获取集群信息 3.2 registrator服务器3.2.1 安装 Gliderlabs/Registrator3.2.2 测试服务发现功能是否正常3.2.3 验证 http 和 nginx 服务是…...
Spring注入外部 工厂类Bean
问题 对于一些使用建造者模式的 Bean,我们往往不能直接 new 出来,这些 Bean 如果需要注册到 Spring 容器中,我们就需要使用工厂类。 比如我们项目中经常使用的okhttp: 如果我们想把OkHttpClient注册到Spring容器中,该怎么做? …...

WPF网格拖动自动布局效果
WPF网格拖动自动布局效果 使用Canvas和鼠标相关事件实现如下的效果: XAML代码: <Window x:Class="CanvasTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:...
肯德尔秩相关系数(Kendall‘s Tau)排名
肯德尔秩相关系数(Kendall’s Tau)是一种用于衡量两个排列之间相似性的统计指标,它考虑了元素之间的顺序关系而不考虑具体数值。该系数被广泛用于排序、排名和比较不同实验结果的相关性等领域。 具体而言,肯德尔秩相关系数衡量了…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...