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

C语言 —— 操作符

1. 操作符的分类

算术操作符: + - * / %
移位操作符: << >>
位操作符: & | ^
赋值操作符: = += -=
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员

2. 算术操作符

+ - * / %
注意 /操作符:
对于整型的除法运算结果依然是整数
对于浮点型的除法是, 如果有一个是浮点型, 结果就是浮点型
#include <stdio.h>int main()
{int a = 7 % 2;//7/2...1int b = 7 / 2;printf("%d\n", a);//1printf("%d\n", b);//1return 0;
}
//% 取模操作符的两端必须是整数

3. 移位操作符

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

<< 左移操作符
>> 右移操作符
注: 移位操作符的操作数只能是 整数
关于计算机中的 进制
对于整数的二进制表示有3种: 原码, 反码, 补码.
如果是正的整数, 它的原码、反码、补码要相同
如果是负的整数, 它的原码、反码、补码是要计算的.

比如数字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就是补码
整数在内存中存储的是补码.

3.1 左移操作符的使用

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

运行结果:


下面是a为负数的情形, 以int a = -7;为例:

注: 移位操作符只能用在整数.

3.2 右移操作符的使用

右移操作符分为两种: 算术移位和逻辑移位.

算术移位: 右边丢弃, 左边补原符号位;

逻辑移位: 右边丢弃, 左边补0.

int main()
{int a = 7;int b = a >> 1;printf("a=%d\n", a);printf("b=%d\n", b);return 0;
}
VS2019采用算术右移.


下面是a为负数的情形, 以int a = -7;为例:


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


4. 位操作符

& - 按(2进制)位与

| - 按(2进制)位或

^ - 按(2进制)位异或 - 相同为0,相异为1

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

0000 0000 0000 0000 0000 0000 0000 0011 - 3的补码
1000 0000 0000 0000 0000 0000 0000 0101 - -5的原码
1111 1111 1111 1111 1111 1111 1111 1010 - -5的反码
1111 1111 1111 1111 1111 1111 1111 1011 - -5的补码
于是:
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 - &运算

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 - |运算 - 补码
1111 1111 1111 1111 1111 1111 1111 1010 - 反码
1000 0000 0000 0000 0000 0000 0000 0101 - 原码

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 - ^运算 - 补码
1111 1111 1111 1111 1111 1111 1111 0111 - 反码
1000 0000 0000 0000 0000 0000 0000 1000 - 原码

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

原来我们允许创建临时变量的时候可以这么实现两个数的交换:

int main()
{int a = 3;int b = 5;int c = 0;printf("交换前:a=%d b=%d\n", a, b);c = a;a = b;b = c;printf("交换后:a=%d b=%d\n", a, b);return 0;
}

那么要满足题意的代码如下:

 
int main()
{int a = 3;int b = 5;//这种方法会有溢出的问题printf("交换前:a=%d b=%d\n", a, b);a = a + b;b = a - b;a = a - b;printf("交换后:a=%d b=%d\n", a, b);return 0;
}
但是, 理论上讲, 这种方法会出现问题.
a是int类型, 而int类型又有它自己的最大值, b也是int类型, 有它自己的最大值.
那么它们就有自己的上限.
假设a放的值非常大, 但是没有超出它的最大值, b也是一样,
此时a+b的和就会超出最大值, 再赋给a就有可能不是真正的a了, a就会栈溢出, 导致后续的运算结果出错.

我们来看最没有问题的代码:

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

注意这里使用了异或运算符的特点.

3^3 = 0 -> a^a=0 任何数和它本身异或, 结果是0.
011
011
000
0^5=5 -> 0^a = a 任何数和0异或都是它本身.
000
101
101

3^3^5 = 5
3^5^3 = 5
异或操作符支持交换律
011
101
3^3 = 110
011
3^3^5 = 101

求一个整数存储在内存中的二进制中1的个数
翻译题意就是: 求补码的二进制中1的个数
比如int a = 3;
它的二进制为00000000000000000000000000000011

我们进行a&1操作
00000000000000000000000000000011
00000000000000000000000000000001
结果
00000000000000000000000000000001
可以知道, 可以通过&1的方式来得到一个数的二进制位的最后一位是什么.
3&1得到的结果是1, 说明他的最低位是1.

那么当我们统计完这最后一位是什么之后, 我们可以通过右移来让每一位都来到最低位, 然后再通过&1的方式来得到一个数的二进制位的最后一位是什么, 这样就能得到二进制位1的个数
>> <<
#include <stdio.h>
int main()
{int num = -1;int i = 0;int count = 0;//计数for(i=0; i<32; i++){if( num & (1 << i) )count++;}printf("二进制中1的个数 = %d\n",count);return 0;
}

5. 赋值操作符

赋值操作符可以更新变量的数据, 并且它是可以连续使用的, 但是不建议写连续赋值的代码.

int b = 0;
b = 20;//赋值int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值

复合赋值符

+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
int a = 3;
a = a + 5;
a += 5;a = a >> 1;
a >>= 1;

6. 单目操作符

在C语言中,单目操作符是只对一个操作数进行操作的操作符,而双目操作符是对两个操作数进行操作的操作符。
举个例子,单目操作符包括取地址操作符 &(用于获取变量的地址)、递增操作符 ++(用于增加变量的值)、递减操作符 --(用于减少变量的值)等等。这些操作符只需要一个操作数。
双目操作符包括加法操作符 +、减法操作符 -、乘法操作符 *、除法操作符 /等等。这些操作符需要两个操作数来执行相应的操作。
例如, a++是一个单目操作符,它将变量 a的值递增1。而 a + b是一个双目操作符,它将变量 ab的值相加。
!       逻辑反操作
-       负值
+       正值
&       取地址
sizeof  操作数的类型长度(以字节为单位)
~       对一个数的二进制按位取反
--      前置、后置--
++      前置、后置++
*       间接访问操作符(解引用操作符)
(类型)   强制类型转换
//!       逻辑反操作
//C语言中0表示假,非0表示真int flag = 3;
//flag为真,进入if
if (flag)
{}  //flag为假,进入if
if(!flag)
{}
//&       取地址int a = 10;
printf("%p\n",  &a);
int* p = &a;//p就是指针变量
//sizeof  操作数的类型长度(以字节为单位)
//计算的是变量所占内存空间的大小,单位是字节
//计算类型所创建的变量占据空间的大小,单位是字节
int arr[5] = {0};
printf("%d\n", sizeof(arr));//20int a = 10;
//int n = sizeof(a);//计算的是a所占内存的大小,单位是字节
int n = sizeof(int);
printf("n=%d\n", n);//4
//~       对一个数的二进制按位取反
int a = 0;
//0000 0000 0000 0000 0000 0000 0000 0000 - 补码
//1111 1111 1111 1111 1111 1111 1111 1111 -> ~a
//1111 1111 1111 1111 1111 1111 1111 1110 - -1得到反码
//1000 0000 0000 0000 0000 0000 0000 0001 - 再按位取反得到原码
//-1
printf("%d\n", ~a);//-1int b = 3;
//0000 0000 0000 0000 0000 0000 0000 0011
//1111 1111 1111 1111 1111 1111 1111 1100 - 补码
//1111 1111 1111 1111 1111 1111 1111 1011 - 反码
//1000 0000 0000 0000 0000 0000 0000 0100 - 原码
//-4
printf("%d\n", ~b);
//*       间接访问操作符(解引用操作符)
int a = 10;
int* p = &a;
*p = 20;
printf("%d\n", a);
//(类型)   强制类型转换
int a = (int)3.14;
int main()
{int a = 0;printf("%d\n", sizeof(a));printf("%d\n", sizeof(int));printf("%d\n", sizeof a);//ok//printf("%d\n", sizeof int);//errreturn 0;
}
sizeof是操作符,不是函数
strlen是库函数,是用来求字符串长度

7. 关系操作符

关系操作符是用于比较两个值之间的关系的C语言操作符。它们通常返回一个布尔值(真或假),表示比较的结果。

>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
注意: 在编程的过程中== 和=不小心写错,导致的错误。
int a = 5;
int b = 10;if (a < b) {// 执行这个代码块,因为a小于bprintf("a小于b\n");
} else {// 如果条件不成立,执行这个代码块printf("a不小于b\n");
}

在上述示例中,<是一个关系操作符,用于比较变量ab的值,根据比较结果执行不同的代码块。

if ("abc" == "abcdef")//这样写是在比较2个字符串的首字符的地址
{}
//两个字符串比较相等应该使用strcmp

8. 逻辑操作符

逻辑操作符是用于在布尔表达式中执行逻辑运算的C语言操作符。它们通常用于组合多个条件以生成更复杂的条件。

  1. &&(逻辑与,AND):当两个条件都为真时,返回真(1),否则返回假(0)。
  2. ||(逻辑或,OR):当至少一个条件为真时,返回真(1),只有两个条件都为假时才返回假(0)。
  3. !(逻辑非,NOT):对一个条件取反,如果条件为真则返回假(0),如果条件为假则返回真(1)。
int x = 5;
int y = 10;if (x < 10 && y > 5) {// 执行这个代码块,因为x小于10且y大于5printf("x小于10且y大于5\n");
}if (x > 10 || y < 5) {// 执行这个代码块,因为x大于10或y小于5printf("x大于10或y小于5\n");
}if (!(x < 10)) {// 执行这个代码块,因为对x < 10 取反得到假printf("x不小于10\n");
}

在上述示例中,&&||是逻辑操作符,用于组合不同的条件,以便在if语句中执行不同的代码块。而!操作符则用于取反一个条件。

&& 左边为假,右边就不计算了
|| 左边为真,右边就不计算了

9. 条件操作符

条件操作符,也称为三元运算符,是C语言中的一种特殊操作符,用于在一个表达式中根据条件的真假选择不同的值。条件操作符具有以下语法形式:

condition ? expression_if_true : expression_if_false

condition 是一个条件表达式,如果它的值为真(非零),则返回 expression_if_true 的值,否则返回 expression_if_false 的值。

例如:

int x = 10;
int y = 20;
int max;// 使用条件操作符选择最大值
max = (x > y) ? x : y;// 等效的 if-else 语句
/*
if (x > y) {max = x;
} else {max = y;
}
*/printf("最大值是:%d\n", max);

在上述示例中,条件操作符 (x > y) ? x : y 用于比较 xy 的值,如果 x 大于 y,则选择 x 作为最大值,否则选择 y。这是一种紧凑的方式来根据条件选择不同的值。

10. 逗号表达式

逗号表达式是C语言中的一种特殊表达式,它允许你在一个表达式中使用逗号 , 来分隔多个子表达式,并按顺序依次计算这些子表达式,最终返回最后一个子表达式的值。逗号表达式的一般形式如下:

expression1, expression2, expression3, ..., expressionN
  • 逗号 , 用于分隔不同的子表达式。
  • 所有子表达式会按照从左到右的顺序依次计算。
  • 逗号表达式的最终值是最后一个子表达式的值。

逗号表达式通常用于一些特定的情况,例如在 for 循环的表达式部分,或者在需要在一个语句中执行多个操作并返回最后一个操作结果的情况下。

以下是一个示例:

int x = 5, y = 10, z;z = (x++, y++, x + y); // 逗号表达式,计算x++,然后y++,最后计算x + y,将结果赋给zprintf("x = %d, y = %d, z = %d\n", x, y, z);

在上述示例中,逗号表达式 (x++, y++, x + y) 先计算 x++y++,然后计算 x + y,最后将结果赋给变量 z。在输出中,xy 的值都增加了,而 z 的值是 x + y 的结果。

11. 下标引用、函数调用和结构成员

11.1 下标引用操作符

下标引用操作符是用于访问数组和其他类似数据结构的元素的操作符。在C语言中,下标引用操作符采用方括号 [] 来实现。它允许您通过指定元素的索引来访问数组中的特定元素。

下标引用操作符的一般形式如下:

array[index]
  • array 是数组的名称或指向数组的指针。
  • index 是要访问的元素的索引,通常是一个整数表达式。

例如,考虑以下示例:

int numbers[5] = {1, 2, 3, 4, 5};// 使用下标引用操作符访问数组元素
int thirdNumber = numbers[2]; // 访问索引为2的元素,即第三个元素

在上述示例中,numbers[2] 使用下标引用操作符访问了数组 numbers 中索引为2的元素,即值为3的元素。这样,thirdNumber 变量就被赋值为3。

需要注意的是,C语言中的数组索引通常从0开始,因此第一个元素的索引是0,第二个元素的索引是1,以此类推。

11.2 函数调用操作符

函数调用操作符是一种特殊的操作符,用于调用函数并传递参数给它。在C语言中,函数调用操作符采用圆括号 () 来表示,用于标识函数的名称以及传递给函数的参数列表。

函数调用操作符的一般形式如下:

function_name(arguments)
  • function_name 是要调用的函数的名称。
  • arguments 是传递给函数的参数列表,可以是零个或多个参数,用逗号 , 分隔。

例如,考虑以下示例:

#include <stdio.h>// 声明一个函数
int add(int a, int b) {return a + b;
}int main() {int result;// 调用函数add,并传递两个参数result = add(5, 3);printf("5 + 3 = %d\n", result);return 0;
}

在上述示例中,函数调用操作符 (5, 3) 用于调用 add 函数,并传递两个参数 5 和 3 给该函数。add 函数计算它们的和,并将结果返回给 result 变量。然后,printf 函数用于打印结果。

函数调用是C程序中的重要部分,它使您能够执行各种任务,包括数据处理、输入输出、数学计算等。函数的名称和参数列表定义了您要执行的操作。

11.3 访问一个结构的成员

要访问一个结构的成员,需要使用成员访问操作符 .(点号)来引用结构变量的成员名称。结构成员访问操作符的一般形式如下:

structure_variable.member_name
  • structure_variable 是包含要访问成员的结构变量的名称。
  • member_name 是要访问的结构成员的名称。

以下是一个示例:

#include <stdio.h>// 定义一个结构
struct Point {int x;int y;
};int main() {// 声明一个结构变量并初始化struct Point p1;p1.x = 10;p1.y = 5;// 访问结构成员并打印它们的值printf("p1.x = %d\n", p1.x);printf("p1.y = %d\n", p1.y);return 0;
}

在上述示例中,我们首先定义了一个名为 Point 的结构,该结构有两个成员 xy。然后,在 main 函数中,我们声明了一个名为 p1 的结构变量,并分别使用成员访问操作符 . 来设置和访问结构的成员 xy 的值。

通过这种方式,可以有效地组织和操作数据,将相关的数据项存储在一个结构中,并使用成员访问操作符来访问它们。这在构建复杂的数据结构和数据记录时非常有用。


访问一个结构的成员时,还可以使用箭头操作符 ->。这个操作符通常用于访问指向结构体的指针的成员。结构体的成员可以是变量、其他结构体或其他数据类型。

下面是箭头操作符的一般形式:

pointer_to_structure->member
  • pointer_to_structure 是指向结构体的指针。
  • member 是要访问的结构体成员的名称。

示例代码:

#include <stdio.h>// 定义一个结构体
struct Point {int x;int y;
};int main() {// 创建一个Point类型的结构体变量struct Point myPoint;myPoint.x = 10;myPoint.y = 20;// 创建指向结构体的指针struct Point *ptr = &myPoint;// 使用箭头操作符访问结构体的成员printf("x坐标:%d\n", ptr->x); // 输出:x坐标:10printf("y坐标:%d\n", ptr->y); // 输出:y坐标:20return 0;
}

在上述示例中,我们定义了一个名为 Point 的结构体,其中包含 xy 两个成员。然后,我们创建了一个 Point 类型的结构体变量 myPoint 和一个指向结构体的指针 ptr。使用箭头操作符 ptr->xptr->y 可以访问结构体 myPoint 的成员。

相关文章:

C语言 —— 操作符

1. 操作符的分类 算术操作符: - * / % 移位操作符: << >> 位操作符: & | ^ 赋值操作符: - 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术操作符 - * / % 注意 /操作符: 对于整型的除法运算结果依然是整数…...

物联网AI MicroPython传感器学习 之 CCS811空气质量检测传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 通过CCS811传感器模块可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2(二氧化碳)浓度&#xff0c;作为衡量空气质量&#xff08;IAQ&#xff09;的指标。 引脚定义 VCC&#xff1a;3.3VGND&…...

TCP/IP(十五)拥塞控制

一 拥塞控制 ① 拥塞控制必要性 思考&#xff1a; 为什么要有拥塞控制呀,不是有流量控制了吗&#xff1f; ② 拥赛窗口 cwnd 什么是拥塞窗口? 和发送窗口有什么关系呢?明白&#xff1a; cwnd、swnd、rwnd 缩写 含义 ③ 如何知道当前网络是否出现了拥塞呢&#xff1f;…...

vue3 404解决方法

在 Vue 3 应用中解决 404 错误通常涉及到 Vue Router&#xff0c;因为 404 错误通常与路由无法匹配到的路径有关. 1. **检查路由配置**&#xff1a;首先确保你的路由配置正确。确保每个路由路径都与你的组件正确匹配&#xff0c;并且在需要时添加必要的路由守卫。 2. **通配符…...

Unity中使用Xlua调用lua相关

//引用命名空间 using XLua; public class L1 : MonoBehaviour {// Start is called before the first frame updatevoid Start(){//Lua解析器 让我们在Unity中使用luaLuaEnv env new LuaEnv();//执行env.DoString("print(OK)");//执行一个Lua脚本 在resource文件夹…...

基于http的protobuf服务实现

本文介绍在http协议中&#xff0c;使用protobuf格式进行二进制数据通信。双方需设置http的header中ContentType为application/x-protobuf。 1、springboot下实现protobuf&#xff1a; 1&#xff09;pom.xml <dependency><groupId>org.springframework.boot</g…...

基于uniapp的商城外卖小程序

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

【CSS】Tailwind CSS

直接参考 Tailwind CSS 安装提供了四种方式。因为我常用构建工具搭建项目&#xff0c;所以选择 Using PostCSS 。 其中 tailwind.config.js 的配置可以改为&#xff1a; module.exports {content: [./index.html, ./src/**/*.{vue,js,ts,jsx,tsx}],theme: {extend: {},},pl…...

leetcode-电话号码组合(C CODE)

1. 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#…...

Leetcode92. 反转链表 II

Every day a Leetcode 题目来源&#xff1a;92. 反转链表 II 解法1&#xff1a;模拟 注意 STL 的 reverse() 是左闭右开的。 代码&#xff1a; class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right){vector<int> nums getNums(…...

【算法作业记录】

插入排序 递归实现 直接插入 #将a[n]插入有序区间a[0,n-1]中 时间复杂度 O&#xff08;n&#xff09; def Insert(a,n):inwhile(i>0 and a[i-1]>a[i]):tmpa[i]a[i]a[i-1]a[i-1]tmpi-1return #直接插入排序 def Insertsort(a,n):for i in range(1,n):#【1&#xff0c;n-…...

回归预测、分类预测、时间序列预测 都有什么区别?

回归预测、分类预测和时间序列预测都是统计和机器学习领域中的预测任务&#xff0c;它们在问题设置和解决的方式上有一些关键区别&#xff1a; 回归预测&#xff1a; 回归预测用于预测连续数值的输出&#xff0c;通常是实数。例如&#xff0c;预测房价、气温、销售额等连续型输…...

关于网络协议的若干问题(三)

1、当发送的报文出问题的时候&#xff0c;会发送一个 ICMP 的差错报文来报告错误&#xff0c;但是如果 ICMP 的差错报文也出问题了呢&#xff1f; 答&#xff1a;不会导致产生 ICMP 差错报文的有&#xff1a; ICMP 差错报文&#xff08;ICMP 查询报文可能会产生 ICMP 差错报文…...

办公室人人在用的iTab桌面真的好用吗?

本人坐标北京&#xff0c;在一家中型互联网公司当社畜多年。最近发现一个奇怪的现象&#xff0c;我工位前后左右的同事都跟我在用一样的浏览器桌面——iTab新标签页。我表示莫非真的英雄所见略同&#xff1f; 我是去年1月份在刷B站时偶然刷到一条评论&#xff0c;有人分享自己…...

循环中的else语句

while 循环else结构: 循环可以和else配合使用&#xff0c;else下方缩进的代码指的是当循环正常结束之后要执行的代码. 需求&#xff1a;女朋友生气了&#xff0c;要惩罚&#xff1a;连续说5遍“老婆大人&#xff0c;我错了”&#xff0c;如果道歉正常完毕后女朋友就原谅我了:…...

三.镜头知识之FOV

三.镜头知识之视场角 最近试了很多sensor, 每次在选镜头时都对其提到的FOV参数一头雾水。不同的sensor要配不同的镜头&#xff0c;而不同的镜头由于焦距的不同&#xff0c;FOV也不一样。这其中有什么联系呢&#xff1f;FOV又分为HFOV(水平&#xff09;, VFOV( 垂直&#xff09…...

分布式事务入门

文章目录 分布式事务问题本地事务分布式事务演示分布式事务问题 理论基础CAP定理一致性可用性分区容错矛盾 BASE理论 SeataSeata的架构部署TC服务微服务集成seata 动手实践XA模式两阶段提交Seata的XA模型实现XA模式 AT模式Seata的AT模型流程梳理脏写问题实现AT模式 TCC模式流程…...

Ubuntu的中文乱码问题

一、Ubuntu的中文乱码问题 sudo apt-get install language-pack-zh-hans 二、修改/etc/environment&#xff08;在文件的末尾追加&#xff09;&#xff1a; LANG"zh_CN.UTF-8" LANGUAGE"zh_CN:zh:en_US:en" 三、修改/var/lib/locales/supported.d/loca…...

[GXYCTF2019]Ping Ping Ping - RCE(空格、关键字绕过[3种方式])

[GXYCTF2019]Ping Ping Ping 1 解题流程1.1 小试牛刀1.2 三种解法1.2.1 解法一:变量定义拼接绕过1.2.2 解法二:base64编码绕过1.2.3 解法三:内联执行绕过2 思考总结1 解题流程 1.1 小试牛刀 1、提示?ip,结合题目名称,我们直接输入?ip=127.0.0.1 PING 127.0.0.1 (127.…...

ceph 分布式存储与部署

目录 一、存储基础&#xff1a; 1.单机存储设备&#xff1a; 2. 单机存储的问题&#xff1a; 3. 商业存储解决方案&#xff1a; 4. 分布式存储&#xff1a; 5. 分布式存储的类型&#xff1a; 二、Ceph 简介&#xff1a; 三、Ceph 优势&#xff1a; 四、Ceph 架构&#xff1a…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...