C语言基础5:操作符详解:算术、移位、赋值、单目、关系、逻辑、条件、逗号表达式、下标引用、表达式求值

news2024/11/25 11:56:10

文章目录

  • C语言基础5:操作符详解:算术、移位、赋值、单目、关系、逻辑、条件、逗号表达式、下标引用、表达式求值
  • 1. 算术操作符
  • 2. 移位操作符
    • 2.1 左移操作符
    • 2.2 右移操作符
  • 3. 位操作符
    • 3.1 位操作符基本介绍
    • 3.2 不使用其他变量,交换int 变量的值
      • 3.2.1 通过加法完成数据交换
      • 3.2.2 通过 异或操作符 进行交换
    • 3.3 练习:求一个整数存储在内存中的二进制中1的个数
      • 3.3.1 方法1:倒序取余法
      • 3.3.2 方法2:移位按位与法
  • 4. 赋值操作符
  • 5. 单目操作符
    • 5.1 sizeof 详解
    • 5.2 按二进制位取反:~
  • 6. 关系操作符
  • 7. 逻辑操作符
  • 8. 条件操作符
  • 9. 逗号表达式
  • 10. 下标引用,函数调用和结构成员操作符
    • 10.1 [ ] 下标引用操作符
    • 10.2 函数调用
    • 10.3 结构成员
  • 11. 表达式求值
    • 11.1 隐式类型转换
    • 11.2 算数转换
    • 11.3 操作符的属性

C语言基础5:操作符详解:算术、移位、赋值、单目、关系、逻辑、条件、逗号表达式、下标引用、表达式求值

1. 算术操作符

  常用的算数操作符:+ - * / %

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int a = 9;
    int b = 0;
    double c = 0;
    int e = 0;
    b = 9 / 4;
    c = 9 / 4.0;
    e = 9 % 4;//去模运算,只能用于整数
    printf("b = %d\n", b);
    printf("c = %lf\n", c);
    printf("e = %d\n", e);
    return 0;
}

(1)除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
(2)对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
(3)% 操作符的两个操作数必须为整数。返回的是整除之后的余数。
在这里插入图片描述

2. 移位操作符

  移位操作符,移动的是二进制位,进行左移或者右移操作。
在这里插入图片描述

2.1 左移操作符

移位规则:左边抛弃,右边补0
在这里插入图片描述

2.2 右移操作符

  移位规则:
(1)算术移位:左边用原该值的符号位填充,右边丢弃
(2)逻辑移位:左边用0填充,右边丢弃
在这里插入图片描述
  如果要查看内存,可以使用F10(Fn)打开调试,点击窗口,选择内存,查看内存。
在这里插入图片描述
  通过上面知道了,算术右移和左移,再以下面的程序为例,找到地址a,把光标运行到 int b = a >> 1;行,此时内存搜索框中,搜索&a,就可以发现&a 中存放的是 8个f ,也就是说2^32位全1(1个16进制占用4个比特位空间,也就是是 2^4,那么8个16进制数就占用32个比特空间,也就是2^4^8=2^32 ).在这里插入图片描述
  因此,当 a 为 -1 时,对a进行算术右移1位,左边符号位补齐,右边丢弃,之后赋值给b,b的结果仍未-1。
在这里插入图片描述
  对于移位运算符,不要移动负数位,这个是标准未定义的。

int num = 1;
num>>-1;//error

3. 位操作符

3.1 位操作符基本介绍

位操作符注释
&按位与,相同为1,不同为0
按位或,有1为1,全0为0
^按位异或,相异为1,相同为0

注:他们的操作数必须是整数。
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 3;		//011
	int b = 5;		//101
	int c = a & b;	//001
	int d = a | b;	//111
	int e = a ^ b;	//110
	printf("c = %d\n", c);
	printf("d = %d\n", d);
	printf("e = %d\n", e);
	return 0;
}

3.2 不使用其他变量,交换int 变量的值

  交换两个int 变量的值,不能使用第三个变量,即 a = 3 , b = 5 ,交换之后,a = 5 ,b = 3;

3.2.1 通过加法完成数据交换

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 5;
	int b = 3;
	a = a + b; //8
	b = a - b; //8 - 3 = 5
	a = a - b; //8 - 5 = 3
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	return 0;
}

3.2.2 通过 异或操作符 进行交换

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 5;	//101
	int b = 3;	//011
	a = a ^ b;	//110
	b = a ^ b;	//110 ^ 011 = 101
	a = a ^ b;	//110 ^ 101 = 011
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	return 0;
}

  通过上述规律可以发现,异或 、 异或 可以提抵消
3^5^3=5
3^3^5=5
3^5^5=3
在这里插入图片描述

3.3 练习:求一个整数存储在内存中的二进制中1的个数

3.3.1 方法1:倒序取余法

  求一个整数在内存中所占的二进制1的个数,也就是说要知道这个数有多少位占了,比如:
16也就是0001 0000 二进制1所占 1位
15也就是0000 1111 二进制1所占 4位

  综上,那可以对这个数据一直 ÷ 2 ,一旦有余数为1,说明这个数中就有一个1。如果余数为0的话,说明该位为0。

就好比一个十进制 123,如果要得到他每个数:
①求个位:对123%10=3
②求十位:对123 / 10 = 12 然后 12 % 10 = 2
③求百位:对12 / 10 = 1 然后 1 % 10 = 1
这样就求出了每一位数。

  但是这个程序不适用于整数是负数的情况,还需要优化下。
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int num = 123;
	int count = 0;//计数
	while (num)
	{
		if (num % 2 == 1)
			count++;
		num = num / 2;
	}
	printf("二进制中1的个数 = %d\n", count);
	return 0;
}

3.3.2 方法2:移位按位与法

  用刚才的123 举例,123 的二进制是:0111 1011,那我们可以用这个数的每一位 与 0000 0001 进行按位与操作,每比较一次,将0000 0001 的二进制数就向左移动一次,然后若按位与结果是1,则计数。
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int num = 123;
	int i = 0;
	int count = 0;//计数
	for (i = 0; i < 32; i++)
	{
		if (num & (1 << i))
			count++;
	}
	printf("二进制中1的个数 = %d\n", count);
	return 0;
}

4. 赋值操作符

  赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。

赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值

  复合赋值符号:+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=

int x = 10;
x = x+10;
x += 10;//复合赋值

5. 单目操作符

单目操作符只有一个操作数

单目操作符注解示例结果
!逻辑反操作a = 1;!a;a = 0
- 负值a = 1;a = -a;a = 5
+ 正值
&取地址int a = 1; int* p = &a;取a的地址放在了指针p里
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
前置、后置–
++前置、后置++++a;a++;先加后用;先用后加;
* 间接访问操作符(解引用操作符)*p = 2将指针p中所存放的地址存入2的数据
(类型)强制类型转换int a = int(3.14);将浮点数,强制类型转换为整形

5.1 sizeof 详解

  sizeof 用于计算的是变量所占内存空间的大小(Byte)
(1)sizeof 计算各变量所占内存空间的大小
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 1;
	char b = 'B';
	int arr[10] = { 0 };
	int* p = NULL;

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));

	printf("%d\n", sizeof(b));
	printf("%d\n", sizeof(char));

	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(int [10]));
	printf("%d\n", sizeof(int [5]));

//	printf("%d\n", sizeof a);//error
//	printf("%d\n", sizeof int);//error
	return 0;
}

(2)以下sizeof 存放变量的情况
  a 是短整型变量,用于将 b + 3的和存入进去,存后,a 还是 短整型,所以sizeof 是 2
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	short a = 1;
	int b = 2;
	printf("%d\n", sizeof(a = b + 3));
	printf("%d\n", a);
	return 0;
}

(3)sizeof 函数传参情况
  由于 数组在传参的时候,传的是首元素的第一个地址,地址传过去后,函数接收必须要指针接收,此时 sizeof(arr)的结果就是4或8个字节。
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void test1(int arr[])
{
 printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
 printf("%d\n", sizeof(ch));//(4)
}
int main()
{
 int arr[10] = {0};
 char ch[10] = {0};
 printf("%d\n", sizeof(arr));//(1)
 printf("%d\n", sizeof(ch));//(3)
 test1(arr);
 test2(ch);
 return 0;
}

5.2 按二进制位取反:~

(1)按位取反运算

按位取反,是按二进制位进行取反,0运算后为1,1运算后为0。在这里插入图片描述
(2)对某个数中的某一位取反
假设2进制数:10101,需要把第4位取反变成11101,我们可以通过把 1 左移 3位,然后与该10101 或运算,既可改为11101。
在这里插入图片描述

6. 关系操作符

关系操作符>>=<<=!===
注释大于大于等于小于小于等于不等于等于

7. 逻辑操作符

关系操作符注释示例
&&逻辑与1&&2结果为1
||逻辑或1||2结果为1

需要注意的是要区分&(按位与)、|(按位或)

举例:以下程序的计算结果是多少呢:

#include <stdio.h>
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

分析:程序运行的时候,按以下顺序①②③运行:
①a ++ ,由于a 先用了,所以运算的时候 a 还是 0,++没有生效
②接着到运算 0 && ++ b了,由于 && 左侧是0 ,因此 ++b 、d++ 不需要运算,结果已经是0 了。
③所以运算过程也只有 a ++了,就是1,其余的均没有运算,也就是1,2,3,4。
在这里插入图片描述
  但是如果上述把 a = 0 改为 a = 1 ,那么结果就会变为2,3,3,5。因为第②步运算的时候,a =1 ,b > 0,表示为真,因此之后的d++ 也会进行运算。
在这里插入图片描述
  修改代码如下,运行结果是多少呢。
在这里插入图片描述
在这里插入图片描述
  答案是:2234,分析,当运算i = a++ || ++b || d++的时候,程序先运行的是 a++ || 当运行到这里的时候就会发现,这个 a 的结果是1,说明为真,那么之后的 ++b、d++ 都不再参与运算,最终结果 只有 a ++ 了一下,也就是 2、2、3、4

8. 条件操作符

若表达式1为真,表达式2的结果为整个表达式的结果,如果表达式1的结果为假,则表达式3的结果为整个表达式的结果。
exp1 ? exp2 : exp3

9. 逗号表达式

exp1, exp2, exp3, …expN

  逗号表达式:就是用逗号隔开的多个表达式。从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
在这里插入图片描述
  逗号表达式的使用举例,可以将程序优化减少啰嗦。

源代码:
a = get_val();
count_val(a);
while (a > 0)
{
         //业务处理
        a = get_val();
        count_val(a);
}


优化:如果使用逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
         //业务处理
}

10. 下标引用,函数调用和结构成员操作符

10.1 [ ] 下标引用操作符

对于 加号 而言,1 + 2,1 和 2 就是 加号的两个操作数
对于 数组 而言,arr[10] 方括号的操作数:一个数组名 + 一个索引值
对于 函数 而言, get_max(a,b) ,其中()式操作符,而操作数是 get_max、a、b。

数组:
int arr[10];//创建数组
 arr[9] = 10;//实用下标引用操作符。
 [ ]的两个操作数是arr和9。

函数:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
get_max(int x, int y)
{
	return x > y ? x : y; 
}
int main()
{
	int a = 10;
	int b = 20;
	//() 调用函数的时候,()就是函数调用操作符
	int max = get_max(a, b);
	printf("max = %d\n", max);
	return 0;
}

10.2 函数调用

  接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
get_max(int x, int y)
{
	return x > y ? x : y; 
}
int main()
{
	int a = 10;
	int b = 20;
	//() 调用函数的时候,()就是函数调用操作符
	int max = get_max(a, b);
	printf("max = %d\n", max);
	return 0;
}

10.3 结构成员

  在写C语言代码的时候,为了描述一个对象,比如学生会有很多属性,姓名、年龄、学号。对于 int 、float 而言是一种类型,而结构体也是一种类型

操作符注释
.结构体.成员名
->结构体指针->成员名

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//创建一个名为 student 的结构体
struct student
{
	char name[10];
	int age;
	char id[20];
};
int main()
{
	int a = 10;
	//使用 struct student 这个类型创建了一个学生对象叫做S1,并初始化
	struct student S1 = { "张三", 20, "202010200330" };
	printf("%s\n", S1.name);
	printf("%d\n", S1.age);
	printf("%s\n", S1.id);

	//结构体变量.成员名
	struct student* ps = &S1;
	printf("%s\n", (*ps).name);
	printf("%d\n", (*ps).age);
	printf("%s\n", (*ps).id);

	//结构体指针->成员名
	printf("%s\n", ps->name);
	printf("%d\n", ps->age);
	printf("%s\n", ps->id);
	return 0;
}

11. 表达式求值

  表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。

11.1 隐式类型转换

  C的整型算术运算总是至少以缺省整型类型的精度来进行的。
  为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升.

  整形提升:在我们计算的过程中,我们发现我们的表达式有些操作数的大小达不到一个整形大小的时候,他们会发生整形提升,变成一个整形,然后再参与运算。

如何进行整形提升:首先看变量的类型是什么类型:
①它是有符号数(10000010),则高位就是他的符号位来填充(11111111 11111111 11111111 10000010
②如果是无符号数,高位直接补0.
例如:
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char a = 3;
	//00000000 00000000 00000000 00000011
	//00000011 - a

	char b = 127;
	//00000000 00000000 00000000 01111111
	//01111111 - b
	
	//a 和 b 如何相加
	//00000000 00000000 00000000 00000011
	//00000000 00000000 00000000 01111111
	//00000000 00000000 00000000 10000010

	char c = a + b;
	//10000010 - c
	//补码:11111111 11111111 11111111 10000010
	//反码:11111111 11111111 11111111 10000001
	//原码:11111111 11111111 11111111 01111110 - 126

	printf("%d\n", c);
	return 0;
}

整形提升的意义:
  表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
  因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
  通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于 int 长度的整型值,都必须先转换为 intunsigned int,然后才能送入CPU去执行运算。

  举例,定义字符型、短整型、整型的十六进制数,他们在内存中存储的方式如下,只有整数型才能等于整数型,其余的字符型与短整型没法和整型的数相等,所以最终只输出了 c
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char a = 0xb6;
	short b = 0xb600;
	int c = 0xb6000000;
	if (a == 0xb6)			//11111111 11111111 11111111 10110110
		printf("a");
	if (b == 0xb600)		//11111111 11111111 10110110 00000000
		printf("b");
	if (c == 0xb6000000)	//00000000 00000000 00000000 10110110
		printf("c");
	return 0;
}

  数据在运算的过程中数据类型会变,甚至会发生整型提升。
在这里插入图片描述

11.2 算数转换

  如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

比如 float 和 double 一同运算的时候,需要把 float 的精度转换为double 的精度,之后再进行运算

long double
double
float
unsigned long int
long int
unsigned int
int

11.3 操作符的属性

复杂表达式的求值有三个影响的因素。
(1) 操作符的优先级
(2)操作符的结合性
(3)是否控制求值顺序。
  两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。操作符优先级
表格由上到下分别表示了优先级的由高到低

操作符描述用法示例结果类型结合性是否控制求值顺序
()聚组(表达式)与表达式同N/A
()函数调用rexp(rexp,…,rexp)rexpL-R
[ ]下标引用rexp[rexp]lexpL-R
.访问结构成员lexp.member_namelexpL-R
->访问结构指针成员rexp->member_namelexpL-R
++后缀自增lexp ++rexpL-R
后缀自减lexp –rexpL-R
!逻辑反! rexprexpR-L
~按位取反~ rexprexpR-L
+单目,表示正值+ rexprexpR-L
- 单目,表示负值- rexprexpR-L
++前缀自增++ lexprexpR-L
前缀自减– lexprexpR-L
*间接访问* rexplexpR-L
&取地址& lexprexpR-L
sizeof取其长度,以字节表示sizeof rexp sizeof(类型)rexpR-L
(类型)类型转换(类型) rexprexpR-L
*乘法rexp * rexprexpL-R
/除法 rexp / rexprexpL-R
%整数取余rexp % rexprexpL-R
+加法rexp + rexprexpL-R
-减法rexp - rexprexpL-R
<<左移位rexp << rexprexpL-R
>>右移位rexp >> rexprexpL-R
> 大于rexp > rexprexpL-R
>=大于等于rexp >= rexprexpL-R
<小于rexp < rexprexpL-R
<=小于等于rexp <= rexprexpL-R
==等于rexp == rexprexpL-R
!=不等于rexp != rexprexpL-R
&位与rexp & rexprexpL-R
^位异或rexp ^ rexprexpL-R
位或rexprexp rexpL-R
&&逻辑与rexp && rexprexpL-R
||逻辑或rexp || rexprexpL-R
? :条件操作符rexp ? rexp : rexprexpN/A
=赋值lexp = rexprexpR-L
+=以…加lexp += rexprexpR-L
-=以…减lexp -= rexprexpR-L
*=以…乘lexp *= rexprexpR-L
/=以…除lexp /= rexprexpR-L
%=以…取模lexp %= rexprexpR-L
<<=以…左移lexp <<= rexprexpR-L
>>=以…右移lexp >>= rexprexpR-L
&=以…与lexp &= rexprexpR-L
^=以…异或lexp ^= rexprexpR-L
|=以…或lexp |= rexprexpR-L
逗号rexp,rexprexpL-R
一个这样的表达式:a*b + c*d + e*f,计算机会根据以上的优先级和结合性有多种算法,例如:

a*b
c*d
a*b + c*d
e*f
a*b + c*d + e*f

或者:
a*b
c*d
e*f
a*b + c*d
a*b + c*d + e*f

如果式中的a、b、c 为表达式,那么计算之后可能会有不同的问题出现,所以该表达式为问题表达式
因此尽量避免计算机在计算的时候有多种计算方式,而是有唯一的计算路径
c + --c;

注释:同上,操作符的优先级只能决定自减–的运算在+的运算的前面,但是我们并没有办法得
知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义
的。

int main()
{
 int i = 10;
 i = i-- - --i * ( i = -3 ) * i++ + ++i;
 printf("i = %d\n", i);
 return 0;
}
编译器
—128Tandy 6000 Xenix 3.2
—95Think C 5.02(Macintosh)
—86IBM PowerPC AIX 3.2.5
—85Sun Sparc cc(K&C编译器)
—63gcc,HP_UX 9.0,Power C 2.0.0
4Sun Sparc acc(K&C编译器)
21Turbo C/C++ 4.5
22FreeBSD 2.1 R
30Dec Alpha OSF1 2.0
36Dec VAX/VMS
42Microsoft C 5.1
int fun()
{
     static int count = 1;
     return ++count;
}
int main()
{
     int answer;
     answer = fun() - fun() * fun();
     printf( "%d\n", answer);//输出多少?
     return 0;
}

  虽然在大多数的编译器上求得结果都是相同的。
  但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先算乘法,再算减法。

  函数的调用先后顺序无法通过操作符的优先级确定

#include <stdio.h>
int main()
{
 int i = 1;
 int ret = (++i) + (++i) + (++i);
 printf("%d\n", ret);
 printf("%d\n", i);
 return 0;
}

  这段代码中的第一个 + 在执行的时候,第三个++是否执行,这个是不确定的,因为依靠操作符的优先级和结合性是无法决定第一个 + 和第三个前置 ++ 的先后顺序

我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题

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

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

相关文章

# maven-高级

1:maven技术 1.1 传统项目管理分析(导入jar包形式) .jar包不统一,jar包不兼容 .工程上线维护操作繁琐等 1.2maven组成部分 maven本身是一个项目管理工具&#xff0c;将项目开发和管理抽象成一个项目对象模型&#xff08;POM&#xff09;POM (project object model) : 项目对…

Bug系列路径规划算法原理介绍(三)——Tangent BUG算法

本系列文章主要对Bug类路径规划算法的原理进行介绍&#xff0c;在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展&#xff0c;整理了13种BUG系列中的典型算法&#xff0c;从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

[附源码]计算机毕业设计基于Springboot作业查重系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

原生JavaScript实现日志搜索高亮的解决方案

前言 最近在做一个日志管理的功能&#xff0c;其中有一个功能是这样的&#xff0c;在一个页面上会显示千上万条日志&#xff0c; 需要做一个搜索的功能&#xff0c;并能将搜索结果一一显示在视口中&#xff0c;通过控制滚动条。 这里使用html原生js实现了一个简单的demo&#…

Win10常见知识点及部分命令

Win10常见知识点及部分命令 1 常见知识点&#xff08;通用&#xff09; 1.1 用户、用户组 1.2 DNS服务器 Domain Name Server&#xff0c;域名解析服务器 1.3 DHCP服务器 Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议 1.4 Web服务器 Web服务器&#xf…

DJ13-1 汇编语言程序设计-2

目录 一、段定义伪指令 1. 段名 2. 定位类型 3. 组合类型 4. 类别名 二、设定段寄存器伪指令 1. 设定段寄存器伪指令 2. 段寄存器的初始化方法 三、过程定义伪指令 一、段定义伪指令 伪指令 SEGMENT 和 ENDS 用于定义一个逻辑段。 使用时必须配对&#xff0c;分别表…

木聚糖-聚乙二醇-聚乙烯亚胺|PEI-PEG-Xylan|聚乙烯亚胺-PEG-木聚糖

木聚糖-聚乙二醇-聚乙烯亚胺|PEI-PEG-Xylan|聚乙烯亚胺-PEG-木聚糖 中文名称&#xff1a;木聚糖-聚乙烯亚胺 英文名称&#xff1a;Xylan-PEI 别称&#xff1a;聚乙烯亚胺修饰木聚糖&#xff0c;PEI -木聚糖 提供PEG接枝修饰木聚糖&#xff0c;木聚糖-聚乙二醇-聚乙烯亚胺&a…

CenterFusion: Center-based Radar and Camera Fusion for 3D Object Detection 解读

paper: CenterFusion: Center-based Radar and Camera Fusion for 3D Object Detection code: https://github.com/mrnabati/CenterFusion 0 引言 自动驾驶的感知应用中&#xff0c; 通常会融合多模态传感器&#xff0c; 如lidar和camera的融合。 单纯基于radar做感知的研究工…

[附源码]Python计算机毕业设计Django网上书城网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

在 python 中使用 Haar-Cascade 进行人脸检测

介绍在本文中&#xff0c;我们将讨论在 OpenCV python 中使用 Haar Cascade&#xff08;级联&#xff09;实现人脸检测器。识别图像中的给定对象称为对象检测。可以使用多种技术来完成此任务&#xff0c;但在本文中&#xff0c;我们将使用带有预训练 XML 文件的 haar 级联。这是…

毕业设计 单片机多功能红外空调遥控器 - 嵌入式 物联网

文章目录0 前言1 简介2 主要器件3 实现效果4 硬件设计空调遥控器原理原理图解码IR信号5 软件说明代码与Homekit进行连接5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩…

3D nunuStudio脚本开发入门

在 3D应用集成开发环境 nunuStudio 中&#xff0c;脚本是使用 javascript 语言编写的&#xff0c;javascript 是用于开发网页的语言&#xff0c;它是一种易于学习的语言&#xff0c;本教程不需要任何编程知识。 但我建议你在继续学习下一个教程之前学习 javascript 编程的基础知…

JSP | oa项目增加用户登录的功能

目录 一&#xff1a;实现用户登录的功能 &#xff08;1&#xff09;当前oa应用还存在的问题&#xff1f; &#xff08;2&#xff09;实现登录功能&#xff1f; &#xff08;3&#xff09;最终达到的结果&#xff1f; &#xff08;4&#xff09;目前存在的问题&#xff1f;…

ASEMI-GBU808整流桥如何测好坏

编辑-Z 整流桥是将交流转化为直流的集成电路设备&#xff0c;主要用于开关电源或逆变电源的整流电路。接下来&#xff0c;让我们了解GBU808整流桥&#xff0c;以及GBU808整流桥如何测好坏的方法。 整流桥GBU808的结构 整流桥GBU808有四只脚分别是AC输入两只脚&#xff0c;用符…

​win10下安装 RabbitMQ​

下载安装包&#xff1a;RabbitMQ-Windows版.7z-Java文档类资源-CSDN下载 下载RabbitMQ一定要保持 Erlang 和 RabbitMQ 的版本匹配 1、安装 Erlang 安装 RabbitMQ 之前需要先安装 Erlang 环境 Erlang 下载地址 https://www.erlang.org/downloads 2、安装 RabbitMQ RabbitMQ 下…

【网络层】RIP协议详解(应用层)、慢收敛、OSPF协议(适合大网络)

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录路由选择分类RIP--距离向量路由选择------简单-------每个路由器维护一个到其他的最佳距离向量记录---------跳数最少-----RIP距离最高16&#xff08;不可达&#xff09;最多15个网络-------只适合小的互联网…

Springboot集成activiti7

在pom文件中添加SpringBoot集成Activiti7的依赖 <!--添加activiti和SpringBoot整合的依赖内置的MyBatis版本与外面的会有冲突&#xff0c;所以需要排除--> <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-start…

毕业设计-深度学习身份证号码检测识别-python-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

Spring Security HTTP认证

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 HTTP提供了用户权限控制和认证的通用方式&#xff0c;这种认证方式通过HTTP请求头来提供认证信息&#xff0c;而不是通过表单…

[附源码]计算机毕业设计基于Springboot校园运动会管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…