C++初阶------------------入门C++

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


C++入门引入

  • **作者前言**
  • 命名空间(namespace)
      • ::
    • 命名空间里面嵌套命名空间
    • 命名空间的合并
  • 第一个c++代码
  • 缺省参数
  • 函数重载
    • 为啥c++支持函数重载,而C语言不行
  • 引用
    • 引用的好处
      • 传参
      • 返回值
      • 常引用
    • 指针和引用的区别
    • 内联函数
    • auto
    • 范围的for循环
    • 指针空值nullptr

命名空间(namespace)

在我们学习C语言的过程中,如果我们命名一些和库函数名字相同的变量或者函数,VS编译器就会报错,怎么解决这个问题呢?C++语言就推出了一个关键字
namespace
这个关键字的作用就是解决命名冲突的
未使用关键字:

#include<stdio.h>
#include<stdlib.h>
int rand = 0;
int main()
{
	printf("%d", rand);

	return 0;
}

在这里插入图片描述
是会报错的,因为命名和库函数rand冲突了,我们在后面写的代码越多,就越容易命名冲突,
使用关键字:

#include<stdio.h>
#include<stdlib.h>
namespace ncon
{
	int rand = 0;
}
int main()
{
	printf("%d", ncon::rand);

	return 0;
}

在这里插入图片描述

::

这个符号叫域作用限定符
就是告诉VS编译器rand这个变量要在ncon命名的空间里面找,否则是找不到这个rand的
在命名空间里面可以定义函数、结构体、变量、枚举…等,

#include<stdio.h>
#include<stdlib.h>
namespace ncon
{
	int rand = 0;
	int Add(int a, int b)
	{
		return a + b;
	}
	typedef struct numnam
	{
		int a;
		int b;
	}numname;
}
int main()
{
	printf("%d ", ncon::rand);
	int count = ncon::Add(1, 2);
	printf("%d ", count);
	struct ncon::numnam num = { 10,20 };
	printf("%d %d", num.a, num.b);
	return 0;
}

注意一下,结构体的写法是struct关键字在 最前面

命名空间里面嵌套命名空间

#include<stdio.h>
#include<stdlib.h>
namespace ncon
{
	namespace con
	{
		int nums = 10;
	}
}
int main()
{
	printf("%d ",ncon::con::nums);
	return 0;
}

命名空间可以嵌套命名空间,无限套娃

命名空间的合并

我们在一个源文件中可以多个位置命名空间相同的名字,是不会冲突的,会合并成一个命名空间
头文件:

#include<stdio.h>
#include<stdlib.h>
namespace ncon
{
	typedef struct numnam
	{
		int a;
		int b;
	}numname;
}

目标文件.c

#include"day1_1.h"
using namespace ncon;
namespace ncon
{
	int Add(int a, int b)
	{
		return a + b;
	}
}
int main()
{

	int count = Add(1, 2);
	printf("%d ", count);
	struct ncon::numnam num = { 10,20 };
	printf("%d %d ", num.a, num.b);

	return 0;
}

有人就会发现下面这句代码

using namespace ncon;

这句代码想表达的意思就是
这行代码是C++中的语法,意思是引入命名空间 ncon 中的所有内容,使得在代码中可以直接使用该命名空间中的成员而不需要加上前缀
注意:这种方式不提倡,特别是在项目里会造成不必要的麻烦,所以日常练习可以展开
std:是C++官方库定义的命名空间
但是有时候真的很麻烦,会写很多不必要的前缀
所以我们可以指定展开

using std::cout;
using std::endl;

第一个c++代码

#include<iostream>
int main()
{
	std::cout << "hello world";
	printf("hello world");
	return 0;
}

<< : 流插入

如果要写入一些标识符,如\n

#include<iostream>
int main()
{
	std::cout << "hello world\n" << "hello " << "11111 " << "\n";
	printf("hello world");
	return 0;
}

可以写多个 << 进行拼接
但是一般不会这样写,会写成是std::endl

#include<iostream>
int main()
{
	std::cout << "hello world"  << std::endl << "hello " << "11111 " << std::endl;
	printf("hello world");
	return 0;
}

​<< :流提取

#include<iostream>
using std::cout;
using std::endl;
using std::cin;

int main()
{
	int a = 10;
	int b = 20;
	cin >> a >> b;
	cout << a << endl << b;
	return 0;
}

在这里插入图片描述
std:: cin :输入
std::cout : 输出

缺省参数

我们知道在C语言中,函数的有参数就必须传参,不传参就会报错,为了解决这个问题,c++就有了可以拥有默认参数的函数

#include<iostream>
using std::cout;
using std::endl;
using std::cin;
namespace ncon
{
	void Func(int a = 10)
	{
		cout << a << endl;
	}
	void Func1(int a = 10, int b = 20, int c = 100)
	{
		cout << a << endl;
		cout << b << endl;
		cout << c << endl;
	}
}
using namespace ncon;
int main()
{
	ncon::Func();
	ncon::Func(30);
	Func1();
	Func1(100);
	Func1(1,1,1);

	return 0;

需要注意的是缺省值只能从右往左给,必须是连续给
还有一些是半缺省的函数

void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

半缺省参数必须从右往左依次来给出,不能间隔着给

声明和定义不能同时给参数,只能在声明的时候给。这个是一个默认规定
在头文件中
在这里插入图片描述

缺省值必须是常量或者全局变量

函数重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。

#include<iostream>
using std::cout;
using std::endl;
using std::cin;
//参数类型不同
int Add(int a, int b)
{
	return a + b;
}
double Add(double a, double b)
{
	return a + b;
}
//参数个数不同
void Fun()
{
	cout << "Fun()" << endl;
}
void Fun(int a)
{
	cout << "Fun(int a)" << endl;
}
// 参数的顺序不同
void f(int a, double b)
{
	cout << a << endl;
	cout << b << endl;
}
void f(double b,int a)
{
	cout << a << endl;
	cout << b << endl;
}
int main()
{
	Add(1, 2);
	Add(1.1, 2.2);
	Fun();
	Fun(6);
	f(1, 2.2);
	f(2.2, 6);


	return 0;
}

参数类型不同
参数个数不同
参数的顺序不同

为啥c++支持函数重载,而C语言不行

我们前面学习过C语言的编译链接,
第一步是预处理 :主要进行头文件的展开、宏替换、条件编译(#define 、 #if #endif)以及去掉注释等
生成.i文件
第二步编译:生成汇编代码(主要)或者语法错误
在这里插入图片描述
生成.s文件

第三步 汇编:转换成二进制的机器码
生成.o文件(Linux环境下) (在windows是obj文件)

第四步 链接: 合并到一起,链接一些没有确定函数地址、符号表的合并和重定义

C语言不能函数重载的原因:,因为C语言在链接的时候就是使用函数名去找(C语言不存在同名函数),而c++不能使用函数名去找

objdump -S test1c#test1c是一个.out文件

在Linux中C语言函数的调用是通过函数名去找对应的函数找到对应的地址
在这里插入图片描述
而在c++ 中

g++ test1.c -o test1cpp

objdump -S test1cpp

在这里插入图片描述
为啥这里的会这么奇怪,这个函数调用的名字 是由Linux的函数名修饰规则决定的,
_Z3Adddd
写法为:
_Z + 函数名的字符个数 + 函数名 + 每个参数的第一个字符(int a 就取i)

通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修
饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间。

#include<iostream>
using std::cout;
using std::endl;
using std::cin;
int main()
{
	int a = 0;
	int b = a;
	int& c = a;
	c = 2;
	return 0;
}

int& c = a;//引用a

int& :引用类型

引用我们可以看作是取别名,改变c或者改变a 都会改变值,而b是一个变量,存储a的值,改变a或者b都不会改变对方
在这里插入图片描述

在这里插入图片描述

引用的好处

传参

前面我们学习过C语言如果要改变变量的值,要传地址
C语言版:

int exchang(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

c++版:

int exchang(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
	return left;
}

引用的注意:

  1. 引用的时候必须初始化
  2. 引用的指向是唯一的,指定了就不能更改,所以说引用和指针是不能相互取代的
  3. 一个对象可以有多个引用,但是一个引用不能拥有多个对象
  4. 引用参数比直接传参的效率要高,引用参数和传地址参数的效率相似
    以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直
    接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效
    率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。
#include<iostream>
#include<time.h>
using std::cout;
using std::endl;
using std::cin;
void Fun1(int& a)
{

}
void Fun(int a)
{

}
int main()
{
	int a = 12;
	int b = a;
	int i = 0;
	int begin1 = clock();
	for(i = 0; i < 1000000; i++)
		Fun1(a);
	int end1 = clock();
	int begin2 = clock();
	for (i = 0; i < 1000000; i++)
		Fun(a);
	int end2 = clock();
	cout << end1 - begin1 << endl;
	cout << end2 - begin2 << endl;
	return 0;
}

在这里插入图片描述

返回值

在C语言中我们返回一个函数的值的时候,不是返回这个变量

int exchang(int a, int b)
{
	int temp = a;
	a = *b;
	b = temp;
	return a;
}

我们知道函数栈帧的创建和销毁,知道返回值是存在寄存器里面返回的

而在c++中

int& exchang(int left, int right)
{
	int temp = left;
	left = right;
	right = temp;
	return left;
}

返回的是left的引用,因为left在函数结束的时候就销毁了,所以返回的值是随机值,这样写是错误的写法,前面我们学习过递归的实现,空间是可以重复利用的,

#include<iostream>
#include<time.h>
using std::cout;
using std::endl;
using std::cin;
int& Fun(int a)
{
	int c = a;
	c++;
	return c;
}
int main()
{
	int& num1 = Fun(6);
	cout << num1 << endl;
	cout << num1 << endl;
	Fun(1000);
	cout << num1 << endl;

	return 0;
}

在这里插入图片描述

这个代码可以看出来,num1引用的是c的原来的地址,函数结束,c销毁,但是那块内存还是存在,每次再调用,就会进行重复利用这块空间

正确的写法:
使用静态变量
前面我们知道如果使用静态变量的话,在静态区创建,而不是在栈区创建,这样就可以在函数销毁的时候静态变量不进行空间的释放

#include<iostream>
#include<time.h>
using std::cout;
using std::endl;
using std::cin;
int& Fun(int a)
{
	static int c = a;
	c++;
	return c;
}
int main()
{
	int& num1 = Fun(6);
	cout << num1 << endl;
	cout << num1 << endl;
	Fun(1000);
	cout << num1 << endl;

	return 0;
}

在这里插入图片描述
静态变量只初始化一次

某些场景

#include<iostream>
#include<time.h>
#include<assert.h>
using std::cout;
using std::endl;
using std::cin;
typedef struct Seqlist
{
	int a[100];
	int size;
}SL;
void SLModify(SL *ps, int pos, int x)
{
	assert(ps);
	assert(ps->size > pos);
	ps->a[pos] = x;
}

int& SLModify(SL* ps, int pos)
{
	assert(ps);
	assert(ps->size > pos);
	return ps->a[pos];
}

int main()
{
	SL lis = { {0},100 };
	int i = 0;
	for (i = 0; i < lis.size; i++)
	{
		SLModify(&lis, i)++;
	}


	return 0;
}

这里创建一个顺序表,如果要进行顺序表的每个元素进行加1,有两种方法,要么传地址,要么引用出来

常引用

这里介绍一下

const int a = 10;

这个 在c++中是常量,在C语言中是常变量

#include<iostream>
#include<time.h>
#include<assert.h>
using std::cout;
using std::endl;
using std::cin;

int main()
{
	//引用权限不能放大
	const int a = 10;
	//int& b = a;错误的
	const int& b = a;

	//权限可以缩小
	int c = 20;
	const int& d = c;
	const int& f = 10;
	return 0;
}

在常数中,如果对常数进行引用,就不会随便的放大权限,常数不能更改,所以对应引用也不能更改,

常性

当我们如果使用使用不同的引用类型去引用一些不同类型的变量

int i = 10;
double j = i;
const double& rj = i;

如果是使用 double&就会报错,为啥? 因为我们在使用不同类型进行接收的时候,i会产生一个临时变量,(类型转变才会产生临时变量)并且这个临时变量具有常性,需要用const的变量进行接收。

指针和引用的区别

引用:

  1. 语法上,没有开辟空间,在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
  2. 引用比指针使用起来相对更安全
  3. 没有NULL引用,但有NULL指针
  4. 有多级指针,但是没有多级引用
  5. . 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
    位平台下占4个字节)
#include<iostream>
#include<time.h>
#include<assert.h>
using std::cout;
using std::endl;
using std::cin;

int main()
{
	int c = 20;
	const int& d = c;
	cout << sizeof(d);

	return 0;
}

在这里插入图片描述
6. 指针语法上,开辟了空间,在底层实现上实际也是有空间的
7. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

两者共同点:
1.引用的底层是汇编实现的

引用表面好像是传值,其本质也是传地址,只是这个工作有编
译器来做

内联函数

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。

#include<iostream>
using std::cout;
using std::endl;
using std::cin;
int Add(int a, int b)
{
	return a + b;
}
int main()
{
	Add(1, 2);
	return 0;
}

这里是没有inline修饰,需要创建函数栈帧
在这里插入图片描述
在这里插入图片描述
使用inline修饰

#include<iostream>
using std::cout;
using std::endl;
using std::cin;
inline int Add(int a, int b)
{
	int c = a + b;
	return c;
}
int main()
{
	Add(1, 2);
	return 0;
}

未显示展开
在这里插入图片描述

要想看到展开我们需要以下操作
在这里插入图片描述
在这里插入图片描述
内联函数 优点:

  1. 可以调试
  2. 效率高,会展开
  3. 不用创建栈帧,提高效率

缺点:
不适合于大型的函数,每次调用inline修饰过的函数,就会展开一次,如果函数有100行,调用10000次,合计就要运行100 * 10000行,没有inline修饰的函数,每调用一次,就会找到相同的函数栈帧进行调用,总次数就是 100(函数的行数) + 10000(反汇编的call),所以inline修饰大型函数就会影响可执行程序的大小

inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不
是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。(简单的理解,看编译器的心情来决定展不展开

需要注意的是,如果在其他cpp文件使用inline修饰函数,再到头文件声明,在其他cpp文件使用这个函数就会报错,因为使用inline修饰的函数在链接时不会生成符号表。这是因为inline函数在编译时会被直接插入到调用它的地方,而不会产生独立的函数代码。
day1_1.cpp

#include"day1_1.h"
int main()
{
	fun(10);
	return 0;
}

day1_2.cpp

#include<iostream>
using std::cout;
using std::endl;
using std::cin;
inline void fun(int a)
{
	cout << a << endl;
}

day_1.h

#include<iostream>
using std::cout;
using std::endl;
using std::cin;

inline void fun(int a);

在这里插入图片描述
所以我们使用inline修饰函数,在对当前cpp文件或者在头文件定义和声明就行了

auto

auto关键字可以用于自动推导变量的类型,让编译器根据变量的初始化表达式推导出其类型,从而简化代码书写

#include<iostream>
using std::cout;
using std::endl;
using std::cin;
int main()
{
	int a = 10;
	int* b = NULL;
	auto c = a;
	auto& d = a;
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	return 0;
}

在这里插入图片描述

这里typeid(a).name()是返回a的类型

我们可以得出结论

  1. auto 必须初始化
  2. auto 不能当函数参数,返回值也不行
  3. auto不能声明数组

范围的for循环

与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。
前面我们学习过C语言的for循环语句,

int i = 0;
for (i = 0; i < 100; i++)
{
	printf("%d ", i);
}

但是在c++中的for语句有点差别

#include<iostream>
using std::cout;
using std::endl;
using std::cin;

int main()
{
	int a[] = { 1,2,3,4,5,6,7,8,9 };
	for (auto e : a)
	{
		cout << e << " ";
	}
	return 0;
}

意思就是遍历一遍a数组,每个元素都依次赋值给e,自动判断结束, 修改e不会修改里面的元素

如果我们要修改元素的值

#include<iostream>
using std::cout;
using std::endl;
using std::cin;

int main()
{
	int a[] = { 1,2,3,4,5,6,7,8,9 };
	for (auto& e : a)
	{
		e++;
		cout << e << " ";
	}
	return 0;
}

我们可以使用引用来进行修改

指针空值nullptr

#include<iostream>
using std::cout;
using std::endl;
using std::cin;
void func(int)
{
	cout << "f(int)" << endl;
}
void func(int*)
{
	cout << "f(int*)" << endl;
}
int main()
{
	func(0);
	func(NULL);
	return 0;
}

在这里插入图片描述

这里的函数只写了类型,没有写变量,这个在c++是可以的,
看到结果的人可能会发现,为啥都打印了f(int),NULL不是指针类型吗,
其实不是,在c++
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
在这里插入图片描述
如果是c++就是把NULL定义成了一个宏,C语言就是一个指针类型

所以c++就为了弥补这个错误,就写出了一个nullptr来代表NULL空指针
注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入
    的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【零基础入门TypeScript】TypeScript - 概述

目录 什么是 TypeScript&#xff1f; TypeScript 的特点 TypeScript 和 ECMAScript 为什么使用 TypeScript&#xff1f; TypeScript 的组件 声明文件 JavaScript 是作为客户端语言引入的。Node.js 的发展也标志着 JavaScript 成为一种新兴的服务器端技术。然而&#xff0…

【复习】计算机操作系统 第七、八章

第七章 文件管理 内存易失&#xff0c;断电即消失&#xff0c;所以得用外存&#xff0c;而文件管理可以帮助用户管理外存上的文件。 7.1 文件概述 数据项&#xff1a; 记录&#xff1a; 文件&#xff1a; 文件类型&#xff1a; 文件层次结构&#xff1a; 7.2 文件的逻辑结构 1…

Flutter+Go_Router+Fluent_Ui仿阿里网盘桌面软件开发跨平台实战-买就送仿小米app开发

Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发。 Flutter官方介绍&#xff0c;目前Flutte…

2024年01月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年01月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

MongoDB笔记

文章目录 安装查看数据库命令手册 学习地址&#xff1a;https://www.bilibili.com/video/BV16u4y1y7Fm 安装 下载地址 https://www.mongodb.com/try/download/community-kubernetes-operator查看数据库 查看当前数据库 show dbs show databases切换数据库 use 数据库名称cls…

京东tp3手势验证

2024祝我们越来越好。 新年第二天&#xff0c;来看下这最新的tp3手势验证码&#xff0c;很在之前就发过一篇&#xff0c;最近看了看更新了一个东西&#xff0c;但是难点还是在轨迹上面&#xff0c;感兴趣的朋友可以去看看。 risk_jd[jstub] 改了下这&#xff0c;之前我都没带…

怎么设计一个简单又直观的接口?

文章目录 问题的开端为什么从问题开始&#xff1f;自然而来的接口 一个接口一件事情减少依赖关系使用方式要“傻” 小结 开放的接口规范是使用者和实现者之间的合约。既然是合约&#xff0c;就要成文、清楚、稳定。合约是好东西&#xff0c;它可以让代码之间的组合有规可依。但…

基于ssm鲜花销售管理系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;项目介绍 随着科学技术的飞速发展…

STM32的HAL环境搭建

下载 https://www.st.com/en/development-tools/stm32cubemx.html 根据不同平台下载&#xff0c;windows下载window是即可。 安装 解压 下载的是zip文件&#xff0c;进行解压&#xff0c;得到一个exe文件。 安装 得到的exe文件&#xff0c;必须放到一个没有空格&#xff0…

【Java开发岗面试】八股文—Java虚拟机(JVM)

声明&#xff1a; 背景&#xff1a;本人为24届双非硕校招生&#xff0c;已经完整经历了一次秋招&#xff0c;拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验&#xff08;主要是校招&#xff09;&#xff0c;包括我自己总结的八股文、算法、项目介绍、HR面和面试…

C语言---扫雷(Minesweeper)

扫雷 1 了解扫雷游戏1.1 基本规则1.2 基础知识1.2.1字符相减 2 实现过程1.1 棋盘设定1.2 初始化棋盘1.3 打印棋盘1.4 放置雷1.5 排查雷1.6 game()函数 3 完整代码3.1 Minesweeper.h3.2 Minesweeper.c3.3 Test.c 4 参考 1 了解扫雷游戏 点击右侧进入扫雷游戏网页版 1.1 基本规…

计算机组成原理知识总结

目录 第一章、计算机系统概述知识框架&#xff1a;1.冯诺依曼机和存储程序的概念&#xff1f;2.计算机的工作过程&#xff1f;3.在计算机系统结构中&#xff0c;什么是编译&#xff1f;什么是解释&#xff1f;4.描述一下指令执行过程&#xff1f;1) 取指令&#xff1a; PC 一&g…

Glide加载不出图片与请求浏览器资源时中文转码问题

报错代码如图&#xff1a;Image load failed: Failed to load resourse 首先确保你的图片 URL 地址是正确的&#xff0c;可以通过在浏览器中直接访问这个 URL 来测试。另外&#xff0c;确保 URL 地址不包含特殊字符或空格&#xff0c;以免影响加载。 然后确定依赖库没有问题&am…

SpringBoot快速集成多数据源(自动版)

有些人因为看见所以相信&#xff0c;有些人因为相信所以看见 有目录&#xff0c;不迷路 前期准备实现演示参考 最近研究了一下多数据源&#xff0c;这篇博客讲的是简单模式&#xff0c;下篇博客预计写自动切换模式 前期准备 本篇博客基于SpringBoot整合MyBatis-plus&#xff0…

计算机组成原理 数据的表示与运算

文章目录 数据的表示与运算数据表示定点数的表示与运算定点数的表示无符号数有符号数定点整数定点小数四码反码补码移码 总结 定点数的运算算术移位原码反码补码总结 逻辑位移循环位移总结 加减运算原码加减法补码加减法 溢出判断采用一位符号位 浮点数的表示与运算表示IEEE 75…

「MySQL运维常见问题及解决方法」

「MySQL运维常见问题及解决方法」 一、查看MySQL数据库安装路径1.1、方式一 --SHOW VARIABLES LIKE basedir;1.2、方式二 --ps -ef | grep mysql 二、MySQL设置连接数与最大并发数2.1、永久生效--修改my.cnf文件2.2、临时生效--通过命令设置的全局变量 三、其他相关参数设置四、…

0-1 knappack(0-1背包问题)

常见的算法有&#xff1a; 枚举贪心动态规划搜索分治和递归 0-1背包是个典型的动态规划算法。 啰嗦一句&#xff0c;动态规划属于运筹学&#xff0c;美国数学家bellman是运筹学的创建者。 0-1背包代码的逻辑如下&#xff1a; v a l ( i , p ) v a l ( i − 1 , p ) , p ≥…

帅爆了!SylixOS 可视化内核监控器即将发布

在翼辉即将发布的 RealEvo 6.0 中&#xff0c;将会加入 SylixOS 可视化内核监控器功能组件。可视化内核监控器实现了线程和进程状态跟踪、中断测量、内存使用率统计、IO 系统分析等功能&#xff0c;可用于复杂场景下应用程序、系统内核、BSP 以及驱动程序的图形化分析&#xff…

本地部署生成式AI,选显卡or笔记本电脑?!新款酷睿Ultra举票

来源 | 算力豹 200亿个大模型参数无压力&#xff0c;新一代酷睿Ultra凭什么&#xff1f; 12月14日报道&#xff0c;在大模型军备竞赛如火如荼的今天&#xff0c;真正让AI铺开惠民&#xff0c;那么移动端、PC将成为首选&#xff0c;AI PC或成标配。英特尔今日奉上AI硬件大招&am…

Polygon zkEVM ROM Spearbit审计报告解读(2023年8月calldata bug修复)

1. 引言 前序博客有&#xff1a; Polygon zkEVM Hexens审计报告解读Polygon zkEVM Spearbit审计报告解读&#xff08;2022年12月版本&#xff09;Polygon zkEVM Spearbit审计报告解读&#xff08;2023年1月版本&#xff09;Polygon zkEVM Spearbit审计报告解读&#xff08;20…