详解C语言函数:深入了解函数的使用和特性

news2025/2/23 17:08:43

目录

引言

一、函数的概念

1.1 函数关键特点

1.2 函数的组成部分

1.3 函数声明和定义格式

二、函数分类

2.1 库函数

使用库函数的步骤

2.2 自定义函数

创建自定义函数的步骤

三、函数的参数类型

3.1 形式参数(形参):

格式:

示例:

3.2 实际参数(实参):

格式:

示例:

四、函数调用

4.1 传值调用(Call by Value):

特点

示例

4.2 传址调用(Call by Reference):

特点:

示例

五、函数的嵌套调用和链式访问

5.1 函数的嵌套调用

示例

5.2 链式访问

示例

七、函数的声明和定义

7.1 函数的声明

格式

7.2 函数的定义 

格式

7.3 示例

八、分文件编写

8.1 分文件编写的步骤

8.2 示例

头文件 calculator.h

源文件 calculator.c

主文件 main.c

九、函数递归

9.1 递归的关键要素

9.2 递归的示例

9.3 递归的优缺点

9.4 递归的注意事项

十、栈溢出

10.1 原因

10.2 影响

10.3 预防栈溢出的方法

10.4 示例

结束语


引言

嗨,编程的冒险者们!今天,我将带你们进入函数的神奇世界,就像是探索了一个充满谜题和美味食物的迷宫🚀🍔。

我们可以把函数比作是编程的秘密配方,每个函数就像是一道独特的料理,拥有其独特的味道和风味。而这篇博客,就是为了揭示这些秘密配方的制作过程!从调味品到烹饪方式,让我们一起揭开C语言函数的神秘面纱,开始我们的编程烹饪之旅吧!🍳🧁🌮

一、函数的概念

当我们谈论编程中的函数时,就像是在探索一座魔幻厨房,每个角落都充满了独特的烹饪法和食材组合。那么,什么是函数呢?在这个神奇的编程世界中,函数就是你的独特食谱,用于完成特定的任务。

1.1 函数关键特点

  1. 模块化 函数将代码分割成小块,每个函数专注于完成一个特定的任务。这样,你可以更清晰地组织代码,提高可读性和可维护性。

  2. 复用性 一旦你创建了一个函数,你可以在程序的不同部分多次调用它,无需重复编写相同的代码。这大大提高了代码的复用性和效率。

  3. 抽象性 函数隐藏了内部实现细节,使你只需关注函数的输入和输出。这种抽象让你能够更专注于问题的解决,而不必过多关心实现细节。

  4. 可维护性 将功能模块化后,当你需要进行修改或优化时,只需关注特定函数而不影响其他部分,从而降低了出错的风险

1.2 函数的组成部分

  1. 函数名 用于唯一标识函数。好的函数名应该具有描述性,能够表达出函数的作用。

  2. 参数列表 一组在函数调用时传递给函数的值。参数是函数执行的“食材”。

  3. 返回类型 指定函数返回值的类型。函数可以有返回值,也可以没有。

  4. 函数体 包含实际的代码,执行特定的任务。这是函数的“烹饪步骤”

1.3 函数声明和定义格式

在使用函数之前,你需要声明函数以告诉编译器函数的存在和特性。函数的声明包括函数名、参数列表和返回类型。然后,在程序的其他地方,你需要定义函数,即提供函数体内的实际代码

// 函数声明
返回类型 函数名(参数列表);

int main() {
    // 调用函数
    返回类型 result = 函数名(参数值);
    return 0;
}

// 函数定义
返回类型 函数名(参数列表) {
    // 函数体
    // 执行任务的代码
    return 返回值;
}

让我们通过一个简单的示例来说明这些要素:

#include <stdio.h>

// 函数声明
int add(int num1, int num2);

int main() {
    int result = add(5, 7);
    printf("5 + 7 = %d\n", result);
    return 0;
}

// 函数定义
int add(int num1, int num2) {
    int sum = num1 + num2;
    return sum;
}

二、函数分类

2.1 库函数

库函数是预先编写好的函数,由编程语言或操作系统提供,以供程序员在自己的代码中使用。这些函数涵盖了各种常见的任务,如数学运算字符串处理文件操作等,让你能够更快速地实现复杂的功能。

使用库函数的步骤

  1. 包含头文件 首先,你需要包含与你想要使用的库函数对应的头文件。这些头文件通常以.h为扩展名。

  2. 调用库函数 一旦你包含了头文件,就可以在你的代码中调用库函数了。使用函数的名称和参数列表,就可以完成特定的任务。

  3. 编译 最后,确保你的代码能够正确链接到库函数。这通常需要指定编译器链接相应的库。

让我们演示使用C标准库中的sqrt函数,这个函数用于计算一个数的平方根。

#include <stdio.h>  // 包含标准I/O库的头文件
#include <math.h>   // 包含数学库的头文件

int main() {
    double number = 25.0;
    double squareRoot = sqrt(number);  // 调用sqrt函数计算平方根

    printf("The square root of %.2f is %.2f\n", number, squareRoot);
    return 0;
}

在这个示例中,我们包含了<math.h>头文件,这是C标准库中的数学库。然后,我们使用了sqrt函数来计算给定数字的平方根。通过这个简单的例子,你可以体会到库函数的威力,无需手动实现复杂的数学运算,而是利用现有的函数来解决问题。

库函数的使用让你的编程生活更加轻松和高效。无论是数学运算、字符串处理、内存管理还是文件操作,库函数都能够为你提供强大的功能。接下来,我们将继续探索自定义函数,这是展现你独特编程技能的机会,就像是创作了一道独一无二的美食!🍲🍰🍣

2.2 自定义函数

正如大厨独创的独特菜谱一样,自定义函数让你能够编写符合自己需求的独特代码块。通过自定义函数,你可以将一系列操作封装起来,创建属于自己的编程风格和模块。

创建自定义函数的步骤

  1. 定义函数 首先,你需要定义自己的函数,这包括函数名、参数列表、返回类型和函数体。函数名应该具有描述性,能够清楚地表达函数的作用。

  2. 函数体 在函数体中,你可以编写实际的代码,完成特定的任务。这些任务可以是数学运算、数据处理、逻辑判断等等。

  3. 调用函数 一旦你定义了函数,就可以在程序中的其他地方调用它。通过使用函数名和参数,你可以执行函数内的代码块。

下面是一个简单的自定义函数示例,我们将创建一个名为calculateSquare的函数,用于计算一个数的平方。

#include <stdio.h>

// 函数声明
double calculateSquare(double num);

int main() {
    double number = 5.0;
    double square = calculateSquare(number);  // 调用自定义函数

    printf("The square of %.2f is %.2f\n", number, square);
    return 0;
}

// 函数定义
double calculateSquare(double num) {
    double square = num * num;
    return square;
}

在这个示例中,我们首先声明了名为calculateSquare的函数,它接受一个double类型的参数,并返回一个double类型的值。然后,在main函数中,我们调用了这个自定义函数,将计算结果存储在square变量中,并通过printf函数输出。

通过自定义函数,你可以将复杂的操作封装起来,提高代码的可读性和可维护性。这就像是创作了一道属于自己的独特美食,让编程更具创意和个性!🍝🍛🍱

三、函数的参数类型

当谈论函数参数时,通常会区分两个重要的概念:形式参数和实际参数。形式参数是函数定义中用来表示参数的变量,而实际参数是在函数调用时传递给函数的具体值。让我们来详细了解这两个概念以及它们的作用。

3.1 形式参数(形参):

形式参数是在函数定义中声明的参数,它们充当函数体内部的局部变量。形参在函数定义中给出的类型和名称,决定了函数将接受哪种类型的参数。

格式:

返回类型 函数名(参数类型 形式参数名) {
    // 函数体
}

示例:

#include <stdio.h>

void printMessage(char msg[]) {
    printf("%s\n", msg);
}

int main() {
    char message[] = "Hello, world!";
    printMessage(message);
    return 0;
}

在这个示例中,printMessage 函数定义中的 char msg[] 就是形式参数。它在函数内部被当作局部变量使用,用于存储传递给函数的字符串。

3.2 实际参数(实参):

实际参数是在函数调用时传递给函数的具体值,它们是实际参与函数运算的数据。实参可以是常量、变量、表达式等,这些值被传递给函数,供函数在执行时使用。

格式:

函数名(实际参数);

示例:

#include <stdio.h>

int add(int num1, int num2) {
    return num1 + num2;
}

int main() {
    int result = add(5, 7);
    printf("5 + 7 = %d\n", result);
    return 0;
}

在这个示例中,add 函数的调用中的 57 就是实际参数。这些实参的值被传递给 add 函数,用于执行加法运算。

通过形式参数和实际参数,你可以将数据传递给函数并进行操作。形参定义了函数将接受哪种类型的参数,而实参提供了具体的值,使函数能够进行计算和处理。

四、函数调用

当我们在调用函数时,参数可以通过不同的方式传递给函数,这导致了两种主要的调用方式:传值调用和传址调用。让我们详细介绍这两种调用方式及其区别。

4.1 传值调用(Call by Value):

在传值调用中,函数接受的是实际参数的一个副本,而不是实际参数本身。这意味着函数内部对参数的任何修改都不会影响原始的实际参数值。

特点

  • 函数的形式参数(形参)充当局部变量,对形参的修改不会影响外部实际参数(实参)。
  • 适用于那些不需要修改实参值的情况。

示例

#include <stdio.h>

void modifyValue(int num) {
    num = num * 2;
    printf("Inside function: %d\n", num);
}

int main() {
    int value = 5;
    modifyValue(value);
    printf("Outside function: %d\n", value);
    return 0;
}

在传值调用中,函数内部对参数 num 的修改不会影响到 value 变量的值。

4.2 传址调用(Call by Reference):

在传址调用中,函数接受的是实际参数的地址(指针),从而可以直接访问和修改实际参数的值。这意味着函数内部的修改会影响原始的实际参数值。

特点:

  • 函数的形参是指向实际参数内存地址的指针。对形参的修改会直接影响实际参数。
  • 适用于需要修改实参值的情况。

示例

#include <stdio.h>

void modifyValue(int *ptr) {
    *ptr = *ptr * 2;
    printf("Inside function: %d\n", *ptr);
}

int main() {
    int value = 5;
    modifyValue(&value);
    printf("Outside function: %d\n", value);
    return 0;
}

在传址调用中,函数内部对参数 ptr 所指向的值的修改会直接影响到 value 变量的值。

在C语言中,默认情况下是使用传值调用。如果你想要使用传址调用,需要将实际参数的地址传递给函数。这两种调用方式各有优劣,视具体情况而定。

传值调用适用于不需要修改原始值的情况,而传址调用适用于需要函数内部修改实参值的情况。

五、函数的嵌套调用和链式访问

函数的嵌套调用是一种强大的编程技巧,它允许你在一个函数内部调用另一个函数。这样的嵌套调用可以实现更复杂的操作,将大的问题分解成小的问题,并逐步解决。而链式访问是在函数调用的基础上,将多个函数调用连接起来,形成一个连续的操作序列。

5.1 函数的嵌套调用

函数的嵌套调用让你能够在一个函数内部调用另一个函数。这种技巧可以帮助你组织代码,使之更清晰和模块化。当一个函数的执行需要依赖于另一个函数的结果时,嵌套调用可以提供非常便捷的方式。

示例

#include <stdio.h>

int multiply(int a, int b) {
    return a * b;
}

int add(int x, int y) {
    return x + y;
}

int main() {
    int num1 = 3, num2 = 4, num3 = 2;

    int result = add(multiply(num1, num2), num3);
    printf("Result: %d\n", result);

    return 0;
}

在这个示例中,multiply 函数用于计算两个数的乘积,add 函数用于计算两个数的和。在 main 函数中,我们将 multiply(num1, num2) 的结果作为第一个参数传递给 add 函数,然后再将 num3 作为第二个参数传递。这样的嵌套调用可以在一行代码中完成多个函数的调用,使代码更紧凑。

5.2 链式访问

链式访问是指将多个函数调用连接起来,每个函数调用都作用于前一个函数调用的结果。这种技巧在某些情况下可以使代码更具可读性,特别是在进行一系列相关的操作时。

示例

#include <stdio.h>

int add(int x, int y) {
    return x + y;
}

int multiply(int a, int b) {
    return a * b;
}

int main() {
    int num1 = 3, num2 = 4, num3 = 2;

    int result = add(num1, num2);          // 计算和
    result = multiply(result, num3);       // 计算乘积
    printf("Result: %d\n", result);

    return 0;
}

在这个示例中,我们首先调用 add 函数计算 num1num2 的和,然后将结果传递给 multiply 函数,计算乘积。通过这种链式访问,可以更清楚地看到一系列操作的流程。

七、函数的声明和定义

在编写较大的程序时,函数的声明和定义变得非常重要

函数的声明告诉编译器函数的存在和特征,从而在调用函数之前提前知道函数的信息。函数的定义提供了实际的函数实现,包括函数体内的代码。

7.1 函数的声明

函数的声明告诉编译器有一个函数存在,以及该函数的名称、参数列表和返回类型。通过声明函数,你可以在函数调用之前让编译器知道函数的特征。

格式

返回类型 函数名(参数列表);

7.2 函数的定义 

函数的定义提供了函数的实际实现,包括函数体内的代码。函数的定义通常在函数的声明之后,定义了函数在被调用时具体执行的任务。

格式

 

7.3 示例

 

在这个示例中,我们首先在 main 函数前面声明了 add 函数,这使得编译器知道了 add 函数的存在、参数和返回类型。然后在 main 函数中调用了 add 函数。

八、分文件编写

随着程序逐渐增大,将所有代码都写在一个文件中会变得不太实际和难以维护。为了提高代码的组织性和可维护性,可以将代码分割成多个文件,每个文件负责不同的功能。这就是分文件编写的概念。

8.1 分文件编写的步骤

  1. 头文件(Header Files) 头文件包含了函数的声明、结构体的定义、宏等。头文件通常具有 .h 扩展名,它们提供了对函数和结构体的接口。

  2. 源文件(Source Files) 源文件包含了函数的实际定义和具体代码。源文件通常具有 .c 扩展名,它们实现了头文件中声明的函数。

  3. 编译链接 在编译过程中,编译器需要将头文件和源文件一起处理,以生成最终的可执行文件。链接器将各个源文件中的代码合并在一起,生成最终的程序。

8.2 示例

头文件 calculator.h

#ifndef CALCULATOR_H
#define CALCULATOR_H

int add(int num1, int num2);
int subtract(int num1, int num2);

#endif

源文件 calculator.c

#include "calculator.h"

int add(int num1, int num2) {
    return num1 + num2;
}

int subtract(int num1, int num2) {
    return num1 - num2;
}

主文件 main.c

#include <stdio.h>
#include "calculator.h"

int main() {
    int num1 = 10, num2 = 5;

    int sum = add(num1, num2);
    int difference = subtract(num1, num2);

    printf("Sum: %d\n", sum);
    printf("Difference: %d\n", difference);

    return 0;
}

在这个示例中,我们将代码分为三个文件。calculator.h 是头文件,包含了 addsubtract 函数的声明。calculator.c 是源文件,实现了这两个函数。main.c 是主文件,包含了主函数和函数调用。在编译和链接时,编译器会将这三个文件一起处理,生成最终的可执行文件。

分文件编写让代码更具模块化,使得每个文件负责特定的功能。这种方法不仅提高了代码的可读性和可维护性,还有助于团队协作,每个成员可以专注于不同的模块。在分文件编写中,正确的头文件引用和函数声明是非常重要的,它们确保了代码的正确连接和执行。

九、函数递归

递归是一种编程技巧,它允许一个函数在其内部调用自身。递归是通过将大问题分解为更小的、相似的子问题来解决问题的方法。递归函数在解决问题时,将问题分解为一个或多个较小的问题,然后逐步解决这些小问题,最终得到问题的解。

9.1 递归的关键要素

  1. 基本情况(Base Case) 每个递归函数都需要定义一个基本情况,即无需再继续递归的情况。基本情况通常是递归问题的最小规模,可以直接求解。

  2. 递归调用(Recursive Call) 在递归函数内部,它会调用自身来解决更小规模的问题。递归调用通常通过改变函数的参数来逐步减小问题的规模,直到达到基本情况。

9.2 递归的示例

一个经典的递归示例是计算阶乘,即一个正整数 n 的阶乘表示为 n!,其计算方式为 n! = n * (n - 1) * (n - 2) * ... * 1

#include <stdio.h>

int factorial(int n) {
    // 基本情况:0! 和 1! 都等于 1
    if (n == 0 || n == 1) {
        return 1;
    }
    // 递归调用:n! = n * (n - 1)!
    return n * factorial(n - 1);
}

int main() {
    int n = 5;
    int result = factorial(n);
    printf("%d! = %d\n", n, result);
    return 0;
}

在这个示例中,factorial 函数通过递归的方式计算阶乘。基本情况是 0!1! 都等于 1,递归调用使用 n * factorial(n - 1) 的方式逐步计算 n!

9.3 递归的优缺点

优点:

  • 可以解决一些复杂问题,将问题分解为更小的子问题。
  • 代码结构清晰,更易于理解和维护。

缺点:

  • 需要额外的函数调用开销,可能导致性能问题。
  • 如果递归不受控制,可能会导致堆栈溢出。9.

9.4 递归的注意事项

  • 确保每次递归都向基本情况靠近,否则可能陷入无限递归。
  • 考虑性能问题,一些问题可以通过迭代方式更有效地解决。
  • 使用递归时,确保提供合适的终止条件。

十、栈溢出

栈溢出是在编程中常见的错误,它发生在函数调用和递归过程中,当程序的调用栈空间不足以容纳更多的函数调用和局部变量时,就会发生栈溢出。

10.1 原因

栈是一种存储函数调用、局部变量和临时数据的内存区域。当一个函数被调用时,其局部变量和返回地址等信息会被压入栈中,函数执行完毕后这些信息会从栈中弹出。如果函数调用层级太深或函数内部使用了大量的局部变量,栈空间可能会耗尽,导致栈溢出。

10.2 影响

栈溢出可能导致程序崩溃、异常终止或不可预测的行为。常见的影响包括:

  • 程序崩溃并显示错误消息。
  • 导致无限循环或不正确的计算结果。
  • 可能覆盖其他内存区域,影响其他变量和数据。

10.3 预防栈溢出的方法

  1. 递归深度控制 在使用递归时,确保递归深度不会太深,适时结束递归。
  2. 避免过多局部变量 减少函数内部的局部变量数量,或使用动态分配内存(堆)来存储大型数据。
  3. 迭代代替递归 对于可以使用迭代解决的问题,尽量使用迭代,避免无限递归。
  4. 增加栈大小 有些编程环境允许调整栈的大小,但不是所有情况都适用。
  5. 使用尾递归优化 一些编程语言支持尾递归优化,使递归调用不会增加额外的栈空间。

10.4 示例

#include <stdio.h>

void recursiveFunction(int count) {
    printf("Count: %d\n", count);
    recursiveFunction(count + 1); // 递归调用
}

int main() {
    recursiveFunction(1);
    return 0;
}

在这个示例中,recursiveFunction 函数会不断递归调用自身,每次增加计数。如果递归深度过大,栈可能会溢出。预防栈溢出的方法之一是通过添加终止条件来控制递归的次数

栈溢出是需要警惕的问题,特别是在涉及递归和大量函数调用的情况下。通过合理设计程序逻辑,限制递归深度,避免过多局部变量,以及使用适当的数据结构,你可以降低栈溢出的风险,使你的程序更稳定和可靠。

结束语

在本篇博客中,我们跟随着函数的编程旅程,就像是探险家在代码的大陆上寻宝一样!我们穿越了函数的迷宫,深入了解了它的每一个角落,从基础概念一直到递归的神秘境界。

🚀 函数,就像是编程的魔法咒语,让代码得以模块化,让复杂问题变得迎刃而解。我们一起领略了函数的魅力,从库函数到自定义函数,从函数的传参到递归的优雅,每一步都让我们更加强大!

🔍 无论是在代码的森林中追寻Bug,还是在问题的海洋里航行创新,函数都是你的忠实向导。通过深入理解函数的机制,我们更能在编程的世界中驾驭风云、创造奇迹!

📚 编程世界如此丰富多彩,而函数则是其中的一抹明亮的色彩。通过不断学习、实践和探索,你将在代码的世界中书写属于自己的传奇!

感谢你的耐心阅读,希望本篇博客能够为你打开函数的奥秘之门。如果你有任何问题、想法,或是想要继续探讨关于编程的话题,欢迎随时与我交流。愿你在编程的旅程中充满乐趣,继续探索,继续创造!

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

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

相关文章

【碎碎念随笔】1、回顾我的电脑和编程经历

✏️ 闲着无事&#xff0c;讲述一下我的计算机和代码故事 一、初识计算机 &#x1f5a5;️ 余家贫&#xff0c;耕植无钱买电脑。大约六年级暑假&#xff0c;我在姐姐哪儿第一次接触到了计算机&#xff08;姐姐也是买的二手&#xff09;。 &#x1f5a5;️ 计算机真有趣&#x…

如何投诉删除360搜索下拉词?

有的企业发现自己品牌在360搜索下拉框里会展现出来一些负面词&#xff0c;如骗子、跑路、倒闭等&#xff0c;有企业咨询能不能删除360搜索下拉里的负面词&#xff1f;小马识途营销顾问分析要看具体情况&#xff0c;按经验如果是涉及诋毁诽谤的词&#xff0c;投诉到平台能够删除…

检测新突破 | AlignDet:支持各类检测器自监督新框架(ICCV2023)

引言 论文链接&#xff1a;https://arxiv.org/abs/2307.11077 项目地址&#xff1a;https://github.com/liming-ai/AlignDet 这篇论文主要研究目标检测领域的自监督预训练方法。作者首先指出&#xff0c;当前主流的预训练-微调框架在预训练和微调阶段存在数据、模型和任务上的…

Kafka的下载和安装

一、Kafka下载和安装 下载地址&#xff1a;https://kafka.apache.org/downloads 下载完毕解压即可 linux解压命令tar -zxvf kafka_2.13-3.5.1.tgz&#xff0c;linux环境下指令是在\kafka_2.13-3.5.1\bin目录。 windows直接解压即可&#xff0c;windows环境下指令是在kafka_2.…

centos7 安装 docker 不能看菜鸟教程的 docker 安装,有坑

特别注意 不能看菜鸟教程的 docker 安装&#xff0c;有坑 如果机器不能直接上网&#xff0c;先配置 yum 代理 proxyhttp://172.16.0.11:8443 配置文件修改后即刻生效&#xff0c;再执行 yum install 等命令&#xff0c;就可以正常安装软件了。 参考 https://blog.csdn.net/c…

倒计时 1 天!浙江大学、乘云数字、阿里云等多位技术专家教授解读最新运维技术

莫听监控繁杂声&#xff0c;何妨观测且徐行&#xff1b; 智能诊断快胜马&#xff0c;一键运维定乾坤。 各位朋友们&#xff0c;距离系统运维 MeetUp 开始只剩 2 天&#xff01;此次 MeetUp 将围绕 Linux 的应用和系统可观测&#xff0c;eBPF 跟踪以及诊断技术等系统运维热门话…

ApiPost的使用

1. 设计接口 请求参数的介绍 Query:相当于get请求&#xff0c;写的参数在地址栏中可以看到 Body: 相当于 post请求&#xff0c;请求参数不在地址栏中显示。 请求表单类型&#xff0c;用form-data json文件类型&#xff0c;用row 2. 预期响应期望 设置完每一项点一下生成响应…

C#质检工具(StyleCop、SonarLint)

1、StyleCop StyleCop工具主要类似java中的checkStyle,是检查代码样式规范的工具。 1.1、StyleCop安装流程: 图1.1 图1.2 图1.3 安装StyleCop插件时可能会遇到下载特慢或卡住不动的情况,需注意: 1)网上说的关闭IPV6功能不管用 2)网上说的自动指定dns不管用 3)网上…

ip地址怎么改 手机ip地址怎么修改

IP地址是指互联网协议地址&#xff0c;是给互联网上的每台设备分配的一个唯一的标识符。改变IP地址是在一定的条件下&#xff0c;为了实现一些特定的目的而对设备的网络配置进行调整。下面将介绍一些常见的改变IP地址的方法。我们可以通过重启路由器或者计算机来更改IP地址。在…

域名配置HTTPS

一、注册域名 这个可以在各大平台注册&#xff0c;具体看一下就会注册了&#xff0c;自己挑选一个自己喜欢的域名。 步骤一般也就是先实名&#xff0c;实名成功了才能注册域名。 二、办理SSL证书 这里使用的是阿里云的SSL免费证书 1、申请证书 二、填写申请 三、域名绑定生…

vue elementui v-for 循环el-table-column 第一列数据变到最后一个

这个动态渲染table表格时发现el-table-column 第一列数据变到最后一个 序号被排到后面 代码 修改后 <el-table:data"tableData"tooltip-effect"dark"style"width: 100%"height"500"><template v-for"(item, index) i…

【计算机网络】应用层协议Https

文章目录 前言Http加密方法对称加密非对称加密数据摘要&#xff08;数据指纹&#xff09;数字签名 加密方案只使用对称加密只使用非对称加密双方都使用非对称加密对称非对称 证书 前言 上一篇文章中&#xff0c;我们提到http是不安全的&#xff0c;尽管采用了cookie和session的…

数字电路 || 逻辑代数基础

逻辑函数和最小项 最大项和最小项 Tips&#xff1a;最小项的反是最大项&#xff0c;最大项的反是最小项。即&#xff0c; 计算题&#xff0c;分清与或式/或与式 转换关系 卡诺图 A是高位&#xff0c;BC是低位 在卡诺图上合并最小项&#xff1a;圈要少、圈最大&#xff0…

【word密码】Word编辑权限,如何设置?

Word文档可以设置加密来保护文件禁止修改&#xff0c;但是在word文档中设置限制编辑功能时对它的作用是否有详细的了解呢&#xff1f;今天为大家介绍word限制编辑功能的作用以及忘记了限制编辑密码该如何解决。 设置限制大家应该都清楚&#xff0c;就是点击工具栏中的审阅 – …

手机录音转文字让你工作更轻松

你是否经常需要把一段重要的录音转换成文字&#xff0c;但又不想手动去打字&#xff1f;现在&#xff0c;有许多手机软件可以帮助你实现这个目标&#xff0c;但面对如此多的选择&#xff0c;你可能会感到不知所措。不要担心&#xff0c;如果你还不知道录音转文字手机软件哪个好…

日常BUG ——乱码

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 A系统使用Feign调用B系统时&#xff0c;传递的String字符串&#xff0c;到了B系统中变为了乱…

java 文件/文件夹复制,添加压缩zip

复制文件夹,并压缩成zip 需求&#xff1a;创建A文件夹&#xff0c;把B文件夹复制到A文件夹。然后把A文件夹压缩成zip包 public static void main(String[] args) throws Exception {try {String A "D:\\dev\\program";String B "D:\\program";// 创建临…

记录一下shardingsphere-jdbc查询分表使用union all的低级错误

使用shardingsphere-jdbc查询犯的低级错误&#xff0c;union all 字段没对齐&#xff0c;导致分片值有空值或数据不对&#xff0c;分片结果不对 有个数据同步的功能&#xff0c;对应的表使用到了shardingsphere-jdbc进行分表&#xff0c;所以想着是用shardingsphere-jdbc取数据…

华为Mate30报名鸿蒙 HarmonyOS 4.0.0.108 系统更新

华为 Mate 30 系列于 2019 年 11 月 1 日上市&#xff0c;包括 Mate 30 4G / 5G、Mate 30 Pro 4G / 5G、保时捷设计版 Mate30 共五款机型。华为 Mate 30 系列 5G 版搭载麒麟 990 5G 处理器&#xff0c;同时支持 SA 及 NSA 5G 双模&#xff0c;适配三大运营商的 5G / 4G / 3G / …

Vue3 :组合式写法入门

Vue3 &#xff1a;组合式写法入门 Date: May 11, 2023 Sum: 使用create-vue搭建Vue3项目、组合式API - setup、reactive和ref、computed、watch、生命周期函数、父子通信、模版引用、provide/inject 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式…