C++(2):变量和基本类型

news/2024/5/16 12:07:48/文章来源:https://blog.csdn.net/FDS99999/article/details/130693183

基本内置类型

C++定义了一套包括算术类型(arithmetic type)和空类型(void)在内的基本数据类型。其中算术类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值。

算数类型

算数类型分为两类:整型(包括字符和 bool 型在内)和浮点型。字符和布尔值都属于整型。
C++ 算术类型
bool 型的取值为 true 或 false。
基本的字符类型是 char ,一个 char 的空间应确保可以存放机器基本字符集中任意字符对应的数字值。也就是说,一个 char 的大小和一个机器字节一样。

带符号类型和无符号类型

除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned)两种。带符号类型可以表示正数、负数或 0,无符号类型则仅能表示大于等于 0 的值。

类型转换

程序应该尽量避免依赖于实现环境的行为。如果把 int 的尺寸看成是一个确定不变的已知值,那么这样的程序就称作不可移植的(nonportable)。当程序移植到别的机器上后,依赖于实现环境的程序就可能发生错误。

unsigned u = 10;
int i = -42;
std::cout << u + i << std::endl;//如果 int 占32位,输出4294967264

相加前首先把整数 -42 转换成无符号数。10-42就是10的补码与-42的补码相加。

00000000 00000000 00000000 00001010        (10)原码 
00000000 00000000 00000000 00001010            补码
00000000 00000000 00000000 00101010        (42)原码
11111111 11111111 11111111 11010101            反码
11111111 11111111 11111111 11010110            补码

把负数转化为无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。

如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为带符号数会自动地转换成无符号数。

字面值常量

每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型

整型和浮点型字面值

整型字面值中 0 开头的整数是 8 进制,0x 开头的整数是十六进制。
浮点型字面值可以用小数或科学计数法表示,科学计数法中的指数部分用 E 或 e 标识。

3.14   0.  0e0  .001  3.14E2

默认的,浮点型字面值是一个double.

字符和字符串字面值

字符串字面值的类型实际上是由常量字符构成的数组。
编译器在每个字符串的结尾处添加一个空字符(‘\0’),因此,字符串字面值的实际长度要比它的内容多1。例如,字面值’A’表示的就是单独的字符A,而字符串"A"则代表了一个字符的数组,该数组包含两个字符:一个是字母A、另一个是空字符。

转义序列

在这里插入图片描述

指定字面值的类型

在这里插入图片描述

bool 字面值和指针字面值
true false // bool 类型的字面值
nullptr    // 指针字面值

变量

变量提供一个具名的、可供程序操作的存储空间。每个变量都有其数据类型。
数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。

变量定义

类型说明符 变量名
初始值

当对象在创建时获得了一个特定的值,我们说这个对象被初始化(initialized)了。用于初始化变量的值可以是任意复杂的表达式。
初始化和赋值是两个完全不同的操作。初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。

int units_sold=0;
int units_sold={0};
int units_sold{0};
int units_sold(0);
默认初始化

如果定义变量时没有指定初值,则变量被默认初始化(default initialized),此时变量被赋予了““默认值””。
如果是内置类型的变量未被显式初始化,它的值由定义的位置决定:
1.定义于函数体内的内置类型的对象如果没有初始化,则其值未定义。类的对象如果没有显式地初始化,则其值由类确定
2.定义于任何函数之外的内置类型则被初始化为0;

变量声明和定义的关系

声明(declaration)使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。而定义(definition)负责创建与名字关联的实体。
变量声明规定了变量的类型和名字,在这一点上定义与之相同。但是除此之外,定义还申请存储空间,也可能会为变量赋一个初始值。

如果想声明一个变量而非定义它,就在变量名前添加关键字 extern,而且不要显式地初始化变量。

extern int i; //声明 i 而非定义 i
int j; //声明并定义 j
extern double pi=3.1416; //定义pi
//任何包含了显式初始化的声明即成为定义。

在函数体内部,如果试图初始化一个由 extern 关键字标记的变量,将引发错误。

标识符

关键字:
在这里插入图片描述
操作符替代名
在这里插入图片描述

作用域

作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问该名字。同时,允许在内层作用域中重新定义外层作用域已有的名字。
如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。

复合类型

复合类型(compound type)是指基于其他类型定义的类型
一条声明语句由一个基本数据类型(base type)和紧随其后的一个声明符( declarator)列表组成。每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型。

引用

引用(reference)为对象起了另外一个名字,引用类型引用(refers to)另外一种类型。通过将声明符写成 &d 的形式来定义引用类型,其中 d 是声明的变量名:

int ival =1024;
int &refval = ival;//refval指向ival(是ival的另一个名字)
int &refVal2;//报错:引用必须被初始化(也就是赋值)

一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。
引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。

引用即别名

为引用赋值,实际上是把值赋给了与引用绑定的对象;获取引用的值,实际上是获取了与引用绑定的对象的值。同理,以引用作为初始值,实际上是以与引用绑定的对象作为初始值。

//正确: refVal3绑定到了那个与refval绑定的对象上,这里就是绑定到ival上
int &refVal3 = refval;
//利用与refval绑定的对象的值初始化变量i
int i = refval; //正确:主被初始化为ival的值
引用的定义

允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&开头:

int i = 1024,i2 =2048;// i和i2都是int
int &r = i, r2 = i2;//r是一个引用,与i绑定在一起,r2是int
int i3 = 1024,&ri = i3;// i3是int,ri是一个引用,与i3绑定在一起
int &r3 = i3, &r4 = i2;// r3和r4都是引用

引用只能绑定在对象上

int &refVal4 =10;//错误:引用类型的初始值必须是一个对象
double dval = 3.14;
int &refVal5 = dval;//错误:此处引用类型的初始值必须是int型对象

指针

指针(pointer)是“指向(point to)”另外一种类型的复合类型。指针也实现了对其他对象的间接访问。

指针和引用的不同:
1.指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。
2.指针无须在定义时赋初值。 和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。
3.引用不是对象,没有实际地址,所以不能定义指向引用的指针。

int *ip1, *ip2;// ipl和ip2都是指向int型对象的指针
double dp,*dp2;// dp2是指向double型对象的指针,dp是double型对象
获取对象的地址

指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符&):

int ival =42;
int *p = &ival; // p存放变量ival的地址,或者说p是指向变量ival的指针
指针值

指针的值(即地址)应属下列4种状态之一:
1.指向一个对象。
2.指向紧邻对象所占空间的下一个位置。
3.空指针,意味着指针没有指向任何对象。
4.无效指针,也就是上述情况之外的其他值。

利用指针访问对象

如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问该对象:

int ival = 42;
int*p = &ival; //p存放着变量ival的地址,或者说p是指向变量ival的指针
cout<<*p;//由符号*得到指针p所指的对象,输出42*p= 0;//由符号*得到指针p所指的对象,即可经由p为变量ival赋值
cout<<*p://输出0
空指针

空指针(null pointer)不指向任何对象,在试图使用一个指针之前代码可以首先检查它是否为空。
几个生成空指针的方法:

int *pl = nullptr;//等价于int *p1 = 0;
int *p2=0;//直接将p2初始化为字面常量0
//需要首先#include cstdlib
int *p3 = NULL;//等价于int *p3 = 0;
赋值和指针

赋值永远改变的是等号左侧的对象。

int i = 42;
int *pi = 0; // pi被初始化,但没有指向任何对象
int *pi2 = &i; //pi2被初始化,存有i的地址
int *pi3; //如果pi3定义于块内,则pi3的值是无法确定的pi3 = pi2; //pi3和pi2指向同一个对象i
pi2 = 0;//现在pi2不指向任何对象了pi = &ival;// pi的值被改变,现在pi指向了ival
*pi = 0;// lival的值被改变,指针pi并没有改变

两个指针存放的地址值相同(两个指针相等)有三种可能:它们都为空、都指向同一个对象,或者都指向了同一个对象的下一地址。
需要注意的是,一个指针指应某对象,同时另一个指针指向另外对象的下一地址,此时也有可能出现这两个指针值相同的情况,即指针相等。

void* 指针

void* 指针和空指针不是一回事。
void* 指针是一种特殊的指针类型,可以存放任意对象的地址。
利用void指针能做的事儿比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void指针。

复合类型的声明

变量的定义包括一个基本数据类型( base type)和一组声明符。一条定义语句可能定义出不同类型的变量。

//i是一个int型的数,p是一个int型指针,r是一个int型引用
int i = 1024,*p=&i,&r = i;
指向指针的指针

一般来说,声明符中修饰符的个数并没有限制。 当有多个修饰符连写在一起时,按照其逻辑关系详加解释即可。
指针是内存中的对象,像其他对象一样也有自己的地址,因此允许把指针的地址再存放到另一个指针当中。
通过*的个数可以区分指针的级别。也就是说,**表示指向指针的指针,***表示指向指针的指针的指针,以此类推。

int ival = 1024;
int *pi = &ival; // pi指向一个int型的数
int **ppi = &pi; // ppi指向一个int型的指针

在这里插入图片描述

指向指针的引用

引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用。

int i =42;
int *p;//p是一个 int型指针
int *&r =p;//r是一个对指针p的引用r = &i;//r引用了一个指针,因此给r赋值&i就是令p指向i
*r= 0;//解引用r得到i,也就是p指向的对象,将i的值改为0

面对一条比较复杂的指针或引用的声明语句时,从右向左阅读有助于弄清楚它的真实含义。

const 限定符

const 对象一旦创建后其值就不能再改变,所以const对象必须初始化。

const int i=get_size();//正确:运行时初始化
const int j=42;//正确:编译时初始化
const int k;//错误:k是一个未经初始化的常量

只能在 const 类型的对象上执行不改变其内容的操作。
**默认状态下,const对象仅在文件内有效。**编译器将在编译过程中把用到该变量的地方都替换成对应的值。

多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。
如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。

const 的引用

可以把引用绑定到 const 对象上,就像绑定到其他对象上一样,我们称之为对常量的引用。与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象。

const int ci = 1024;
const int &r1 = ci;//正确:引用及其对应的对象都是常量rl =42;//错误:r1是对常量的引用
int &r2 =ci;//错误:试图让一个非常量引用指向一个常量对象

对const的引用可能引用一个并非const的对象:

int i = 42;
int &r1 = i;//引用ri绑定对象i
const int &r2 = i;// r2也绑定对象i,但是不允许通过r2修改i的值
r1 = 0;// r1并非常量,i的值修改为0
r2 = 0;//错误:r2是一个常量引用

指针和 const

指向常量的指针(pointer to const)不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。
允许令一个指向常量的指针指向一个非常量对象。

const double pi = 3.14;//pi是个常量,它的值不能改变
double *ptr = &pi;//错误:ptr是一个普通指针
const double *cptr = &pi;//正确:cptr可以指向一个双精度常量
*cptr = 42;//错误:不能给*cptr赋值double dval = 3.14;//dval是一个双精度浮点数,它的值可以改变
cptr = &dval;//正确:但是不能通过cptr改变dval的值
const 指针

指针是对象而引用不是,因此就像其他对象类型一样,允许把指针本身定为常量。常量指针(const pointer) 必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。
把 * 放在const关键字之前用以说明指针是一个常量,这样的书写形式隐含着一层意味,即不变的是指针本身的值而非指向的那个值。

int errNumb = 0;
int *const curErr =&errNumb;// curErr将一直指向errNumb
const double pi =3.14159;
const double *const pip = &pi;//pip是一个指向常量对象的常量指针

指针本身是一个常量并不意味着不能通过指针修改其所指对象的值,能否这样做完全依赖于所指对象的类型。

*pip = 2.72;//错误:pip是一个指向常量的指针
//如果curErr所指的对象(也就是errNumb)的值不为0
if (*curErr) {errorHandler ();*curErr = 0;//正确:把 curErr所指的对象的值重置
}

顶层 const

指针本身是一个对象,它又可以指向另外一个对象。
因此,指针本身是不是常量以及指针所指的是不是一个常量 就是两个相互独立的问题。指针类型既可以是顶层 const也可以是底层 const。
用名词 顶层 const 表示指针本身是个常量,而用名词 底层 const 表示指针所指的对象是一个常量。

int i = 0;
int *const pl = &i;//不能改变p1的值,这是一个顶层const
const int ci = 42;//不能改变ci的值,这是一个顶层 const
const int *p2 = &ci;//允许改变p2的值,这是一个底层const

constexpr 和常量表达式

**常量表达式(const expression)**是指值不会改变并且在编译过程就能得到计算结果的表达式。包括字面值、常量表达式初始化的const 对象。

constexpr 变量

允许将变量声明为 constexpr 类型以便由编译器来验证变量的值是否是一个常量表达式。声明为 constexpr 的变量一定是一个常量,而且必须用常量表达式初始化:

constexpr int mf =20;// 20是常量表达式
constexpr int limit =mf + 1;// mf +1是常量表达式
constexpr int sz=size();//只有当size是一个constexpr函数时才是一条正确的声明语句
字面值类型

字面值类型包括:算术类型、引用和指针等。自定义类不属于字面值类型,也就不能被定义为 constexpr 类型。
尽管指针和引用都能定义成 constexpr,但它们的初始值却受到严格限制。一个constexpr指针的初始值必须是 nullptr 或者 0,或者是存储于某个固定地址中的对象。

指针和 constexpr

在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关

const int *p = nullptr;// p是一个指向整型常量的指针
constexpr int *q= nullptr;//q是一个指向整数的常量指针

constexpr 把他所定义的对象设置为了顶层 cosnt。
constexpr 变量所声明的是真正的常量,而 const 现在一般只用来声明某个对象只读,不可改变。

处理类型

类型别名

类型别名(type alias)是一个名字,它是某种类型的同义词。类型别名和类型的名字等价。
使用关键字 typedef 定义:

typedef double wages;	//wages是double的同义词
typedef wages base,*p;	//base是double的同义词,p是double*的同义词

使用 别名声明 定义:

using SI = Sales_item;	// SI是sales_item的同义词

这种方法用关键字 using 作为别名声明的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。

指针、常量和类型别名
typedef char *pstring;//实际上类型pstring 为 char* 的别名
const pstring cstr = 0;//cstr 是指向char的常量指针
const pstring *ps;//ps是一个指针,它的对象是指向char的常量指针const char *cstr = 0;//是对const pstring cstr的错误理解
/*
是用char*重写了声明语句后,数据类型就变成了char,*成为了声明符的一部分。这样改写的结果是,const char成了基本数据类型。前后两种声明含义截然不同,前者声明了一个指向char的常量指针,改写后的形式则声明了一个指向const char的指针。
*/

auto 类型说明符

auto 让编译器通过初始值来推算变量的类型。因此,auto定义的变量必须有初始值。

复合类型、常量和 auto

编译器推断出来的auto类型有时候和初始值的类型并不完全一样。
1.使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。

int i = 0,&r = i;
auto a = r;// a是一个整数(r是i的别名,而主是一个整数)

2.auto一般会忽略掉顶层const,同时底层const则会保留下来。

const int ci =i,&cr = ci;
auto b = ci; //b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr;// c是一个整数(cr是ci的别名,ci本身是一个顶层 const)
auto d = &i; //d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci; //e是一个指向整数常量的指针(对常量对象取地址是一种底层const)

如果希望推断出的auto类型是一个顶层const,需要明确指出。

const auto f= ci;// ci的推演类型是int,f是const int

decltype 类型指示符

希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量。
decltype 的作用是选择并返回操作数的数据类型。

decltype (f()) sum = x;//sum的类型就是函数f的返回类型

decltype 与 auto 的不同:decltype 不会忽略引用和顶层 const。此外,decltype的结果类型与表达式形式密切相关。

const int ci = 0, &cj=ci;
decltype(ci) ×=0;//x的类型是const int
decltype(cj) y=x;//y的类型是const int&, y绑定到变量×
decltype(cj) z;//错误:z是一个引用,必须初始化

decltype ((variable))(注意是双层括号)的结果永远是引用,而decltype (variable)结果只有当variable本身就是一个引用时才是引用。

自定义数据结构

头文件

预处理变量有两种状态:已定义和未定义。

//通常为如下形式
//检查某个指定的预处理变量是否已经定义
#ifndef//当且仅当变量无定义时为真,一旦检查结果为真,则执行后续操作直到遇到 #endif 为止#define//把一个名字设定为预处理变量#endif

预处理变量无视C++语言中关于作用域的规则。

重要术语

  1. 别名声明(alias declaration) 为另外一种类型定义一个同义询:使用“名字=类型”的格式将名字作为该类型的同义词。
  2. 算术类型(arithmetic type) 布尔值、字符、整数、浮点数等内置类型。
  3. 基本类型(base type) 是类型说明符,可用const修饰,在声明语句中位于声明符之前。基本类型提供了最常见的数据类型,以此为基础构建声明符。
  4. 转义序列(escape sequence) 字符特别是那些不可打印字符的替代形式。转义以反斜线开头,后面紧跟一个字符,或者不多于3个八进制数字,或者字母 x 加上 1 个十六进制数。
  5. 头文件保护符(header guard) 使用预处理变量以防止头文件被某个文件重复包含。
  6. 对常量的引用(reference to const) 是一个引用,不能用来改变它所绑定对象的值。对常量的引用可以绑定常量对象,或者非常量对象,或者表达式的结果。
  7. **分离式编译(separate compilation)**把程序分制为多个单独文件的能力。

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

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

相关文章

浅谈IDC数据中心综合布线第二篇——结构化布线

数据中心网络在当今的业务中扮演着越来越重要的作用&#xff0c;提供数据的存储、管理、共享、交换、应用等功能。在数据中心中&#xff0c;大量的数据在服务器、交换机、存储设备之间通过物理层的光缆&#xff08;仅讨论光纤布线&#xff09;进行传输。数据表明&#xff0c;在…

linux swap交换区满了怎么办(已解决)

swap交换区满了怎么办 一、不增加交换区的方法 free -m 或free -h查看占用情况 使用如下指令来查看占用swap的前十进程 for i in $( cd /proc;ls |grep "^[0-9]"|awk $0 >100) ;do awk /Swap:/{aa$2}END{print "$i",a/1024"M"} /proc/$i…

Hadoop 3.0.0的集群搭建和Hive 3.1.3的安装

Hi,朋友们&#xff0c;我们又见面了&#xff0c;这一次我给大家带来的是Hadoop集群搭建及Hive的安装。 说明一下&#xff0c;网上有很多的教程&#xff0c;为什么我还要水&#xff1f; 第一&#xff0c;大多数的安装都是很顺利的&#xff0c;没有疑难解答。 第二&#xff0c…

MySQL数据库---笔记1

MySQL数据库---笔记1 一、数据库概述1.1、什么是数据库1.2、数据库的安装与启动1.3、MySQL数据模型 二、SQL2.1、通用语法及分类2.2、DDL2.2.1、数据库操作 一、数据库概述 1.1、什么是数据库 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase (…

分享一份适合练手的软件测试实战项目,涵盖金融,电商,银行,商城,家政项目

现如今&#xff0c;越来越多的人涌入到测试行业来了&#xff0c;有自学的&#xff0c;有通过参加培训转行的&#xff0c;不管通过何种方式&#xff0c;他们面临的最主要的问题就是&#xff1a; 1、简历上的项目经验如何去编造&#xff1f; 2、入职的背调、薪资流水、离职证明等…

K8s进阶2——二进制搭建K8s高可用集群

文章目录 一、单master资源清单二、系统初始化三、部署etcd集群3.1 生成etcd证书3.2 部署流程3.2.1 准备二进制安装文件3.2.2 创建工作目录3.2.3 创建etcd配置文件3.2.4 设置成systemd服务3.2.5 添加etcd-2和etcd-3节点3.2.6 所有节点启动etcd并设置开机启动 四、安装容器引擎&…

07-通过RocketMQ和Redis实现用户动态提醒

1、用户动态表 CREATE TABLE `t_user_moments` (`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键id,`user_id` bigint(12) DEFAULT NULL COMMENT 用户id,`user_type` int(8) DEFAULT NULL COMMENT 动态类型:0视频 1直播 2专栏动态,`contend_id` bigint(12) D…

六轴传感器基础知识学习:MPU6050特性,四元数,姿态解算,卡尔曼滤波

实际上&#xff0c;只要说到多少轴的传感器一般是就是指加速度传感器&#xff08;即加速计&#xff09;、角速度传感器&#xff08;即陀螺仪&#xff09;、磁感应传感器&#xff08;即电子罗盘&#xff09;。这三类传感器测量的数据在空间坐标系中都可以被分解为X,Y,Z三个方向轴…

YOLOv5【detect.py源码及参数】超详细注释解读!!!建议收藏✨✨!

之前的文章介绍了YOLOv5的网络结构&#x1f680;与目录结构源码&#x1f680;的详细解读&#xff0c;今天带来的是YOLOv5的 detect.py 代码逐行解读以及注释&#xff0c;废话不多说&#xff0c;让我们一起学习YOLOv5的 detect.py 源码吧&#xff01; YOLOv5所使用版本&#xf…

Simulink 自动代码生成电机控制:软件在环测试(SIL)步骤总结

目录 前言 模型配置 SIL模型生成 模型仿真对比 总结 前言 电机模型仿真可以叫做模型在环测试&#xff08;MIL&#xff09;&#xff0c;至于SIL就是软件在环仿真测试&#xff0c;说白了就是验证生成的代码有没有问题&#xff0c;如果有问题那在模型里面修复&#xff0c;不要…

kettle——处理缺失值

目录 一、删除缺失值 1、文本文件输入 2、字段选择 3、过滤记录 4、输出excel文件 5、运行 二、填充缺失值 1、添加文件 2、过滤记录 3、替换NULL值 4、合并记录 5、替换NULL值2 6、字段选择 7、Excel输出 8、运行并查看执行结果 一、删除缺失值 1、文本文件输入…

极客的git常用命令手册

极客的git常用命令手册 1.1 权限配置篇1.1.1 创建ssh key1.1.2 本地存在多个密钥时&#xff0c;如何根据目标平台自动选择用于认证的密钥&#xff1f; 1.2 基础信息配置篇1.2.1 配置用户名1.2.2 配置用户邮箱1.2.3 设置文件名大小写区分1.2.4 设置命令行显示颜色1.2.5 检查git全…

简答题题集

简答题&#xff1a; 1.测试和开发如何配合工作&#xff0c;即测试何时介入测试工作&#xff1f; 测试工作应该覆盖需求分析、概要设计、详细设计、编码等前期阶段&#xff0c;而不应该在系统开发初步完成后才开始。 2.软件测试的对象&#xff1a;正确的依据应该是需求规格说明书…

SpringBoot日志配置(四十七)

当一切被遗忘&#xff0c;那么就回到最初的地方 上一章简单介绍了SpringBoot配置文件敏感信息加密(四十六) , 如果没有看过,请观看上一章 这一章节&#xff0c;我们学习一下日志配置. 参考文章: Spring Boot 日志配置(超详细) 一. 日志配置处理 我们创建一个普通的 SpringB…

终极猜想 |欧科云链研究院揭秘货币未来形态

前言 5月18日&#xff0c;澎湃科技联合欧科云链研究院重磅发布的《从Web3“去美元化”看货币未来形态的终极猜想》文章&#xff0c;通过分析Web3.0“去美元化”的两大路径&#xff0c;对货币未来形态进行了前沿性的猜想。其中&#xff0c;Web3行业盛会Consensus2023&#xff0…

MySQL高级_第11章_数据库的设计规范

MySQL高级_第11章_数据库的设计规范 1. 为什么需要数据库设计 2. 范 式 2.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 可以理解为&#xff0c;一张数据表的设计结构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关…

『iperf3 』服务器连接速度测试(2023/02/16 最新版)

文章目录 一、简介1.1 我的测速需求1.2 iperf 二、安装iperf2.1 windows中下载与构建2.2 Ubuntu中下载与构建 三、测速3.1 连接速度测试3.2 服务器网速测试 一、简介 1.1 我的测速需求 我目前有2个需求&#xff1a; 测试服务器的上传、下载速度&#xff1b;测试与服务器的连…

Pytest技巧大揭秘:编写高质量接口自动化测试

目录 前言&#xff1a; 一、Pytest测试框架简介 二、安装Pytest测试框架 三、编写Pytest测试用例 四、Pytest参数化&#xff08;Parameterization&#xff09; 五、Pytest插件的使用 六、总结 前言&#xff1a; 在软件开发中&#xff0c;接口的测试是非常重要的一环。接…

【zabbix】PostgreSQL表信息查询收集监控

昨天开发那边给了一个需求&#xff0c;每隔一段时间查询一下数据库某表中的数据是否在最近更新&#xff0c;让我这边做一个监控信息收集 一、agent linux侧配置 这边目前就直接在zabbix上实现&#xff0c;首先就是脚本&#xff0c;我用python2实现 脚本名&#xff1a;check_y…

瑞吉外卖 - 修改菜品功能(18)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…