当前位置: 首页 > 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…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...