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

C++基础入门:掌握核心概念(超全!)

C++作为一门广泛使用的编程语言,以其高性能和灵活性在软件开发领域占据重要地位。无论是游戏开发、系统编程还是实时应用,C++都是一个不可或缺的工具。本博客旨在为初学者提供C++编程语言的核心概念,帮助你建立坚实的基础。

C++关键字

C++关键字是编程语言中预定义的保留词,用于执行特定的编程功能。了解这些关键字是理解C++编程的第一步。例如,intreturnvoidif等,都是执行基础操作的关键字。一个好的起点是熟悉这些关键字及其用法,这有助于你编写更有效的C++代码。

函数重载

为什么 C++ 支持函数重载,而 C 语言不支持函数重载呢?
C/C++ 中,一个程序要运行起来,需要经历以下几个阶段: 预处理、编译、汇编、链接

 

1. 实际项目通常是由多个头文件和多个源文件构成,而通过 C 语言阶段学习的编译链接,我们
可以知道,【当前 a.cpp 中调用了 b.cpp 中定义的 Add 函数时】,编译后链接前, a.o 的目标
文件中没有 Add 的函数地址,因为 Add 是在 b.cpp 中定义的,所以 Add 的地址在 b.o 中。那么
怎么办呢?
2. 所以链接阶段就是专门处理这种问题, 链接器看到 a.o 调用 Add ,但是没有 Add 的地址,就
会到 b.o 的符号表中找 Add 的地址,然后链接到一起 ( 老师要带同学们回顾一下 )
3. 那么链接时,面对 Add 函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的
函数名修饰规则。
4. 由于 Windows vs 的修饰规则过于复杂,而 Linux g++ 的修饰规则简单易懂,下面我们使
用了 g++ 演示了这个修饰后的名字。
5. 通过下面我们可以看出 gcc 的函数修饰后名字不变。而 g++ 的函数修饰后变成【 _Z+ 函数长度
+ 函数名 + 类型首字母

 

结论:linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。 

函数重载允许你使用相同的函数名进行不同的操作,前提是它们的参数列表不同。这是一种提高程序可读性和功能性的有效方式。通过函数重载,你可以根据不同的参数类型或数量来执行不同的任务。

函数重载是C++中一种允许多个同名函数共存的特性,只要这些函数的参数列表不同。这意味着重载的函数可以有不同的参数类型、数量或者两者都不同。函数重载使得函数命名更加直观,避免了为每个不同操作版本的函数起不同名字的麻烦。

函数重载的规则

为了成功实现函数重载,需要遵循以下几个规则:

  1. 不同的参数列表:重载的函数必须在参数类型、数量或者两者都不同。仅仅返回类型的不同是不足以重载函数的。
  2. 作用域:只有在相同的作用域内,函数才能被重载。
  3. 调用的明确性:任何函数调用时,编译器都必须能够明确地确定应该使用哪个函数版本,否则将报错。
示例代码

以下是函数重载的一个简单示例,展示了如何根据不同的参数类型和数量来重载函数:

#include <iostream>
using namespace std;// 打印整数
void print(int i) {cout << "Printing int: " << i << endl;
}// 打印浮点数
void print(double f) {cout << "Printing float: " << f << endl;
}// 打印字符数组
void print(const char* c) {cout << "Printing character: " << c << endl;
}int main() {print(5);    // 调用打印整数的函数print(500.263); // 调用打印浮点数的函数print("Hello C++"); // 调用打印字符数组的函数return 0;
}

在这个例子中,print函数被重载三次,每个函数接受不同类型的参数。当print函数被调用时,编译器通过传递给它的参数类型和数量来决定使用哪个版本的函数。

函数重载的好处

  • 提高代码可读性:通过函数重载,可以为执行相似功能的函数使用统一的名称,使得代码更加直观。
  • 增加程序的灵活性:能够根据不同的数据类型或参数数量执行不同的操作,从而使程序更加灵活。
  • 类型安全:与使用泛型编程相比,函数重载提供了一种类型安全的方式来处理不同类型的数据。

注意事项

  • 避免歧义:确保重载的函数之间在调用时能够被编译器明确区分,否则会导致编译错误。
  • 不要仅依赖于返回类型:由于函数调用时不考虑返回类型,因此不能仅通过返回类型来重载函数。
  • 使用默认参数时的额外注意:函数重载与默认参数同时使用时要特别小心,以避免调用时的歧义。

 

 

命名空间

命名空间是C++中用于解决名称冲突的一种机制。最常见的命名空间是std,它包含了标准库的所有功能。通过使用using namespace std;声明,你可以避免在调用标准库函数时重复使用std::前缀。理解并正确使用命名空间,对于编写组织良好的代码非常重要。

命名空间的声明和使用

命名空间通过namespace关键字声明,其基本语法如下:

namespace NamespaceName {// code declarations
}

 例如,可以创建一个名为myNamespace的命名空间,其中包含一个函数和一个变量:

namespace myNamespace {void myFunction() {std::cout << "Inside myNamespace" << std::endl;}int myVariable = 42;
}

为了使用命名空间中的成员,你需要使用作用域解析运算符::来指定成员所属的命名空间,如下所示: 

myNamespace::myFunction();
std::cout << myNamespace::myVariable << std::endl;

 

using namespace myNamespace;
myFunction(); // 直接调用,不需要前缀

使用using声明

如果你不希望每次调用命名空间中的成员时都输入完整的命名空间,可以使用using声明。这可以让你在特定范围内不必使用命名空间前缀,直接访问其中的成员。例如:

 

using namespace myNamespace;
myFunction(); // 直接调用,不需要前缀

 需要注意的是,滥用using声明可能会导致命名冲突,特别是当两个命名空间包含同名的成员时。因此,推荐仅在确信不会引发冲突的情况下使用using声明,或者只针对特定的命名空间成员使用using指令,如:

using myNamespace::myFunction;
myFunction(); // 直接调用myFunction,但其它myNamespace成员仍需前缀

命名空间的嵌套

C++允许命名空间的嵌套使用,即在一个命名空间内部定义另一个命名空间。这种结构有助于进一步组织和封装代码,例如:

 

namespace outer {int x = 10;namespace inner {void display() {std::cout << "Value: " << x << std::endl; // 访问外部命名空间的x}}
}

 在这个例子中,inner命名空间嵌套在outer命名空间内部。要访问inner命名空间中的display函数,可以使用:

outer::inner::display();

无名(匿名)命名空间

无名(或匿名)命名空间是一个特殊的命名空间,它不具有名称。在同一翻译单元(通常是一个源文件)中,无名命名空间的成员可以直接访问,就好像它们被声明在全局作用域一样,但在其他翻译单元中不可见。这提供了一种限制访问范围的方法,用于替代静态全局变量:

namespace {void privateFunction() {std::cout << "This is a private function." << std::endl;}
}
// 在同一源文件中可以直接调用
privateFunction();

 

C++输入&输出

C++使用cincout来处理标准输入输出,它们分别用于从键盘读取输入和向屏幕输出文本。掌握这些基本的I/O操作对于与用户交互的程序来说至关重要。例如,使用cout << "Hello, World!" << endl;可以在屏幕上打印一条消息。

C++标准库中的输入和输出操作主要通过iostream库实现,它包括用于输入的cin、用于输出的cout、用于处理错误输出的cerr,以及用于日志输出的clog对象。

基础的输入输出

  • 输出cout用于向标准输出设备(通常是终端或屏幕)输出数据。使用插入操作符<<cout传递数据。
  • 输入cin用于从标准输入设备(通常是键盘)读取数据。使用提取操作符>>cin接收数据。
  • 示例代码
    #include <iostream>int main() {int number;std::cout << "Enter an integer: ";std::cin >> number;std::cout << "You entered " << number << std::endl;return 0;
    }
    

    这段代码演示了如何从用户那里获取一个整数并打印出来

格式化输出

C++提供了多种方式来格式化输出,例如设置宽度、填充字符和精度等。

设置宽度和填充 

使用setw来设置下一个输出项的最小宽度,setfill来设置用于填充额外空间的字符。

 

#include <iostream>
#include <iomanip> // For setw and setfillint main() {std::cout << std::setw(10) << std::setfill('*') << 123 << std::endl;return 0;
}

输出:*******123

设置精度

使用setprecision来设置浮点数的输出精度。

 

#include <iostream>
#include <iomanip> // For setprecisionint main() {double pi = 3.14159;std::cout << std::setprecision(4) << pi << std::endl;return 0;
}

 输出:3.142

处理文件输入输出

C++使用fstream库中的ifstream(输入文件流)和ofstream(输出文件流)来处理文件输入输出。

文件写入示例
#include <fstream>
#include <iostream>int main() {std::ofstream file("example.txt");if (file.is_open()) {file << "Hello, file IO!" << std::endl;file.close();} else {std::cout << "Unable to open file";}return 0;
}

 文件读取示例

#include <fstream>
#include <iostream>
#include <string>int main() {std::ifstream file("example.txt");std::string line;if (file.is_open()) {while (getline(file, line)) {std::cout << line << '\n';}file.close();} else {std::cout << "Unable to open file";}return 0;
}

这些例子展示了如何写入和读取文件。在处理文件时,总是检查文件是否成功打开,以及在操作完成后关闭文件是一个好习惯。 

缺省参数

缺省参数允许你在函数声明时指定默认值。这意味着在调用函数时,如果没有提供足够的参数,C++会自动使用这些默认值。这使得函数调用更加灵活,同时减少了代码的冗余。

缺省参数(也称为默认参数)是C++函数定义中的一项特性,它允许函数调用时省略某些参数。如果调用函数时没有提供足够的实参,C++编译器会自动使用定义函数时指定的默认值来填充缺失的参数。这一特性可以使函数调用更加灵活,减少重载函数的需要,同时也让代码更简洁。

使用缺省参数的规则和示例

缺省参数的设置非常简单,只需在函数声明或定义时,为参数指定一个默认值即可。但是,有几个规则需要遵守:

  1. 缺省参数从右向左:如果函数的某个参数有默认值,那么它右边的所有参数也必须有默认值。
  2. 声明与定义:如果函数在头文件中声明,在源文件中定义,那么缺省参数应该在声明时给出,而在定义时则不应重复。
  3. 调用时省略参数:调用函数时,可以省略具有默认值的参数,但是必须从最右边的参数开始省略。
示例代码

考虑以下函数,它用于显示一条消息,并可以指定消息前的空格数和是否换行。

#include <iostream>
using namespace std;void displayMessage(string message, int indent = 0, bool newline = true) {for (int i = 0; i < indent; ++i) {cout << " ";}cout << message;if (newline) cout << endl;
}int main() {displayMessage("Hello, World!"); // 使用默认参数displayMessage("Hello, C++!", 5); // 指定缩进,使用默认的换行参数displayMessage("Welcome to programming!", 0, false); // 指定所有参数return 0;
}

在这个例子中,displayMessage函数有两个缺省参数:indentnewline。这使得函数调用非常灵活,你可以只提供必要的参数。

缺省参数的好处与限制

好处

  • 减少函数重载数量:通过为参数提供默认值,可以减少需要编写的函数重载数量,使代码更加简洁。
  • 提高函数调用的灵活性:函数调用者可以根据需要提供不同数量的参数。

限制

  • 可能影响代码清晰度:使用缺省参数时,函数的调用可能不那么直观,尤其是当函数有多个参数时,理解每个参数的默认值可能需要查看函数定义。
  • 与函数重载的潜在冲突:如果函数重载与缺省参数结合使用不当,可能会导致调用模糊不清,编译器可能无法确定调用哪个函数版本。

最佳实践

  • 当函数的某些参数大多数情况下都是相同的值时,考虑使用缺省参数。
  • 在设计接口时,仔细考虑哪些参数是真正需要由调用者指定的,哪些可以有合理的默认值。
  • 保持缺省参数的简单性,避免使用复杂的表达式作为默认值。
  • 明确文档化每个参数的默认值,确保函数的使用者能够清楚地理解每个参数的作用和默认行为。

缺省参数是C++提供的一个强大工具,它在简化函数调用和减少代码重复方面非常有用。合理使用缺省参数可以使你的C++代码更加简洁和灵活,但同时也需要注意避免上述提到的潜在陷阱。

 

引用

在C++中,引用是一种复合类型,它允许你创建一个别名,即对另一个变量的引用。引用在传递大型数据结构给函数或返回函数结果时特别有用,因为它们可以避免数据的复制,从而提高效率。

引用在C++中是一个非常强大的特性,它为变量创建了一个别名。通过使用引用,可以创建一个新的名字来代表某个已存在的变量。引用主要用于函数参数传递和返回值,它们使得函数能够直接操作实参,而不是操作其副本。这不仅提高了效率,因为避免了不必要的对象复制,还允许函数修改传递给它的参数。

引用的基本概念

  • 声明引用:声明引用时,需要在类型后面加上&符号和引用的名称。例如,int& ref = x;声明了一个对整数x的引用。
  • 初始化引用:引用必须在声明时被初始化,并且一旦被初始化后,就不能改变引用的目标。这意味着引用一旦绑定到一个变量上,就会一直代表那个变量,不能被重新赋值为其他变量的引用。
  • 引用与指针:引用在某种意义上类似于指针,但是它们更安全、更易于使用。引用总是指向一个有效的内存地址,而且不需要使用解引用操作符*来访问目标变量。

使用引用的场景

  1. 函数参数传递:通过将函数参数声明为引用类型,可以允许函数内部的操作影响到实参。这对于数据结构如字符串和大型对象尤其有用,因为它避免了复制的开销。
  2. 函数返回值:函数可以返回一个引用,这样可以允许函数调用作为左值使用。但是要小心不要返回局部变量的引用,因为局部变量在函数返回后会被销毁。
  3. 范围for循环:在基于范围的for循环中使用引用,可以直接修改容器中的元素。
示例代码
引用作为函数参数
#include <iostream>
using namespace std;void swap(int& a, int& b) {int temp = a;a = b;b = temp;
}int main() {int x = 10, y = 20;swap(x, y);cout << "x: " << x << " y: " << y << endl; // 输出:x: 20 y: 10return 0;
}

 返回引用

#include <vector>
#include <iostream>
using namespace std;int& getElement(vector<int>& v, int index) {return v[index];
}int main() {vector<int> vec = {1, 2, 3};getElement(vec, 1) = 4; // 修改vec中索引为1的元素cout << vec[1] << endl; // 输出:4return 0;
}

注意事项

  • 避免返回局部变量的引用。
  • 使用引用时,确保引用的对象在引用的生命周期内是有效的。
  • 引用一旦被初始化后,就不能再绑定到另一个对象上。

 

【面试题】

宏的优缺点?
优点:
1. 增强代码的复用性。
2. 提高性能。
缺点:
1. 不方便调试宏。(因为预编译阶段进行了替换)
2. 导致代码可读性差,可维护性差,容易误用。
3. 没有类型安全的检查 。
C++ 有哪些技术替代宏
1. 常量定义 换用 const enum
2. 短小函数定义 换用内联函数

内联函数

内联函数是一种优化技术,它通过在编译时将函数体插入到每个调用点,来减少函数调用的开销。对于小而频繁调用的函数,使用内联函数可以提高程序的执行速度。

内联函数是C++提供的一种特性,旨在减少函数调用时的开销。当函数被声明为内联时,编译器会尝试将函数调用处替换为函数本身的代码。这意味着在每个调用点,编译器会将整个函数体插入,从而避免了函数调用的成本,如参数传递、控制权转移和返回值处理等。内联函数特别适用于代码体积小、调用频繁的函数。

使用内联函数的优势

  1. 性能提升:避免了函数调用的开销,对于小型函数,尤其是在循环中频繁调用的情况下,可以显著提高程序的执行速度。
  2. 代码优化:编译器可以对内联函数进行更多优化,因为函数体直接嵌入到调用处,编译器有更大的自由度来优化这些代码,比如消除临时变量、合并计算等。

如何声明内联函数

内联函数通过在函数声明前加上inline关键字来指定。例如:

inline int max(int a, int b) {return a > b ? a : b;
}

注意事项和限制

  • 编译器的自由度:声明一个函数为内联并不意味着编译器一定会内联该函数。编译器会根据函数的复杂性、调用的上下文以及特定的编译器优化设置来决定是否内联。
  • 代码膨胀:过度使用内联函数可能导致二进制文件体积的增加,因为每个调用点都会插入完整的函数体。这可能导致缓存命中率降低,反而降低程序的整体性能。
  • 适用场景:一般而言,只有当函数体较小(如只有几行代码)、调用频繁且执行时间短于函数调用开销时,将函数声明为内联才是有意义的。
  • 递归函数:递归函数通常不适合声明为内联,因为递归调用自身会导致大量的代码膨胀。
  • 虚函数:虚函数也可以被声明为内联,但内联是在编译时决定的,而虚函数的动态绑定则是在运行时进行的。如果虚函数在编译时可以确定调用哪个函数,则它可以被内联;否则,即使声明为内联,也只能按照普通虚函数调用来处理。

示例:内联函数与普通函数的比较

假设有一个计算平方的简单函数:

// 普通函数
int square(int x) {return x * x;
}// 内联函数
inline int squareInline(int x) {return x * x;
}

 在编译时,对squareInline的每个调用都有可能被替换为x * x,而对square的调用则保留为函数调用。这种差异在循环或频繁调用的情况下可能会导致显著的性能差异。

auto关键字

C++11引入的auto关键字允许自动类型推导,使得编码更加简洁。使用auto可以避免复杂类型的显式声明,让编译器自动为变量推断出最合适的类型。

auto关键字在C++11及其后续版本中引入,标志着类型推导的一个重要步骤。它允许编译器自动推导变量的类型,基于变量初始化时赋予的表达式。这不仅可以简化代码,减少编写的类型声明,还能增强代码的可读性和可维护性,特别是在处理复杂类型(如STL容器的迭代器)时。

auto关键字的优点

  1. 简化类型声明:当变量类型显而易见时,使用auto可以避免冗长的类型名称,使代码更加简洁。
  2. 提高可维护性:如果表达式类型更改,auto可以自动更新变量类型,减少必须手动更改的地方。
  3. 增强代码的通用性:使用auto可以编写与类型无关的代码,特别是在模板编程和使用lambda表达式时更加明显。

使用auto的场景

  • 局部变量初始化:最常用于局部变量的初始化,特别是当右侧表达式的类型复杂或难以直接表达时。

    auto x = 5; // x 被推导为 int
    auto pi = 3.14159; // pi 被推导为 double
    

    迭代器和Lambda表达式:在使用STL容器时,迭代器类型经常使用auto来简化

    std::vector<int> vec = {1, 2, 3, 4};
    auto it = vec.begin(); // 自动推导为 std::vector<int>::iterator
    

    范围基于的循环:在C++11中引入的范围基于的循环中使用auto,可以使代码更加清晰

    for (auto& value : vec) {std::cout << value << std::endl;
    }
    

    函数返回类型推导:C++14扩展了auto的使用,允许用于函数返回类型的推导。

    auto sum(int x, int y) -> int {return x + y;
    }
    

    注意事项

  • 初始化必须:使用auto声明的变量必须在声明时初始化,因为编译器需要初始化表达式来推导类型。

  • 顶层const和引用auto会忽略掉初始化表达式的顶层const,但底层const会被保留。如果需要顶层const或引用,需要显式指定。

    const auto x = 5; // x 是一个 const int
    auto& y = x; // y 是对 const int 的引用
    

    不可用于函数参数auto不能用作函数参数类型,这种情况下仍需明确指定参数类型或使用模板。

基于范围的for循环

基于范围的for循环是C++11标准引入的一项特性,它提供了一种更简洁、更安全的方式来遍历容器(如数组、向量等)或任何序列范围。这种循环方式自动迭代容器或范围的所有元素,无需手动管理迭代器或索引,从而减少了编码错误的可能性并提高了代码的可读性。

基本语法

基于范围的for循环的基本语法如下:

for (declaration : range) {// loop body
}

 

其中,declaration声明了一个变量,该变量将被用来访问序列中的每个元素。range是要迭代的序列或容器。

示例

假设有一个整数数组,要遍历数组中的每个元素:

int arr[] = {1, 2, 3, 4, 5};
for (int elem : arr) {std::cout << elem << std::endl;
}

使用auto

在基于范围的for循环中,可以使用auto关键字来自动推导元素的类型,这样做可以简化代码并提高其适应性

for (auto elem : vec) {std::cout << elem << std::endl;
}

 

修改容器元素

如果想要在循环中修改容器中的元素,需要在循环变量声明中使用引用(&):

for (auto& elem : vec) {elem *= 2; // Doubles the value of each element in the vector
}

 

避免不必要的复制

对于包含大型对象的容器,为了避免在每次迭代时复制对象,应该使用引用来遍历元素,特别是当不需要修改元素时,应使用常量引用:

for (const auto& elem : vec) {std::cout << elem << std::endl;
}

优点和局限

  • 优点

    • 简化了遍历容器和序列的语法。
    • 减少了与迭代器和索引管理相关的错误。
    • 自动推导元素类型,使代码更简洁。
  • 局限

    • 不适用于需要访问当前迭代元素索引的场景。
    • 当需要在循环中删除或插入元素时,可能不是最佳选择,因为这可能需要直接访问容器的迭代器。

 

结语

C++是一门功能强大的编程语言,拥有广泛的应用领域。通过掌握上述核心概念,你已经迈出了成为C++程序员的第一步。记住,学习编程是一个逐步探索和不断实践的过程。不断练习,寻找资源,并尝试自己编写代码,你将会发现C++的强大之处。祝你旅途愉快!

相关文章:

C++基础入门:掌握核心概念(超全!)

C作为一门广泛使用的编程语言&#xff0c;以其高性能和灵活性在软件开发领域占据重要地位。无论是游戏开发、系统编程还是实时应用&#xff0c;C都是一个不可或缺的工具。本博客旨在为初学者提供C编程语言的核心概念&#xff0c;帮助你建立坚实的基础。 C关键字 C关键字是编程…...

Linux第47步_安装支持linux的第三方库和mkimage工具

安装支持linux的第三方库和mkimage工具&#xff0c;做好移植前的准备工作。 编译linux内核之前&#xff0c;需要先在 ubuntu上安装“lzop库”和“libssl-dev库”&#xff0c;否则内核编译会失败。 mkimage工具会在zImage镜像文件的前面添加0x40个字节的头部信息,就可以得到uI…...

数据工程工程师学习路线图

数据工程岗位要求 Skill Sets required: - Hands on experience enabling data via Adobe Analytics and/or Google Analytics - Understanding of how customer level data is captured and stitched with behavioural data - Experience working with Testing (QA) and D…...

MySQL主从同步与分库分表

分库分表...

百度PaddleOCR字符识别推理部署(C++)

1 环境 1.opencv&#xff08;https://sourceforge.net/projects/opencvlibrary/&#xff09; 2.cmake&#xff08;https://cmake.org/download/&#xff09; 3.vs2019&#xff08;(https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.1) 4.paddleOCR项目-建议2.0(http…...

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示

对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化&#xff0c;增加一个显示运动员每组成绩的折线图。 1&#xff09;在Qt Creator的项目文件&#xff08;.pro文件&#xff09;中添加对Qt Charts模块的支持&#xff1a; QT charts 2&#xf…...

Microsoft Excel 加载数据分析工具

Microsoft Excel 加载数据分析工具 1. 打开 Excel&#xff0c;文件 -> 选项2. 加载项 -> 转到…3. 分析工具库、分析工具库 - VBA4. 打开 Excel&#xff0c;数据 -> 数据分析References 1. 打开 Excel&#xff0c;文件 -> 选项 2. 加载项 -> 转到… ​​​ 3…...

Day32 贪心算法part02

买卖股票的最佳时机 太牛了我&#xff0c;随随便便双指针秒杀 md题解里面双指针都没用直接for循环秒杀 跳跃游戏 写成这样纯粹是没有看到第一次跳跃必须从第一个开始 class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) 1:return Truefor i in …...

3分钟带你了解Vue3的nextTick()

前言 Vue 实现响应式并不是数据发生变化之后 DOM 立即变化&#xff0c;而是按一定的策略进行 DOM 的更新。简单来说&#xff0c;Vue在修改数据后&#xff0c;视图不会立刻更新&#xff0c;而是等同一事件循环中的所有数据变化完成之后&#xff0c;再统一进行视图更新&#xff…...

数据库的使用方法

sqlite3 API&#xff1a; 头文件&#xff1a; #include <sqlite3.h> 编译时候要加上-lsqlite3 gcc a.c -lsqlite3 1&#xff09;sqlite3_open int sqlite3_open(const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db …...

HTML5和CSS3强化知识总结

HTML5的新特性 HTML5的新增特性主要是针对于以前的不足&#xff0c;增一些新的标签、新的表单和新的表单属性等。这些新特性都有兼容性问题&#xff0c;基本是IE9以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这些新特性。 HTML5新增的语义…...

华为机考入门python3--(13)牛客13-句子逆序

分类&#xff1a;列表 知识点&#xff1a; 列表逆序&#xff08;和字符串逆序是一样的&#xff09; my_list[::-1] 题目来自【牛客】 def reverse_sentence(sentence): # 将输入的句子分割words sentence.split() # 将单词逆序排列 words words[::-1] # 将单词用空…...

javaScript实现客户端直连AWS S3(亚马逊云)文件上传、断点续传、断网重传

写在前面&#xff1a;在做这个调研时我遇到的需求是前端直接对接亚马逊平台实现文件上传功能。上传视频文件通常十几个G、客户工作环境网络较差KB/s&#xff0c;且保证上传是稳定的&#xff0c;支持网络异常断点重试、文件断开支持二次拖入自动重传等。综合考虑使用的Aws S3的分…...

从基建发力,CESS 如何推动 RWA 发展?

2023 年 11 月 30 日&#xff0c;Web3 基金会&#xff08;Web3 Foundation&#xff09;宣布通过 Centrifuge 将部分资金投资于 RWA&#xff08;Real World Assets&#xff0c;真实世界资产&#xff09;&#xff0c;试点投资为 100 万美元。Web3 基金会旨在通过支持专注于隐私、…...

qml写一个自适应登录框

1、前言 写一个可自由伸缩的登录框&#xff0c;&#xff0c;&#xff08;横向上&#xff09; 关键&#xff1a;给相关控件赋予 Layout.fillWidth: true 属性 即可。 2、代码 //main.qml import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQml 2.12 import QtQuic…...

考研高数(导数的定义)

总结&#xff1a; 导数的本质就是极限。 函数在某点可导就必连续&#xff0c;连续就有极限且等于该点的函数值。 例题1&#xff1a;&#xff08;归结原则的条件是函数可导&#xff09; 例题2&#xff1a; 例题3&#xff1a;...

ChatGPT在国际中文教育领域引起的变革与挑战

随着ChatGPT这一先进的自然语言处理模型的出现&#xff0c;教学、学习、测评和辅导的传统方式正在面临可能的重塑。她是否会影响中文教育的未来方向&#xff0c;甚至取代中文教师的角色&#xff0c;成为了许多人热议的话题。本文旨在探讨ChatGPT与中文测评之间的联系&#xff0…...

C语言—基础数据类型(含进制转换)

进制转换不多&#xff0c;但我觉得适合小白(我爱夸自己嘿嘿) 练习 1. 确认基础类型所占用的内存空间(提示&#xff1a;使用sizeof 运算符)&#xff1a; 在这里我说一下&#xff0c;long 类型通常占用 4 字节。在 64 位系统上&#xff0c;long 类型通常也可为 8 字节。 格式…...

警钟长鸣-合同问题

由于去年入职了某家公司&#xff0c;本来想着临时过渡一下&#xff0c;虽然签的时候发现合同和竞业协议存在很明显的问题或者说好听点“限制比较严&#xff1f;”&#xff0c;大部分互联网公司都成了它的假想敌&#xff0c;但是本着来都来了的想法就签了&#xff0c;于是导致发…...

CAN通讯协议学习

介绍 它是一种异步通讯&#xff0c;can_high和can_low两条线利用的是电位差传输信号&#xff0c;抗干扰能力强&#xff0c;但是必须要有can控制器如TJA1050&#xff08;我的开发板&#xff09; 当 CAN 节点需要发送数据时&#xff0c;控制器把要发送的二进制编码通过 CAN_Tx 线…...

Spring Boot 笔记 008 创建接口_获取用户信息

1.1.1 编写userinfo接口 1.1.2 User实体类中增加转json忽略password注释 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data;import java.time.LocalDateTime;//lombok 在…...

EMC学习笔记(二十六)降低EMI的PCB设计指南(六)

降低EMI的PCB设计指南&#xff08;六&#xff09; 1.PCB布局1.1 带键盘和显示器的前置面板PCB在汽车和消费类应用中的应用1.2 敏感元器件的布局1.3 自动布线器 2.屏蔽2.1 工作原理2.2 屏蔽接地2.3 电缆屏蔽至旁路2.4 缝隙天线&#xff1a;冷却槽和缝隙 tips&#xff1a;资料主要…...

pytorch花式索引提取topk的张量

文章目录 pytorch花式索引提取topk的张量问题设定代码实现索引方法gather方法验证 补充知识expand方法gather方法randint pytorch花式索引提取topk的张量 问题设定 或者说&#xff0c;有一个(bs, dim, L)的大张量&#xff0c;索引的index形状为(bs, X)&#xff0c;想得到一个(…...

Swagger2

Swagger2 引入依赖 <!-- springfox-swagger2 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.10.5</version></dependency>编写配置 @Configuration public …...

2024/2/13

数组练习 1、选择题 1.1、若有定义语句&#xff1a;int a[3][6]; &#xff0c;按在内存中的存放顺序&#xff0c;a 数组的第10个元素是 D A&#xff09;a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 1.2、有数组 int a[5] {10&#xff0c;20&#xff0c;30&#xff0c;40&…...

【工具】Android|Android Studio 长颈鹿版本安装下载使用详解

版本&#xff1a;2022.3.1.22&#xff0c; https://redirector.gvt1.com/edgedl/android/studio/install/2022.3.1.22/android-studio-2022.3.1.22-windows.exe 前言 笔者曾多次安装并卸载Android Studio&#xff0c;反复被安卓模拟器劝退。现在差不多是第三次安装&#xff0c…...

第三代互联网web3.0

Web3.0&#xff0c;通常被称为第三代互联网&#xff0c;代表了互联网技术的下一个演进阶段。它主要基于区块链、去中心化和用户赋权的理念构建&#xff0c;旨在创造一个更加智能、开放且安全的网络环境。以下是Web3.0的一些关键特点&#xff1a; 1. **去中心化**&#xff1a;We…...

FL Studio版本升级-FL Studio怎么升级-FL Studio升级方案

已经是新年2024年了&#xff0c;但是但是依然有很多朋友还在用FL Studio12又或者FL Studio20&#xff0c;今天这篇文章教大家如何升级FL Studio21 FL Studio 21是Image Line公司开发的音乐编曲软件&#xff0c;除了软件以外&#xff0c;我们还提供了FL Studio的升级服务&#…...

服务降级(Sentinel)

服务降级 采用 SentinelResource 注解方式实现&#xff0c; 必要的 依赖必须引入 以及 切面Bean 接口代码 RequestMapping("/degrade")SentinelResource(value DEGRADE_RESOURCE_NAME, blockHandler "blockHandlerForDegrade",entryType EntryType.IN…...

Rust入门问题: use of undeclared crate or module `rand`

按照官网学rust&#xff0c;程序地址在这里&#xff0c; 写个猜数字游戏 - Rust 程序设计语言 简体中文版 程序内容也很简单&#xff0c; use std::io; use rand::Rng;fn main() {println!("Guess the number!");let secret_number rand::thread_rng().gen_range…...

2024.2.6 模拟实现 RabbitMQ —— 数据库操作

目录 引言 选择数据库 环境配置 设计数据库表 实现流程 封装数据库操作 针对 DataBaseManager 单元测试 引言 硬盘保存分为两个部分 数据库&#xff1a;交换机&#xff08;Exchange&#xff09;、队列&#xff08;Queue&#xff09;、绑定&#xff08;Binding&#xff0…...

dolphinscheduler海豚调度(一)简介快速体验

1、简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系&#xff0c;并为应…...

VTK 三维场景的基本要素(相机) vtkCamera

观众的眼睛好比三维渲染场景中的相机&#xff0c;在VTK中用vtkCamera类来表示。vtkCamera负责把三维场景投影到二维平面&#xff0c;如屏幕&#xff0c;相机投影示意图如下图所示。 1.与相机投影相关的要素主要有如下几个&#xff1a; 1&#xff09;相机位置: 相机所处的位置…...

小游戏和GUI编程(5) | SVG图像格式简介

小游戏和GUI编程(5) | SVG图像格式简介 0. 问题 Q1: SVG 是什么的缩写&#xff1f;Q2: SVG 是一种图像格式吗&#xff1f;Q3: SVG 相对于其他图像格式的优点和缺点是什么&#xff1f;Q4: 哪些工具可以查看 SVG 图像&#xff1f;Q5: SVG 图像格式的规范是怎样的&#xff1f;Q6…...

多机多卡运行nccl-tests和channel获取

nccl-tests 环境1. 安装nccl2. 安装openmpi3. 单机测试4. 多机测试mpirun多机多进程多节点运行nccl-testschannel获取 环境 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)cuda 11.8 cudnn 8nccl 2.15.1NVIDIA GeForce RTX 4090 *2 1. 安装nccl #查看cuda版本 nv…...

SQL,HQL刷题,尚硅谷

相关表数据&#xff1a; 1、score_info 2、student_info 题目及思路解析&#xff1a; 分组结果的条件 1、查询平均成绩大于60分的学生的学号和平均成绩 代码&#xff1a; selectstu_id,avg(score) score_avg from score_info group by stu_id having score_avg>60; 思路…...

DevOps:CI、CD、CB、CT、CD

目录 一、软件开发流程演化快速回顾 &#xff08;一&#xff09;瀑布模型 &#xff08;二&#xff09;原型模型 &#xff08;三&#xff09;螺旋模型 &#xff08;四&#xff09;增量模型 &#xff08;五&#xff09;敏捷开发 &#xff08;六&#xff09;DevOps 二、走…...

[leetcode经典算法题]删除有序数组中的重复项(双指针)

删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素…...

【国产MCU】-CH32V307-触摸按键检测(TKEY)

触摸按键检测(TKEY) 文章目录 触摸按键检测(TKEY)1、TKEY介绍2、TKEY使用实例触摸检测控制(TKEY)单元,借助ADC 模块的电压转换功能,通过将电容量转换为电压量进行采样,实现触摸按键检测功能。检测通道复用ADC 的16 个外部通道,通过ADC 模块的单次转换模式实现触摸按键…...

Hive的小文件问题

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…...

攻防世界——re2-cpp-is-awesome

64位 我先用虚拟机跑了一下这个程序&#xff0c;结果输出一串字符串flag ——没用 IDA打开后 F5也没有什么可看的 那我们就F12查看字符串找可疑信息 这里一下就看见了 __int64 __fastcall main(int a1, char **a2, char **a3) {char *v3; // rbx__int64 v4; // rax__int64 v…...

问山海——天涯海角——桃花渊boss攻击顺序

文章目录 桃花渊代码代码解读代码执行结果攻击顺序示意图 桃花渊 规划击杀各个boss顺序。 副本持续时间为30分钟&#xff0c;每个地方的boss被打死后&#xff0c;需要一定时间才能重新刷新。 只考虑其中两种boss&#xff0c;龟将和龟龙。各有四个。 其中我从一个boss地点到…...

springboot181基于springboot的乐享田园系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…...

Dubbo集成Zookeeper embbed模式

为了简化应用支持服务方便的分合&#xff0c;使用Zookeeper embbed模式。集成Zookeeper比较容易&#xff0c;使用starter或自己写代码都可以。但是由于集成了Dubbo&#xff0c;每次启动时都会发现zookeeper没有启动就开始报错退出&#xff0c;但是确是已经集成了。 于是只能翻…...

156基于Matlab的光纤陀螺随机噪声和信号

基于Matlab的光纤陀螺随机噪声和信号&#xff0c;利用固定步长和可调步长的LMS自适应滤波、最小二乘法、滑动均值三种方法进行降噪处理&#xff0c;最后用阿兰方差评价降噪效果。程序已调通&#xff0c;可直接运行。 156 信号处理 自适应滤波 降噪效果评估 (xiaohongshu.com)...

秋招上岸大厂,分享一下经验

文章目录 秋招过程学习过程项目经验简历经验面试经验offer选择总结 秋招过程 今天是除夕&#xff0c;秋招已经正式结束了&#xff0c;等春节过完就到了春招的时间点了。 运气比较好&#xff0c;能在秋招的末尾进入一家大厂&#xff0c;拿到20k的sp offer。 从九月份十月份就开…...

使用 C++23 从零实现 RISC-V 模拟器

&#x1f449;&#x1f3fb; 文章汇总「从零实现模拟器、操作系统、数据库、编译器…」&#xff1a;https://okaitserrj.feishu.cn/docx/R4tCdkEbsoFGnuxbho4cgW2Yntc 使用 C23 从零实现 RISC-V 模拟器 使用 C23 从零实现的 RISC-V 模拟器&#xff0c;最终的模拟器可以运行 x…...

Hugging Face 刚刚推出了一款开源的 AI 助手制造工具,直接向 OpenAI 的定制 GPT 挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

powershell 雅地关闭UDP监听器

在PowerShell中优雅地关闭UDP监听器意味着你需要一种机制来安全地停止正在运行的UdpClient实例。由于UdpClient类本身没有提供直接的停止或关闭方法&#xff0c;你需要通过其他方式来实现这一点。通常&#xff0c;这涉及到在监听循环中添加一个检查点&#xff0c;以便在接收到停…...

Google Cloud 2024 年报告重点介绍了关键的网络威胁和防御

Google Cloud 的 2024 年威胁范围报告预测了云安全的主要风险&#xff0c;并提出了加强防御的策略。 该报告由 Google 安全专家撰写&#xff0c;为寻求预测和应对不断变化的网络安全威胁的云客户提供了宝贵的资源。 该报告强调&#xff0c;凭证滥用、加密货币挖矿、勒索软件和…...