C语言 操作符详解

C语言学习

目录

文章目录

前言

一、算术操作符

二、移位操作符

2.1 左移操作符

2.2 右移操作符

三、位操作符

3.1 按位与操作符 &

3.2 按位或操作符 | 

3.3 按位异或操作符 ^

四、赋值操作符

五、单目操作符

5.1 逻辑反操作符!

5.2 正值+、负值-操作符

5.3 取地址操作符&

5.4 计算操作数的类型长度sizeof

5.5 按位取反操作符 ~

5.6 ++和--操作符

5.7 解引用操作符 *

5.8 强制类型转换操作符()

5.9 sizeof和数组

六、关系操作符

总结


前言

        本文介绍C语言操作符,有以下内容:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符。


一、算术操作符

+      -      *       /      %

        1.  除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

        2.  / 操作符:如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 

  • 整型的除法:

代码示例:

#include <stdio.h>

int main()
{
	int a = 1 / 2;
	printf("a=%d\n", a);
	return 0;
}

运行结果:

a=0
  • 浮点型的除法:

代码示例1:

#include <stdio.h>

int main()
{
	double b = 1.0 / 2;
	printf("b=%f\n", b);
	return 0;
}

运行结果:

b=0.500000

代码示例2:

#include <stdio.h>

int main()
{
	double b = 1 / 2.0;
	printf("b=%f\n", b);
	return 0;
}

运行结果:

b=0.500000

        3. % 操作符计算的是整除后的余数,% 操作符的两个操作数必须为整数。

代码示例:

#include <stdio.h>

int main()
{
	int c = 7 % 2;
	printf("c=%d\n", c);
	return 0;
}

运行结果:

c=1

二、移位操作符

  • << 左移操作符
  • >> 右移操作符

注:移位操作符的操作数只能是整数。

        移位操作符移动的是二进制位。

整数的二进制表示有3种:

  • 原码
  • 反码
  • 补码

正的整数的原码、反码、补码相同。

负的整数的原码、反码、补码是要计算的。

  • 由负整数原码计算出反码:原码的符号位不变,其他位按位取反
  • 由负整数反码计算出补码反码+1

示例:

7的原码、反码、补码:

  • 原码:0000 0000 0000 0000 0000 0000 0000 0111
  • 反码:0000 0000 0000 0000 0000 0000 0000 0111
  • 补码:0000 0000 0000 0000 0000 0000 0000 0111

-7的原码、反码、补码:

  • 原码:1000 0000 0000 0000 0000 0000 0000 0111
  • 反码:1111  1111  1111  1111  1111  1111  1111 1000   符号位不变,其他位按位取反
  • 补码:1111  1111  1111  1111  1111  1111  1111 1001   反码+1

        整数在内存中存的是补码。

        移位操作符移动的是存在内存中的补码。

2.1 左移操作符

移位规则: 左边抛弃、右边补0。

正的整数左移示例:

        对7左移

补码:0000 0000 0000 0000 0000 0000 0000 0111

左移:0000 0000 0000 0000 0000 0000 0000 1110     

        左移后内存中存的还是补码,因为正整数的原码和补码相同,所以对7左移后的值十进制为14。

代码验证:

#include <stdio.h>

int main()
{
	int a = 7 ;
	int b = a << 1;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	return 0;
}

运行结果:

a=7
b=14

        变量b得到了变量a左移1位之后的变化,但变量a自身是不变的。


负的整数左移示例:

        对-7左移

补码:1111  1111  1111  1111  1111  1111  1111 1001

左移:1111  1111  1111  1111  1111  1111  1111 0010

        左移后内存中存的还是补码,因为负整数的原码和补码之间需要计算。

  • 由负整数补码计算出反码补码-1
  • 由负整数反码计算出原码:反码的符号位不变,其他位按位取反

补码:1111  1111  1111  1111  1111  1111  1111 0010  (左移1位后)

反码:1111  1111  1111  1111  1111  1111  1111 0001    补码-1

原码:1000 0000 0000 0000 0000 0000 0000 1110     符号位不变,其他位按位取反。

        计算出-7左移后的值十进制为-14。

代码验证:

#include <stdio.h>

int main()
{
	int a = -7 ;
	int b = a << 1;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	return 0;
}

运行结果:

a=-7
b=-14

        因为二进制数的每一位都是2的指数幂,所以左移1位后,只要没有发生数据溢出,值就会变为原来的2倍,如果变量为无符号整形或正整数,表达式 a << n 会将a的所有位左移n位,运算结果位a×2^{n}

2.2 右移操作符

移位规则:

  1. 逻辑移位:左边补0,右边丢弃。
  2. 算术移位:左边补原值的符号位,右边丢弃。(绝大多数编译器采用算术移位,所以示例都为算数移位结果)

正的整数右移示例:

        对7右移

补码:0000 0000 0000 0000 0000 0000 0000 0111

左移:0000 0000 0000 0000 0000 0000 0000 0011     

        右移后内存中存的还是补码,因为正整数的原码和补码相同,所以7左移后的值十进制为3。

代码验证:

#include <stdio.h>

int main()
{
	int a = 7 ;
	int b = a >> 1;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	return 0;
}

运行结果:

a=7
b=3

负的整数右移示例:

        对-7右移

补码:1111  1111  1111  1111  1111  1111  1111 1001

左移:1111  1111  1111  1111  1111  1111  1111 1100

        右移后内存中存的还是补码,因为负整数的原码和补码之间需要计算。

  • 由负整数补码计算出反码补码-1
  • 由负整数反码计算出原码:反码的符号位不变,其他位按位取反

补码:1111  1111  1111  1111  1111  1111  1111 1100  (左移1位后)

反码:1111  1111  1111  1111  1111  1111  1111 1011    补码-1

原码:1000 0000 0000 0000 0000 0000 0000 0100     符号位不变,其他位按位取反。

        计算出-7右移后的值十进制为-4。

代码验证:

#include <stdio.h>

int main()
{
	int a = -7 ;
	int b = a >> 1;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	return 0;
}

运行结果:

a=-7
b=-4

        因为二进制数的每一位都是2的指数幂,所以右移1位后,只要没有发生数据溢出,值就会变为原来的二分之一,如果变量为无符号整形或正整数,表达式 a >> n 会将a的所有位右移n位,运算结果位a÷2^{n}

        警告:对于移位运算符,不要移动负数位,这个是标准未定义的。

三、位操作符

  •  &  //按(2进制)位与
  •  |  //按(2进制)位或
  •  ^  //按(2进制)位异或  —— 相同为0,相异为1

注:他们的操作数必须是整数。

3.1 按位与操作符 &

        & :两者都为1时结果为1。

代码示例:

#include <stdio.h>

int main()
{
	int a = -5;
	int b = 3;
	int c = a & b;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	printf("c=%d\n", c);
	return 0;
}

运行结果:

a=-5
b=3
c=3

        先计算出-5和3的二进制位补码

-5二进制位

原码:1000 0000 0000 0000 0000 0000 0000 0101

反码:1111 1111  1111 1111  1111 1111  1111 1010

补码:1111 1111  1111 1111  1111 1111  1111 1011

3二进制位

补码:0000 0000 0000 0000 0000 0000 0000 0011  

        用补码进行按位与计算:

1111 1111  1111 1111  1111 1111  1111 1011      -5补码

0000 0000 0000 0000 0000 0000 0000 0011    3补码

0000 0000 0000 0000 0000 0000 0000 0011      -5 & 3 的补码

        因为符号位为0,为正整数,所以原码与补码相同,对应十进制值为3。

3.2 按位或操作符 | 

        | :只要有一个为1,结果就为1。

代码示例:

#include <stdio.h>

int main()
{
	int a = -5;
	int b = 3;
	int c = a | b;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	printf("c=%d\n", c);
	return 0;
}

运行结果:

a=-5
b=3
c=-5

        用补码进行按位或计算:

1111  1111  1111  1111  1111  1111 1111 1011      -5补码

0000 0000 0000 0000 0000 0000 0000 0011    3补码

1111  1111  1111  1111  1111  1111  1111 1011     -5 | 3 的补码

        因为符号位为1,为负整数,所以原码需由补码计算得出。

1111  1111  1111  1111  1111  1111  1111 1011       补码

1111  1111  1111  1111  1111  1111  1111 1010       反码

1000 0000 0000 0000 0000 0000 0000 0101       原码

        计算得出原码的十进制值为-5。

3.3 按位异或操作符 ^

        ^ :相同为0,相异为1。

代码示例:

#include <stdio.h>

int main()
{
	int a = -5;
	int b = 3;
	int c = a ^ b;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	printf("c=%d\n", c);
	return 0;
}

运行结果:

a=-5
b=3
c=-8

        用补码进行按位异或计算:

1111  1111  1111  1111  1111  1111 1111 1011      -5补码

0000 0000 0000 0000 0000 0000 0000 0011    3补码

1111  1111  1111  1111  1111  1111  1111 1000     -5 ^ 3 的补码

        因为符号位为1,为负整数,所以原码需由补码计算得出。

1111  1111  1111  1111  1111  1111  1111 1000       补码

1111  1111  1111  1111  1111  1111  1111 0111       反码

1000 0000 0000 0000 0000 0000 0000 1000       原码

        计算得出原码的十进制值为-8。


编程题:不能创建临时变量(第三个变量),实现两个数的交换。

方法1代码示例:

#include <stdio.h>

int main()
{
	int a = 5;
	int b = 3;
	printf("a=%d ", a);
	printf("b=%d\n", b);
	a = a + b;//变量a中存了a+b的和
	b = a - b;//a+b的和8减去变量b的值3就是变量a的初值5,
              //把5存在变量b中,此时变量a中的值还是a+b的和8
	a = a - b;//a+b的和8减去此时变量b的值5,就是变量b的初值3,
              //把3存在变量a中,此时变量a中的值是3
	printf("a=%d ", a);
	printf("b=%d\n", b);
    return 0;
}

运行结果:

a=5 b=3
a=3 b=5

        但是这种方法会有溢出的问题。

方法2代码示例:

#include <stdio.h>

int main()
{
	int a = 5;
	int b = 3;
	printf("a=%d ", a);
	printf("b=%d\n", b);
	a = a ^ b;//a = 5 ^ 3
	b = a ^ b;//b = 5 ^ 3 ^ 3   ->   b=5
	a = a ^ b;//a = 5 ^ 3 ^ 5   ->   a=3
	printf("a=%d ", a);
	printf("b=%d\n", b);
    return 0;
}

运行结果:

a=5 b=3
a=3 b=5

        两个相同的数按位异或的结果为0;0和任何整数按位异或的结果为整数本身。

四、赋值操作符

        a = b 就是把b的值赋给a,在 = 左侧必须是变量,不能是常量或表达式。

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

        下方每个代码框中的第1句使用复合赋值操作符的代码意思和它下一句代码意思相同。

	a += 3;
	a = a + 3;
	a >>= 3;
	a = a >> 3;
	a &= 3;
	a = a & 3;

五、单目操作符

!                    逻辑反操作

-                    负值

+                   正值

&                   取地址

sizeof            操作数的类型长度(以字节为单位)

~                   对一个数的二进制按位取反

--                   前置、后置--

++                 前置、后置++

*                    间接访问操作符(解引用操作符)

(类型)            强制类型转换

首先来明确一些定义:

  • 操作符(运算符):可以进行运算的符号,如+、-、*、/ 等。
  • 操作数:作为运算对象的变量或常量,如 a+b 中的 a和b。
  • 单目操作(运算)符:只需要有1个操作数,如 +a,-b 。
  • 双目操作(运算)符:需要两个操作数,如 a+b、c-d 。

5.1 逻辑反操作符!

        !作用:把真变假,假变真。

        C语言中0为假,非0为真。

代码示例:

#include <stdio.h>

int main()
{
	int flag = 5;
	//if条件判断:非0为真,0为假
	if(flag)//flag为真,进入if
	{
		printf("真\n");
	}

	if(!flag)//flag为假,进入if
	{
		printf("假\n");
	}
	return 0;
}

5.2 正值+、负值-操作符

代码示例:

#include <stdio.h>

int main()
{
	int a = +8;
	int b = +a;
	int c = -a;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	printf("c=%d\n", c);

	int e = -9;
	int f = +e;
	int g = -e;
	printf("e=%d\n", e);
	printf("f=%d\n", f);
	printf("g=%d\n", g);

	return 0;
}

运行结果:

a=8
b=8
c=-8
e=-9
f=-9
g=9

5.3 取地址操作符&

        &操作符可以取出变量在内存中的首地址。

代码示例:

#include <stdio.h>

int main()
{
	int a = 6;
	printf("%p\n", &a);
	int* p = &a;//p就是指针变量
	return 0;
}

运行结果:

000000AAD799FA74

5.4 计算操作数的类型长度sizeof

        sizeof是一个操作符。

  • 可以计算变量所占内存空间的大小,单位是字节。
  • 可以计算类型所创建的变量占据空间的大小,单位是字节。
  • 可以计算整个数组所占内存空间的大小,单位是字节。

代码示例:

#include <stdio.h>

int main()
{
	//计算变量所占内存空间的大小,单位是字节。
	int a = 7;
	int n1 = sizeof(a); //计算变量a所占内存空间的大小
	printf("n1=%d\n", n1);

	//计算类型所创建的变量占据空间的大小,单位是字节。
	int n2 = sizeof(int);
	printf("n2=%d\n", n2);

	//计算整个数组所占内存空间的大小,单位是字节。
	int arr[10] = { 0 };
	printf("arr[10]=%d\n", sizeof(arr));

	return 0;
}

运行结果:

n1=4
n2=4
arr[10]=40

sizeof使用细节注意

代码示例:

#include <stdio.h>

int main()
{
	int a = 3;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof a);//可以这样使用
	printf("%d\n", sizeof int);//不可以这样使用
	return 0;
}

区分:

  • sizeof是操作符,不是函数。
  • strlen是库函数,用来求字符串长度。

5.5 按位取反操作符 ~

 ~0 对0按位取反:

补码:0000 0000 0000 0000 0000 0000 0000 0000      0的原码、反码、补码都相同

取反:1111  1111  1111  1111  1111  1111  1111 1111

        按位取反后内存中存的还是补码,负整数的原码和补码之间需要计算。

  • 由负整数补码计算出反码补码-1
  • 由负整数反码计算出原码:反码的符号位不变,其他位按位取反

补码:1111  1111  1111  1111  1111  1111  1111 1111  (0按位取反后)

反码:1111  1111  1111  1111  1111  1111  1111 1110    补码-1

原码:1000 0000 0000 0000 0000 0000 0000 0001     符号位不变,其他位按位取反。

        计算出0按位取反后的值十进制为-1。

代码验证:

#include <stdio.h>

int main()
{
	int a = 0;
	printf("~a=%d\n", ~a);
	return 0;
}

运行结果:        

~a=-1

~5 对5按位取反

代码示例:

#include <stdio.h>

int main()
{
	int a = 5;
	printf("~a=%d\n", ~a);
	return 0;
}

运行结果:

~a=-6

~5

补码:0000 0000 0000 0000 0000 0000 0000 0101     5的原码、反码、补码都相同

取反:1111  1111  1111  1111  1111  1111 1111 1010

        按位取反后内存中存的还是补码,负整数的原码和补码之间需要计算。

  • 由负整数补码计算出反码补码-1
  • 由负整数反码计算出原码:反码的符号位不变,其他位按位取反

补码:1111  1111  1111  1111  1111  1111 1111 1010  (5按位取反后)

反码:1111  1111  1111  1111  1111  1111  1111 1001    补码-1

原码:1000 0000 0000 0000 0000 0000 0000 0110     符号位不变,其他位按位取反。

        计算出0按位取反后的值十进制为-6。


对某个数的二进制任意一位进行置1或清0的改动:

代码示例:

#include <stdio.h>

int main()
{
	int a = 12;
	a |= (1 << 4);
	printf("a=%d\n", a);

	a &= (~(1 << 4));
	printf("a=%d\n", a);
	return 0;
}

运行结果:

a=28
a=12

对12二进制的第五位置1

0000 0000 0000 0000 0000 0000 0000 1100    12补码

0000 0000 0000 0000 0000 0000 0001 0000     修改第五位的数可由1移位获得

0000 0000 0000 0000 0000 0000 0001 1100      12与上数按位或,得到指定修改位置1

第五位置1后的数十进制为28

对28二进制的第五位清0

0000 0000 0000 0000 0000 0000 0001 1100     28补码

0000 0000 0000 0000 0000 0000 0001 0000     修改第五位的数可由1移位获得

1111  1111  1111  1111  1111  1111  1110 1111     对1移位后的数按位取反

0000 0000 0000 0000 0000 0000 0000 1100      28与上数按位与,得到指定修改位置清0

第五位清0后的数十进制为12

5.6 ++和--操作符

  • 前置++,先++,后使用;
  • 后置++,先使用,再++;
  • 前置--,先--,后使用;
  • 后置--,先使用,再--;

代码示例:

#include <stdio.h>

int main()
{
	int a = 6;
	int b = ++a;//前置++,先++,后使用
    //a = a+1; b = a;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	int c = 6;
	int d = c++;//后置++,先使用,再++
    //c = d; c = d+1; 
	printf("c=%d\n", c);
	printf("d=%d\n", d);

	return 0;
}

运行结果:

a=7
b=7
c=7
d=6

代码示例:

#include <stdio.h>

int main()
{
	int a = 6;
	int b = --a;//前置--,先--,后使用
	//a = a-1; b = a;
	printf("a=%d\n", a);
	printf("b=%d\n", b);
	int c = 6;
	int d = c--;//后置--,先使用,再--
	//c = d; c = d-1; 
	printf("c=%d\n", c);
	printf("d=%d\n", d);

	return 0;
}

运行结果:

a=5
b=5
c=5
d=6

5.7 解引用操作符 *

代码示例:

#include <stdio.h>

int main()
{
	int a = 6;
	int* p = &a;
	*p = 20;
	printf("a=%d\n", a);
	return 0;
}

运行结果:

a=20
  • 取地址操作符&可以通过变量,找到地址;
  • 解引用操作符*可以通过地址,找到变量。

        上面程序中*p就等价于变量a。

5.8 强制类型转换操作符()

        强制类型转换是把变量从一种类型转换为另一种数据类型。

代码示例:

#include <stdio.h>

int main()
{
	int a = (int)3.14;
	printf("a=%d\n", a);
	return 0;
}

运行结果:

a=3

(int)可以强制将带小数点的数转换为整型。

5.9 sizeof和数组

代码示例:

#include <stdio.h>

void test1(int arr[])
{
	printf("test1(arr[])=%d\n", sizeof(arr));
}
void test2(char ch[])
{
	printf("test2(ch[])=%d\n", sizeof(ch));
}
int main()
{
	int arr[10] = { 0 };
	char ch[10] = { 0 };
	printf("arr[10]=%d\n", sizeof(arr));
	printf("ch[10]=%d\n", sizeof(ch));
	test1(arr);
	test2(ch);
	return 0;
}

运行结果:

arr[10]=40
ch[10]=10
test1(arr[])=8
test2(ch[])=8

        sizeof(数组名) 可得出整个数组在内存中的大小。

        数组传参,传递的是数组首元素的地址。所以test1函数和test2函数中sizeof操作符读到的是数组首元素地址在内存中的大小。

六、关系操作符

>
>=
<
<=
!=       用于测试“不相等”
==      用于测试“相等”

        使用过程中注意==和=


总结

        以上就是今天要讲的内容,本文介绍了C语言操作符的使用。

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

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

相关文章

【Spring Boot】如何集成mybatis-plus

在pom文件中导入maven坐标 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!--mybatis-plus--><dependency><groupId>com.ba…

OpenResty(nginx+lua+resty-http)实现访问鉴权

OpenResty(nginxluaresty-http)实现访问鉴权 最近用BI框架解决了一些报表需求并生成了公开链接&#xff0c;现在CMS开发人员打算将其嵌入到业务系统中&#xff0c;结果发现公开链接一旦泄露任何人都可以访问&#xff0c;需要实现BI系统报表与业务系统同步的权限控制。但是目前…

软件测试【理论基础】

软件测试的IEEE定义&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;目的是检验软件系统是否满足规定的需求&#xff0c;并找出与预期结果之间的差异。 软件测试的发展趋势&#xff1a; ① 测试工作将进一步前移。软件测试不仅仅是单元测试、集成测…

Java中三种定时任务总结(schedule,quartz,xxl-job)

目录 1、Spring框架的定时任务 2、Quartz Quartz的用法 3、xxl-job 3.1 docker 安装xxl-job 3.2 xxl-job编程测试 补充&#xff1a;Java中自带的定时任务调度 1. java.util.Timer和java.util.TimerTask 2. java.util.concurrent.Executors和java.util.concurrent.Sche…

前端开发_CSS

CSS定义 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09; 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签里面书…

Qt应用开发(Quick篇)——矩形模块 Rectangle

一、前言 矩形模块用于用纯色或渐变填充区域&#xff0c;或者提供一个矩形边框。 二、外观 每个矩形项都可以使用使用color属性指定的纯填充色、使用gradient类型定义并使用gradient属性设置的渐变来绘制。如果同时指定了颜色和渐变效果&#xff0c;则只会生效渐变效果。 通过…

探讨Unity中的动画融合技术(BlendTree)

动画在游戏和虚拟现实应用中扮演着关键的角色&#xff0c;而动画融合技术则是使角色动作更加流畅和逼真的核心。在Unity引擎中&#xff0c;我们可以使用动画混合树&#xff08;Blend Trees&#xff09;来实现这一目标。本篇技术博客将深入讨论动画融合技术的实现原理、在Unity中…

jsp前端输入中文数据传到controller变成问号?的解决办法

还是写老师布置的实验的时候&#xff0c;解决了xml文件找不到的问题之后又遇到新的问题&#xff1a;前端登录处输入用户名和密码&#xff0c;结果明明输入的用户名是对的密码也是对的&#xff08;输入的用户名是中文&#xff09;&#xff0c;它就是显示用户名或密码错误。然后我…

高压配电室智能运维

高压配电室智能运维是指通过运用先进的物联网、大数据、云计算等技术&#xff0c;对高压配电室进行智能化、远程化的运行维护&#xff0c;实现高压配电室的安全、高效、经济运行。以下是高压配电室智能运维的主要功能和优势&#xff1a; 实时监测&#xff1a;通过传感器和监测设…

Vue3引入markdown编辑器--Bytemd

字节跳动开源了一款markdown编辑器&#xff0c;bytemd&#xff0c;项目地址&#xff1a;GitHub - bytedance/bytemd: ByteMD v1 repository 安装 npm i bytemd/vue-next 引入方式如下&#xff0c;再main.js中引入样式 import bytemd/dist/index.css 直接封装一个Markdown编…

JavaEE进阶学习:SpringBoot 的创建和使用

1.什么是Spring Boot Spring 的诞生是为了简化 Java 程序的开发的&#xff0c;而 Spring Boot 的诞生是为了简化 Spring 程序开发的。 Spring Boot 翻译一下就是 Spring 脚手架&#xff0c;它就是为了快速开发 Spring 框架而诞生的 2.Spring Boot 优点 起步依赖 (创建的时候…

深入浅出理解kafka

1.Kafka简介 Kafka 本质上是一个 MQ&#xff08;Message Queue&#xff09;&#xff0c;使用消息队列的优点&#xff1a; 解耦&#xff1a;允许独立的扩展或修改队列两边的处理过程。可恢复性&#xff1a;即使一个处理消息的进程挂掉&#xff0c;加入队列中的消息仍然可以在系…

Android,JNI开发和NDK之间的联系

Android&#xff0c;JNI开发和NDK。 1.jni和ndk jni是在jdk中就有出现的 在我们jdk路径中 D:\java\jdk11\include 这就是jdk中的jni Android开发环境中的ndk也有jni&#xff0c; D:\Android\sdk\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\in…

数据结构第六课 -----链式二叉树的实现

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

价差后的几种方向,澳福如何操作才能盈利

在价差出现时&#xff0c;澳福认为会出现以下几种方向。 昂贵资产的贬值和便宜资产的平行升值。昂贵的资产贬值&#xff0c;而便宜的资产保持不变。昂贵资产的贬值和便宜资产的平行贬值&#xff0c;但昂贵资产的贬值速度更快&#xff0c;超过便宜资产。更贵的一对的进一步升值和…

python pyaudio对音频进行端点检测,检测出说话区间

python pyaudio对音频进行端点检测&#xff0c;检测出说话区间 主要采用过零率和语音能量来进行检测&#xff0c;并设置双阈值。 代码如下&#xff1a; # -*- coding: utf-8 -*- import wave import os import matplotlib.pyplot as plt import numpy as np# 判断是否变号 de…

大数据技术学习笔记(四)—— HDFS

目录 1 HDFS 概述1.1 HDFS 背景与定义1.2 HDFS 优缺点1.3 HDFS 组成架构1.4 HDFS 文件块大小 2 HDFS的shell操作2.1 上传2.2 下载2.3 HDFS直接操作 3 HDFS的客户端操作3.1 Windows 环境准备3.2 获取 HDFS 的客户端连接对象3.3 HDFS文件上传3.4 HDFS文件下载3.5 HDFS删除文件和目…

Lab 3: Recursion, Tree Recursion(CS61A 2020)

在网上没有lab3相应的答案&#xff0c;作者也卡蛮久 作者可能就自己的卡住过的问题做一些总结&#xff0c;不能面面俱到&#xff0c;请见谅 &#xff08;就此补充一下答案&#xff09;&#xff08;完整答案在最后&#xff09; Q2: WWPD: Journey to the Center of the Earth…

AcW730.机器人跳跃问题(二分法)-Java版

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;//由题目可知,无论能量大与小,都满足 e 2 * e - h[i]; //初始能量越大,最终的结果越大,要找到一个满足条件的最小值 //可以根据二分的向左找模板: /*if(check(mid)) r mid;els…

【C++ STL】vector类最全详解(什么是vector?vector类的常用接口有哪些?)

目录 一、前言 二、什么是vector ? &#x1f4a6; vector的基本概念 &#x1f4a6;vector的作用是什么 &#x1f4a6;总结 三、 vector的(一维)定义 四、vector(一维)常用接口的使用 &#x1f4a6;vector的常见构造&#xff08;初始化&#xff09; &#x1f4a6;vector…