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

于交错的路径间:分支结构与逻辑判断的思维协奏

在这里插入图片描述

大家好啊,我是小象٩(๑òωó๑)۶
我的博客:Xiao Xiangζั͡ޓއއ

很高兴见到大家,希望能够和大家一起交流学习,共同进步。*
在这里插入图片描述
这一节内容很多,文章字数达到了史无前例的一万一,我们要来学习分支与循环结构中的分支,学习if和switch语句,了解各种操作符和运算符的使用…

文章目录

  • 开篇
  • 一、if语句
    • 1.1if
    • 1.2 else
    • 1.3 分支中包含多条语句
    • 1.4 嵌套if
    • 1.5 悬空else问题
    • 2.关系操作符
    • 3.条件操作符
    • 4.逻辑操作符:&& , || , !
    • 4.1 逻辑取反运算符 !
    • 4.2 逻辑与运算符
    • 4.3 逻辑或运算符
      • 来个小练习:判断闰年
    • 4.4 短路
  • 二、switch 语句
  • 5.1 if语句和switch语句的对比
    • 5.2 switch语句中的break
      • 来个练习
  • 5.3 switch语句中的default
    • 5.4 switch语句中的case和default的顺序问题
  • 结尾

开篇

前面我们说过,C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的。
我们可以使用 if 、 switch 实现分支结构,使用 for 、 while 、 do while 实现循环结构

一、if语句

if语句是C语言中用于条件判断和控制程序流程的基本结构之一,理解并熟练使用if语句对于编写有效的C语言程序至关重要

1.1if

if 语句的语法形式如下:

if ( 表达式 )语句

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
之前在布尔类型说过,在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行。
例⼦:输入一个整数,判断是否为奇数

#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d 是奇数\n", num);return 0;
}

在这里插入图片描述
举个例子:
在这里插入图片描述

1.2 else

如果一个数不是奇数,那就是偶数了,如果任意一个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
这里就需要 if…else… 语句了,语法形式如下:

if ( 表达式 )语句1
else语句2

例子:判断整数是否为偶数,是的话打印偶数,否则奇数
很简单:

# include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);  if (num % 2 == 0)    注意if第一句不能有逗号printf("%d 为偶数\n", num);elseprintf("%d 为奇数\n", num);return 0;
}

练习:输入一个年龄,>= 18岁就输出:成年,否则就输出:未成年
参考代码:

#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}

1.3 分支中包含多条语句

默认在 if 和 else 语句中默认都只控制一条语句,比如:

#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age >= 18)printf("成年了\n");printf("太好了\n");return 0;}

在这里插入图片描述
在这里插入图片描述

上面的代码,你会发现输入的值不管是>=18 还是<18,“太好了” 都会打印在屏幕上。

这是因为 if 语句只能控制一条语句,就是 printf(“成年了\n”); ,if语句为真,则打印成年了,if语句为假,则不打印,对于 printf(“太好了\n”); 是独立存在的,不管if语句的条件的真假,都会被执行。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使用 { } 将代码括起来,else 后也可以跟上大括号。如下:

#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("成年了\n");
printf("太好了\n");
}
return 0;
}

当然,我们还能再优化一下:

#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age >= 18) //if 后使用{} 控制多条语句-这个块也叫:程序块,或者复合语句{printf("成年了\n");printf("太好了\n");}else //else 后使用{}控制多条语句-这个块也叫:程序块,或者复合语句{printf("未成年\n");printf("心碎♥\n");}return 0;
}

1.4 嵌套if

在 if else 语句中, else 可以与另一个 if 语句连用,构成多重判断
比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数。请看如下代码:
我们来看第一种写法:

int main()
{int num = 0;//输入scanf("%d", &num);if (num == 0)printf("输入的整数是0\n");else //正数或者负数{if (num > 0)printf("输入的整数是正数\n");elseprintf("输入的整数是负数\n");}return 0;
}

我们也可以把else和if整合到一起,形成一条语句,第二种写法:

#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);if(num == 0)printf("输⼊的数字是0\n");else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构printf("输⼊的数字是正数\n");elseprintf("输⼊的数字是负数\n");return 0;
}

上图中else后面的代码就是嵌套在前面的 else 子句中的,构成了嵌套的if语句。

再比·如:
输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:非正数。

int main()
{int num = 0;scanf("%d", &num);if (num > 0)//正数{if (num % 2 == 1)printf("奇数\n");elseprintf("偶数\n");}else{printf("非正数\n");}return 0;
}

我们可以再来看一个练习:
输入一人的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁至44岁打印"青年"
如果年龄在45岁至59岁打印"中老年"
如果年龄在60岁至89岁打印"老年"
如果90岁及以上打印"老寿星"

我们给大家两种参考做法:

#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age<18)printf("少年\n");else if(age<=44)printf("青年\n");else if(age<=59)printf("中老年\n");else if(age<=89)printf("老年\n");elseprintf("老寿星\n");return 0;
}

第二种:

int main()
{int age = 0;//输入scanf("%d", &age);if (age < 18)printf("少年\n");else //>=18{if (age <= 44)//18~44printf("青年\n");else //>=45{if (age <= 59) //45~59printf("中老年\n");else //>=60{if (age <= 89)//60~89printf("老年\n");elseprintf("老寿星\n");}}}return 0;
}

1.5 悬空else问题

如果有多个 if 和 else ,可以记住这样一条规则

else 总是跟最接近的 if 匹配

我们首先从下面代码开始

#include <stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");else printf("haha\n");return 0;
}

程序运行的结果是啥?
很多新手,上来以判断 a 是 0,不等于 1 ,那就执行 else 子句,打印 haha
但是当你去运行代码,输出的结果是:啥都不输出。

为什么呢?
这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配
上面的代码排版,让 else 和第⼀个 if 语句对齐,让我们以为 else 是和第一个if匹配的,当 if语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第二个 if进行匹配的,这样后边的 if…else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。
如果代码改成下面这样就更加容易理解了

#include <stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1){if (b == 2)printf("hehe\n");elseprintf("haha\n");}return 0;
}

或者如果我们希望else确实和第一个if匹配,可以这样修改代码:

#include <stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1){if (b == 2)printf("hehe\n");}else{printf("haha\n");}return 0;
}

只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。

2.关系操作符

在C语言中,关系操作符(也称为关系运算符)用于比较两个值之间的关系,并根据**比较结果返回布尔值(真或假)重要,要记住
C 语言
用于比较的表达式,称为 “关系表达式(relational expression)**,里面使用的运算符就称为“关系运算符”(relational operator),主要有下面6个。

• > 大于运算符
• < 小于运算符
• >= 大于等于运算符
• <= 小于等于运算符
• == 相等运算符
• != 不相等运算符

下面是一些例子。

a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;

关系表达式通常返回 0 或 1 ,表示真假

C 语言中, 0 表示假,所有非零值表示真,比如, 20 > 12 返回 1 , 12 > 20 返回 0 。
关系表达式常用于 if 或 while 结构。

**

注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

**

if (x = 3) ...

上面例子中,原意是 x == 3 ,但是不小心写成 x = 3 。这个式子表示对变量 x 赋值 3 ,它的返回值为 3 ,所以 if 判断总是为真。
为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。

if (3 == x) ...

这样的话,如果把 == 误写成 = ,编译器就会报错。

/* 报错 */
if (3 = x) ...

另一个需要避免的错误是:多个关系运算符不宜连用
举个例子:

a < b < c

上面例子中,连续使用两个小于运算符。虽然这样不会报错,但是通常达不到想要的结果,即不是保证变量 b 的值在 a 和 c 之间。因为关系运算符是从左到右计算,赋值是从右向左,所以实际执行的是下面的表达式。

(a < b) < c

上面式子中, a < b 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进行比较。如果想要判断变量 b的值是否在 a 和 c 之间,应该使用下面的写法。

a < b && b < c

&&这个符后面会讲到,这里是并且的意思
比如:我们输入一个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。
如果我们这样写‘

#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if (18 <= age <= 36){printf("⻘年\n");}return 0;
}

当我们输入9的时候,依然输出青年,如下图:
在这里插入图片描述
这是因为,我们先拿18和age中存放的9比较,表达式18<=9为假, 18<=age 的结果是0,再拿0和36比较,0<=36为真,所以打印了青年 ,所以即使当age是9的时候,也能打印青年 ,逻辑上是有问题,这个代码应该怎么写呢?
正确写法:

#include<stdio.h>
int main()
{int age = 0;scanf("%d", &age);if (age >= 18 && age <= 36)printf("青年\n");return 0;
}

以上就是关于操作符,我们需要掌握的,剩下的只要按照字面意思理解使用就行,没有特别注意的。

3.条件操作符

在C语言中,条件操作符(也称为三元操作符)是唯一的三目操作符,它**允许根据一个条件的真假来选择两个值中的一个
条件操作符
需要接受三个操作数的**,形式如下:

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
举个例子:

#include <stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d", &a);b = a > 5 ? 3 : -3;printf("%d",b);return 0;
}

练习2:使用条件表达式实现找两个数中较大值。

#include <stdio.h>
int main()
{int a = 0;	int b = 0;scanf("%d%d", &a, &b);//%d空格中间不用空格,但输入的时候要用空格分隔int m = a > b ? a : b;printf("%d\n", m);return 0;
}

4.逻辑操作符:&& , || , !

在C语言中,逻辑操作符用于执行逻辑运算,它们通常用于控制流语句中(如if和while循环),以根据给定的条件逻辑来决定程序的执行路径。

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。

注意:C语言中零为假,非零为真

4.1 逻辑取反运算符 !

在这里插入图片描述
比如,我们有一个变量叫 flag ,如果flag为假,要做一个什么事情,就可以这样写代码:

#include <stdio.h>
int main()
{int flat = 0;if (!flat)printf("xiaofeixiang\n");return 0;}

如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
所以上面的代码的意思就是 flag 为假,执行if语句中的代码。

4.2 逻辑与运算符

有假则为假,只有两个同时为真,才为真
在这里插入图片描述
&& 就是与运算符,也是并且的意思, && 是一个双目操作符,使用的方式是 a&&b

&& 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。

举个例子:用代码实现月份属于3月到5月,是春天

#include <stdio.h>
int main()
{int month = 0;scanf("%d", &month);if (month >= 3 && month <= 5)printf("春季\n");return 0;
}

这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足。

4.3 逻辑或运算符

有真则为真,同假才为假
在这里插入图片描述
|| 就是或运算符也就是或者的意思, || 也是⼀个双目操作符,使用的方式是 a || b

||两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

比如:我们说一年中月份是12月或者1月或者2月是冬天,那么我们怎么使用代码体现呢?

#include <stdio.h>
int main()
{int year = 0;scanf("%d", &year);if (year == 12 || year == 1 || year == 2);printf("冬季\n");return 0;
}

来个小练习:判断闰年

输入一个年份year,判断year是否是闰年
闰年判断的规则:

  1. 能被4整除并且不能被100整除是闰年
  2. 能被400整除是闰年
#include<stdio.h>
int main()
{int year = 0;scanf("%d", &year);if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)printf("%d 是闰年\n", year);elseprintf("%d 不是闰年", year);return 0;}

4.4 短路

在C语言中,**短路(short-circuit)**是 逻辑运算符&&(逻辑与)和||(逻辑或) 的一个特性。这种特性使得在逻辑表达式的求值过程中,如果根据已经求值的部分就能够确定整个表达式的结果,那么就不再对表达式的其余部分进行求值。

C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。

重要:如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

如前面的代码:

if(month >= 3 && month <= 5)

表达式中&& 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行,简单来说,就是**前面的条件只要不符合就不再执行了**
对于 || 操作符是怎么样呢?我们结合前面的代码:

if(month == 12 || month==1 || month == 2)

如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以, || 操作符的左操作数的结果不为0时,就需执行右操作数,简单来说,即当前面的条件为真时,就不用再看后面的条件了
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。

二、switch 语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构,switch语句是一种多分支选择结构,它允许程序根据一个变量的值执行不同的代码块。switch语句通常用于替代多个if-else if-else语句,以使代码更加简洁和易于维护

switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式

switch (expression) 
{case value1: statementcase value2: statementdefault: statement
}

上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。

注:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式

5.1 if语句和switch语句的对比

练习:输入任意一个整数值,计算除3之后的余数
如果使用if语句完成,如下:

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);if (n % 3 == 0)printf("整除,余数为0\n");else if (n % 3 == 1)printf("余数是1\n");elseprintf("余数是2\n");return 0;
}

如果使用switch语句改写,就可以是这样的:

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);switch (n % 3){case 0:printf("整除,余数为0\n");break;case 1:printf("余数是1\n");break;case 2:printf("余数是2\n");break;}return 0;
}

上述的代码中,我们要注意的点有:

  1. case 和后边的数字之间必须有空格
  2. 每一个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。
    3.case 后面用的是冒号,不是分号

5.2 switch语句中的break

前面的代码中,如果我们去掉case语句中的break,会出现什么情况呢?

#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);switch (n % 3){case 0:printf("整除,余数为0\n");case 1:printf("余数是1\n");case 2:printf("余数是2\n");}return 0;
}

输一组数据看看结果:
在这里插入图片描述
我们发现,7除以3本来余数是1,但是我们发现程序运行的结果多了一行“余数是2”的打印。
这是为什么呢?
原因是 switch 语句也是分支效果的,

只有在 switch 语句中使用 break 才能在跳出 switch 语句
如果某一个 case 语句的后边没有 break语句,代码会继续往下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。

就比如上面的代码就执行了 case 2 中的语句。

所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了

来个练习

输入⼀个1~7的数字,打印对应的星期几
例如:
输入:1 输出:星期一
输入:2 输出:星期二
输入:3 输出:星期三
输入:4 输出:星期四
输入:5 输出:星期五
输入:6 输出:星期六
输入:7 输出:星期天

看看操作:

#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1printf("星期⼀\n");break;case 2:printf("星期⼆\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期天\n");break;}return 0;
}

如果需求发生变化,变为:

  1. 输⼊1~5,输出的是“工作日”;
  2. 输⼊6~7,输出“休息日”
    那参考代码如下:
#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;}return 0;
}

上面的练习中,我们发现应该根据实际的情况,来在代码中觉得是否使用 break ,或者在哪里使用break ,才能正确完成实际的需求。

5.3 switch语句中的default

在使用 switch 语句的时候,我们经常可能遇到⼀种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default 子句

switch (expression) {case value1: statementcase value2: statementdefault: statement
}

switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行default子句。
就比如前面做的打印星期的练习,如果 day 的输入不是1~7的值,如果我们要提示:输入错误,则可以这样完成代码:

#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;default:printf("输入错误\n");break;}return 0;
}

5.4 switch语句中的case和default的顺序问题

在 switch 语句中 case 子句和 default 子句有要求顺序吗? default 只能放在最后吗?
其实,

在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以

不过我们**通常是把 default 子句放在最后处理的**。

结尾

这一课的内容就到这里了,下节课继续学习C语言的循环
如果内容有什么问题的话欢迎指正,有什么问题也可以问我!
在这里插入图片描述

相关文章:

于交错的路径间:分支结构与逻辑判断的思维协奏

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节内容很多&#xff0c;文章字数达到了史无前例的一万一&#xff0c;我们要来学习分支与循环结构中…...

Linux之读者写者模型与特殊锁的学习

目录 读者写者模型 特殊锁 悲观锁 自旋锁 在前几期&#xff0c;我们学习了多线程的生产者和消费者模型&#xff0c;生产者和消费者模型中&#xff0c;有三种关系&#xff0c;两个角色&#xff0c;一个场所&#xff0c;那么读者写者模型和生产者消费者模型有什么关联吗&…...

回溯专题 记录

回溯的题目按照这套模板进行&#xff1b; 我感觉整体逻辑还是递归&#xff0c;只不过有了pop_back才是回溯概念&#xff1b; class Solution {public:vector<int> path;vector<vector<int>> ans;void backtracking(int n,int k,int startindex){if(path.…...

使用 Python 实现自动化办公(邮件、Excel)

目录 一、Python 自动化办公的准备工作 1.1 安装必要的库 1.2 设置邮件服务 二、邮件自动化处理 2.1 发送邮件 示例代码 注意事项 2.2 接收和读取邮件 示例代码 三、Excel 自动化处理 3.1 读取和写入 Excel 文件 示例代码 3.2 数据处理和分析 示例代码 四、综合…...

贪心算法笔记

贪心算法笔记 大概内容 贪心就是对于一个问题有很多个步骤,我们在每一个步骤中都选取最优的那一个,最后得出答案。就是在一些函数中可行,但是有些比如二次函数,因为它的转折点不一定最优,就是不可行的。那么如何判断贪心呢?有这么几种 看时间复杂度,一般的就是 O ( n…...

Formality:两种等价状态consistency和equality

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 背景 逻辑锥的等价性检查时&#xff0c;存在两种验证模式&#xff1a;一致(consistency)和等同(equality)&#xff0c;要理解这两点&#xff0c;首先得明白综合工具…...

Java Web开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…...

第30章 汇编语言--- 性能优化技巧

汇编语言是用于直接编程计算机硬件的低级语言&#xff0c;它几乎是一对一地映射到机器指令。因为汇编代码与特定处理器架构紧密相关&#xff0c;所以在讨论性能优化技巧时&#xff0c;通常需要考虑具体的CPU架构和指令集。 以下是一些通用的汇编语言性能优化技巧&#xff0c;并…...

HTB:Paper[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 对靶机进行子域…...

数据库中的 DDL、DML 和 DCL

数据库中的 DDL、DML 和 DCL 在数据库的定义与操作中&#xff0c;DDL、DML 和 DCL 是三个核心概念&#xff0c;分别用于不同层面的数据库管理与操作。 1. DDL&#xff08;Data Definition Language&#xff09; - 数据定义语言 定义 DDL 用于定义和管理数据库的结构或模式。…...

OKR 极简史及理解

大家读完觉得有帮助记得点赞和关注&#xff01;&#xff01;&#xff01; 目录 MBO SMART 和 KPI OKR 1. 什么是 OKR&#xff1f; 1.1 Objectives&#xff08;目标&#xff09; 1.2 Key Results&#xff08;关键成果&#xff09; KR 应当是困难的&#xff0c;但并非不可…...

电商项目-基于ElasticSearch实现商品搜索功能(四)

一、 高亮显示 1.1 高亮分析 高亮显示是指根据商品关键字搜索商品的时候&#xff0c;显示的页面对关键字给定了特殊样式&#xff0c;让它显示更加突出&#xff0c;如商品搜索中&#xff0c;关键字变成了红色&#xff0c;其实就是给定了红色样式。 1.2 高亮搜索实现步骤解析 …...

TCP封装数据帧

void *send_data(void *arg) //这是一个发送数据的线程 {int sockfd init_tcp_cli("192.168.0.148",50000) //传ip和port&#xff0c;port 50000是因为大概前五万都被其它服务所占用&#xff0c;50000后是私人ipif(sockfd < 0){return NULL;}unsigned char …...

数据结构与算法之二叉树: LeetCode 515. 在每个树行中找最大值 (Ts版)

在每个树行中找最大值 https://leetcode.cn/problems/find-largest-value-in-each-tree-row/description/ 描述 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值 示例1 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2 输入: root [1,2,3]…...

百度视频搜索架构演进

导读 随着信息技术的迅猛发展&#xff0c;搜索引擎作为人们获取信息的主要途径&#xff0c;其背后的技术架构也在不断演进。本文详细阐述了近年来视频搜索排序框架的重大变革&#xff0c;特别是在大模型技术需求驱动下&#xff0c;如何从传统的多阶段级联框架逐步演变为更加高…...

构造函数的原型原型链

代码示例 // 定义一个构造函数 Test function Test() {this.name 张三 }; //向构造函数的原型添加一个属性 age18 Test.prototype.age 18;//使用构造函数 Test 来实例化一个新对象 const test new Test();//向 Object.prototype 添加了一个名为 sex 的属性&#xff0c;其值…...

nginx反向代理及负载均衡

华子目录 nginx反向代理功能http反向代理反向代理配置参数proxy_pass的注意事项案例&#xff1a;反向代理单台后端服务器案例&#xff1a;反向代理实现动静分离案例&#xff1a;反向代理的缓存功能非缓存场景下测压准备缓存缓存场景下测压验证缓存文件 反向代理负载均衡&#x…...

单片机实物成品-011 火灾监测

火灾监测&#xff08;20个版本&#xff09; 版本20&#xff1a; oled显示温湿度烟雾浓度火焰传感器天然气浓度窗户风扇水泵排气系统声光报警语音播报按键WIFI模块 ----------------------------------------------------------------------------- https://www.bilibili.com…...

使用 Docker 在 Alpine Linux 下部署 Caddy 服务器

简介 在现代 web 开发中&#xff0c;选择合适的 web 服务器至关重要。Caddy 是一个功能强大的现代化 HTTP/2 服务器&#xff0c;支持自动 HTTPS&#xff0c;配置简单&#xff0c;适合开发和生产环境。Docker 则为我们提供了一种轻量级的容器化技术&#xff0c;使得应用程序的部…...

每日十题八股-2025年1月12日

1.为什么四次挥手之后要等2MSL? 2.服务端出现大量的timewait有哪些原因? 3.TCP和UDP区别是什么&#xff1f; 4.TCP为什么可靠传输 5.怎么用udp实现http&#xff1f; 6.tcp粘包怎么解决&#xff1f; 7.TCP的拥塞控制介绍一下&#xff1f; 8.描述一下打开百度首页后发生的网络过…...

Python中定位包含特定文本信息的元素

目录 一、为什么需要定位包含文本信息的元素 二、使用Selenium定位包含文本的元素 1. 使用find_element_by_link_text 2. 使用find_element_by_partial_link_text 3. 使用XPath定位包含文本的元素 4. 使用CSS选择器定位包含文本的元素 三、使用BeautifulSoup定位包含文本…...

uniapp实现H5页面内容居中与两边留白,打造类似微信公众号阅读体验

在 UniApp 中&#xff0c;由于需要兼容多端应用&#xff0c;我们通常使用 rpx 作为尺寸单位。然而&#xff0c;在某些情况下&#xff0c;如需要实现内容居中且两边留白时&#xff0c;直接使用 rpx 可能会带来一些限制。这时&#xff0c;我们可以考虑使用 px 或 rem 等单位&…...

极品飞车6里的赛道简介

极品飞车里有很多赛道,赛道分为前向赛道Forward、后向赛道Backward。前向赛道Forward是从A点到B点;后向赛道Backward是前向赛道的逆过程,即从B点到A点。这里介绍极品飞车6的赛道长度、中英文名称翻译、难度等级。 序号赛道英文名赛道中文名总长(km)急弯难度等级1Alpine Trai…...

SAP推出云端ERP解决方案,加速零售行业数字化转型

2025年1月9日&#xff0c;SAP发布了一款专为零售行业设计的云端ERP行业解决方案——S/4HANA Cloud Public Edition&#xff0c;进一步推动企业向云端迁移。这款解决方案旨在集中运营数据&#xff0c;整合财务、采购和商品管理流程&#xff0c;以帮助零售企业优化运营效率。 核…...

Python爬虫进阶——案例:模拟bilibili登录)

主要内容&#xff1a;模拟bilibili账号密码登录&#xff0c;不要实现的的实现功能是单击登录按钮&#xff0c;切换登录方式&#xff0c; 输入账号和密码&#xff0c;然后完成图片点击验证&#xff0c;最后单击立即登录按钮。 1、第一步&#xff1a;通过selenium模块访问bilibi…...

什么是数据分析?

什么是数据分析&#xff1f; 数据分析&#xff08;Data Analysis&#xff09;是指通过对数据进行收集、整理、处理、建模和解读&#xff0c;以揭示数据中的有用信息、支持决策和解决实际问题的过程。它是一门将数据转化为知识的学科&#xff0c;广泛应用于商业、科学研究、医疗…...

基于springboot的课程作业管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的课程作业管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 可以管理首页、个人中心…...

多线程之旅:属性及其基本操作

上次分享到了&#xff0c;多线程中是是如何创建的&#xff0c;那么接下来&#xff0c;小编继续分享下多线程的相关知识。 多线程中的一些基本属性。 基本属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台线程isDemo()是否存活isAlive()是…...

数据表中的数据插入、更新和删除

文章目录 一、表的插入二、更新表中的数据记录三、删除表中的数据记录 一、表的插入 插入数据记录是常见的数据操作&#xff0c;可以显示向表中增加的新的数据记录。在MySQL中可以通过“INSERT INTO”语句来实现插入数据记录&#xff0c;该SQL语句可以通过如下4种方式使用&…...

Q_OBJECT宏报错的问题

在Qt中继承QObject&#xff0c;并且加上Q_OBJECT宏&#xff0c;有时候会报错&#xff0c;比如我的错误&#xff1a; error: debug/httpmgr.o:httpmgr.cpp:(.rdata$.refptr._ZTV7HttpMgr[.refptr._ZTV7HttpMgr]0x0): undefined reference to vtable for HttpMgr 意思是没有虚…...

提供微网站制作多少钱/网店运营公司

函数原型: void glClear(GLbitfield mask); 参数说明&#xff1a; GLbitfield&#xff1a;可以使用 | 运算符组合不同的缓冲标志位&#xff0c;表明需要清除的缓冲&#xff0c;例如glClear&#xff08;GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT&#xff09;表示要清除颜色缓…...

wordpress建站解析/抖音seo排名系统哪个好用

2019独角兽企业重金招聘Python工程师标准>>> Cesium入门11 - Interactivity - 交互性 Cesium中文网&#xff1a;http://cesiumcn.org/ | 国内快速访问&#xff1a;http://cesium.coinidea.com/ 最后&#xff0c;让我们添加一些鼠标交互。为了提高我们的geocache标记…...

龙岩长汀最新疫情/神马seo教程

怎么把本地项目推送到GitHub或者码云线上呢&#xff1f;来来回回错了很多次&#xff0c;终于总结了正确的步骤。首先注册好github账号&#xff0c;或者码云账号。1.然后建一个自己的本地仓&#xff0c;你可以直接右击新建文件夹&#xff0c;也可以右击打开Git bash命令行窗口通…...

安庆做网站/网络营销有什么方式

一、BeautifulSoup库简介BeautifulSoup是一个灵活方便的网页解析库&#xff0c;处理搞笑&#xff0c;支持多种解析器。利用它可以不用编写正则表达式就可以方便的实现网页信息的抓取。BeautifulSoup是爬虫必学技能&#xff0c;其最主要的功能是从网页抓取数据。BeautifulSoup自…...

儋州网站建设/网站流量分析

mac系统 1、清除npm缓存&#xff0c;执行命令 npm cache clean -f2、n模块是专门用来管理nodejs的版本&#xff0c;安装n模块 npm install -g n3、更新升级node版本 n stable // 把当前系统的 Node 更新成最新的 “稳定版本”n lts // 长期支持版n latest // 最新版n 10.14.2…...

阿里巴巴网站被关闭了要怎么做/最新的域名网站

如何使用Oracle来判断字段是否为数字&#xff1f;在我们平常的开发中可能会遇到这样的问题&#xff0c;就是判断某一列是否全部由数字组成&#xff0c;我们都知道oracle并没有给我们提供这样一个现成的函数&#xff0c;那么根据我的经验我总结了两个行之有效的方法(列名&#x…...