Go语言学习Day3:数据类型、运算符与流程控制

名人说:莫愁千里路,自有到来风。 ——钱珝
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

      • 1、数据类型
        • ①布尔类型
        • ②整型
        • ③浮点型
        • ④string
        • ⑤类型转换
      • 2、运算符
        • ①算术运算符
        • ②逻辑运算符
        • ③关系运算符
        • ④位运算符
        • ⑤赋值运算符
        • ⑥其它运算符
      • 3、流程控制
        • ①if(选择)
        • ②switch(选择)
        • ③for(循环)
        • ④break & continue
      • 4、总结

1、数据类型

①布尔类型

bool,表示逻辑值,可以是truefalse,例如一道判断读错的题,对就打√,错则写×,而这里的√就是true,×其实就是false,计算机里也一样,二进制,用0、1来代表对错,开关。

var isRight bool = true
if isRight {
    fmt.Println("正确")
} else {
    fmt.Println("错误")
}

案例:布尔型

//创作者:Code_流苏(CSDN)
package main

import "fmt"

func main() {
	//var 变量名 数据类型
	//bool: true false
	//bool 默认值为false
	var isFlag bool = true
	var isFlag2 bool = false
	fmt.Println(isFlag)

	//%T 用于输出一个值的类型
	//%t 用于格式化布尔值 如果有一个布尔型变量 b,使用 fmt.Printf("%t", b) 会输出 b 的值为 true 或 false。
	fmt.Printf("%T,%t\n", isFlag, isFlag)
	fmt.Printf("%T,%t\n", isFlag2, isFlag2)
}

image-20240326144134286

②整型

整型包括intint8int16int32int64以及它们的无符号版本uintuint8uint16uint32uint64。其中没有明确大小的intuint的大小依赖于执行程序的操作系统。

咱们常用的主要是int,例如一个人的年龄,年龄多大,这个数一般就是整型,整数:

var age int = 18
fmt.Println("年龄:", age)
③浮点型

float32float64,分别对应IEEE 754标准的单精度和双精度浮点数,这两个是咱们日后学习中常用的。

例如,咱们日常生活中常常会谈及身高问题,而身高按米来算的话往往就会涉及小数部分,此时就可以使用浮点数来进行这些数据的处理。

var height float64 = 1.75
fmt.Println("身高:", height)

案例:整型与浮点型。

package main

import "fmt"

func main() {
	//定义一个整型
	//byte uint8
	//rune int32
	//int int64
	var age int = -200
	fmt.Printf("%T,%d\n", age, age)

	//定义一个浮点型
	//默认是6位小数打印 3.140000
	var money float64 = 3.19
	fmt.Printf("%T,%.1f\n", money, money)

	var num1 float32 = -123.0000901
	var num2 float64 = -123.0000901
	fmt.Println("num1 = ", num1, "num2 = ", num2)
}

image-20240326144642188

④string

string,表示文本数据,相当于C++、Java里面的字符串类型。

案例:string类型。

package main

import "fmt"

func main() {
	var str string
	str = "Hello,yueliusu"
	fmt.Printf("%T,%s\n", str, str)

	// 单引号 字符,整型-ASCII字符码
	v1 := 'A'
	v2 := "A"

	//编码表 ASCII码表
	//扩展:
	//所有的中国字的编码表:GBK
	//全世界的编码表:Unicode

	fmt.Printf("%T,%d\n", v1, v1) //int32,65
	fmt.Printf("%T,%s\n", v2, v2)

	//字符串连接 +
	fmt.Println("hello" + ",liusu")

	//转义字符\
	fmt.Println("hello\"liusu")
	fmt.Println("hello\nliusu") // n 换行符
	fmt.Println("hello\tliusu") // t制表符
}

image-20240326153058245

⑤类型转换

Go语言中要求显式的类型转换,使用形式如T(v)将值v转换为类型T,也就是你如果要转换类型,要给出指定的类型然后加()来转换。例如,将int类型的数据转换成float64类型。

var integer int = 10
var floatNumber float64 = float64(integer)
fmt.Println("转换后的浮点数:", floatNumber)

案例:int与float64之间的类型转换。

package main

import "fmt"

func main() {

	a := 3   //int
	b := 5.0 //float64

	//需求:将int类型的a转换为float64类型 类型转换
	c := float64(a)
	d := int(b)

	//整型是不能转化为bool类型的
	//e := bool(a)

	fmt.Printf("%T\n", a)
	fmt.Printf("%T\n", b)
	fmt.Printf("%T\n", c)
	fmt.Printf("%T\n", d)
}

image-20240326153116694

需要注意的是,有些类型是不能相互转换的。

2、运算符

①算术运算符

算术运算符就是咱们日常所见到的加减乘除等 ,用符号表示就是:+-*/%等。

例如,5加2等于几?

fmt.Println("5 + 2 =", 5+2) //5 + 2 = 7

案例:算术运算

package main

import "fmt"

func main() {
	var a int = 10
	var b int = 3

	//算术运算符:+ - * / % ++ --
	fmt.Println(a + b)
	fmt.Println(a - b)
	fmt.Println(a * b)
	fmt.Println(a % b)
	a++            // a++ 等同于 a = a + 1
	fmt.Println(a) // 10 + 1 = 11
	a--            //a-- 等同于 a = a - 1
	fmt.Println(a) // 11 - 1 = 10
	a = 100
	a--
	fmt.Println(a) // 100 - 1 = 99
}

image-20240326155709260

②逻辑运算符

逻辑运算符,顾名思义,重在思维逻辑,与或非,对应符号与表达:&&(AND)、||(OR)、!(NOT),与的意思就是只有大家一起努力,这个项目才能完成,非的意思是,这个项目只要有人能完成,不论多少人,这个项目就是完成,非的意思就很明显了,非真即假。

例如,true与false

fmt.Println("true && false =", true && false) //false

案例:逻辑运算

package main

func main() {
	var a bool = false
	var b bool = true
	//逻辑与&& 同时为真
	println(a && b)
	//逻辑或|| 一个为真就成立
	println(a || b)
	//逻辑非,真为假,假为真
	println(!a)
}

image-20240326160218259

③关系运算符

关系运算符,重点在关系,既然涉及到关系,必然涉及的多者,比如1与2,张三与李四,男生与女生等等,常用的关系运算符有:==!=<<=>>=

例如,比较5与2的大小。

fmt.Println("5 > 2 =", 5 > 2) //true

案例:11与10关系运算

package main

import "fmt"

func main() {
    var a int = 11
    var b int = 10

    //关系运算符 == != > < >= <=
    fmt.Println(a == b) //false
    fmt.Println(a != b) //true
    fmt.Println(a < b)  //false
    fmt.Println(a > b)	//true
    fmt.Println(a >= b)	//true
    fmt.Println(a <= b) //false

}

image-20240326161156051

④位运算符

通过学习计组、操作系统,我们可以知道位运算是什么,因为计算机存储数据就是用的二进制01代码,而常说的一个二进制位,就是这里的位,位运算,也就是操控这些来进行的计算。对应的位运算符有:&(与 AND)、|(或 OR)、^(异或 XOR)、<<(左移)、>>(右移)。

详细来看,Go 语言支持的位运算符如下表所示。例如 A 为60,B 为13:

运算符描述实例
&按位与运算符"&"是双目运算符。都是1结果为1,否则是0(A & B) 结果为 12, 二进制为 0000 1100
|按位或运算符"|"是双目运算符。 都是0结果为0,否是是1(A | B) 结果为 61, 二进制为 0011 1101
^按位异或运算符"^"是双目运算符。 不同则为1,相同为0(A ^ B) 结果为 49, 二进制为 0011 0001
&^位清空,a &^ b,对于b上的每个数值,如果为0,则取a对应位上的数值,如果为1,则取0.(A &^ B) 结果为 48, 二进制为 0011 0000
<<左移运算符"<<“是双目运算符。左移n位就是乘以2的n次方。 其功能把”<<“左边的运算数的各二进位全部左移若干位,由”<<"右边的数指定移动的位数,高位丢弃,低位补0。A << 2 结果为 240 ,二进制为 1111 0000
>>右移运算符">>“是双目运算符。右移n位就是除以2的n次方。 其功能是把”>>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数。A >> 2 结果为 15 ,二进制为 0000 1111

又如5与2:

fmt.Println("5 & 2 =", 5&2) //0,解释:5的4位二进制为0101,2的4位2进制位0010,两者做&运算,结果为0000,也就是0。

案例:位运算

package main

import "fmt"

func main() {
    //60的二进制 0011 1100
    var a uint = 60
    //13的二进制 0000 1101
    var b uint = 13
    //位运算
    var c uint = 0
    //按位与 & 同1则1,其余为0
    c = a & b
    //0011 1100
    //0000 1101
    //0000 1100 = 12
    fmt.Printf("%d,二进制形式为:%b \n", c, c)
    //按位或 | 同0则0,其余为1
    c = a | b
    //0011 1100
    //0000 1101
    //0011 1101 = 61
    fmt.Printf("%d,二进制形式为:%b \n", c, c)
    //按位异或 ^ 不同为1,相同为0
    c = a ^ b
    fmt.Printf("%d,二进制形式为:%b \n", c, c)
    //按位清空 &^ 对于b上的每位数值,若为0,则取a对应位上的数值,若为1,则取0
    c = a &^ b
    fmt.Printf("%d,二进制形式为:%b \n", c, c)
    //左移运算符 << 为双目运算符,左移n位就是乘以2的n次方
    c = a << 2
    fmt.Printf("%d,二进制形式为:%b \n", c, c)
    //右移运算符 >> 为双目运算符,右移n位就是除以2的n次方
    c = a >> 2
    fmt.Printf("%d,二进制形式为:%b \n", c, c)
}

image-20240326161756402

⑤赋值运算符

赋值运算符,类似于超市里有很多商品,需要赋予这些商品价值,而价值也可以通过价格来体现,价格就看做所赋予的值。赋值运算符常见的有:=+=-=*=/=等。

运算符描述实例
=简单的赋值运算符,将一个表达式的值赋给一个左值C = A + B 将 A + B 表达式结果赋值给 C
+=相加后再赋值C += A 等于 C = C + A
-=相减后再赋值C -= A 等于 C = C - A
*=相乘后再赋值C *= A 等于 C = C * A
/=相除后再赋值C /= A 等于 C = C / A
%=求余后再赋值C %= A 等于 C = C % A
<<=左移后赋值C <<= 2 等于 C = C << 2
>>=右移后赋值C >>= 2 等于 C = C >> 2
&=按位与后赋值C &= 2 等于 C = C & 2
^=按位异或后赋值C ^= 2 等于 C = C ^ 2
|=按位或后赋值C |= 2 等于 C = C | 2

例如,10+5

var a int = 10
a += 5
fmt.Println("a =", a) //15

案例:赋值运算

package main

import "fmt"

func main() {
	var a int = 21
	var c int
	// 赋值运算符"=" 将等号右边的值 赋值给左边
	c = a
	fmt.Printf("第1行:= c的值为:%d\n", c)
	c += a
	fmt.Printf("第2行:+= c的值为:%d\n", c)
	c -= a
	fmt.Printf("第3行:-= c的值为:%d\n", c)
	c *= a
	fmt.Printf("第4行:*= c的值为:%d\n", c)
	c /= a
	fmt.Printf("第5行:/= c的值为:%d\n", c)

	c = 200

	c <<= 2
	fmt.Printf("第6行:<<= c的值为:%d\n", c)

	c >>= 2
	fmt.Printf("第7行:>>= c的值为:%d\n", c)

	c &= 2
	fmt.Printf("第8行:&= c的值为:%d\n", c)

	c ^= 2
	fmt.Printf("第9行:^= c的值为:%d\n", c)

	c |= 2
	fmt.Printf("第10行:|= c的值为:%d\n", c)
}

image-20240326162144099

⑥其它运算符

其它运算符还有用于指针的&(取地址)和*(指针解引用)等。

运算符描述实例
&返回变量存储地址&a; 将给出变量的实际地址。
*指针变量。*a; 是一个指针变量

案例:& 与 *

package main

import "fmt"

func main() {
	var a int = 4
	var b int32
	var c float32
	var ptr *int
	//& 返回变量存储地址 例如:&a; 取的是变量的实际地址
	//* 指针变量 例如:*a; a是一个指针变量
	/* 运算符实例 */
	fmt.Printf("1、a的变量类型为 %T \n", a)
	fmt.Printf("2、b的变量类型为 %T \n", b)
	fmt.Printf("3、c的变量类型为 %T \n", c)

	/* & 和 * 运算符实例 */
	ptr = &a /* 'ptr'接收了变量a的地址*/
	fmt.Printf("a的值为:%d\n", a)
	fmt.Printf("ptr的值为 %p\n", ptr)
	fmt.Printf("*ptr为%d\n", *ptr)
}

image-20240326162256760

3、流程控制

常见的结构主要有三种,顺序、选择、循环结构。如:

package main

func main() {
    //1、顺序结构:从上到下,逐行执行,默认逻辑

    //2、选择结构:条件满足某些代码才会执行 (满足某些条件)
    //if
    //switch
    //select 后面channel再讲

    //3、循环结构:条件满足某些代码被反复执行0到n次
    //for
}

顺序结构,咱们平时写代码、写作等顺序往往就是顺序结构,一个接着一个来,此处不再多讲,重点叙述一下选择结构和循环结构。

①if(选择)

基本的条件分支语句,可以使用elseelse if来扩展。

  • if
if score >= 90 {
    fmt.Println("A")
} 
  • if … else
if age := 18; age >= 18 {
    fmt.Println("成年")
} else {
    fmt.Println("未成年")
}
  • if … else if

案例1:分数评级

package main

import "fmt"

// if 如果 else if 否则如果 else否则
func main() {
	//var a int = 15
	//
	//if a > 20 {
	//	fmt.Println("a>20")
	//}
	//if a > 10 {
	//	fmt.Println("a>10")
	//}
	var score int

	println("请输入分数:")
	fmt.Scanf("%d", &score)
	//评级 A B C D E
	if score >= 90 && score <= 100 {
		fmt.Println("A")
	} else if score >= 80 && score < 90 {
		fmt.Println("B")
	} else if score >= 78 && score < 80 {
		fmt.Println("C")
	} else if score >= 60 && score < 70 {
		fmt.Println("D")
	} else {
		fmt.Println("E")
	}
}

image-20240326163311622

案例2:if嵌套,登录判断

//创作者:Code_流苏(CSDN)
package main

import "fmt"

func main() {
	var a, b int
	var pwd int = 20221020
	//用户的输入
	fmt.Print("请输入密码:")
	fmt.Scan(&a)
	//业务:验证密码是否正确
	if a == pwd {
		fmt.Print("请再次输入密码:")
		fmt.Scan(&b)
		if b == pwd {
			fmt.Println("登录成功")
		} else {
			fmt.Println("登录失败,账户已锁定")
		}
	} else {
		fmt.Println("登录失败,密码错误")
	}
}

image-20240326163436720

②switch(选择)

用于基于不同的条件执行不同的代码块。Go的switch比其他语言更为灵活,表达式不必为常量或整数。

例如,星期几

dayOfWeek := 3
switch dayOfWeek {
case 1:
    fmt.Println("星期一")
case 2:
    fmt.Println("星期二")
default:
    fmt.Println("其他天")
}

案例1:成绩评级

package main

import "fmt"

func main() {
	var score int
	fmt.Scanf("%d", &score)
	//Switch匹配 case
	switch score {
	case 90:
		fmt.Println("A")
	case 80:
		fmt.Println("B")
	case 50, 60, 70:
		fmt.Println("C")
	default:
		fmt.Println("D")
	}
}

image-20240326163625153

案例2:fallthrough关键字

如果在 case 的代码块中使用了 fallthrough 关键字,即使这个 case 匹配成功,程序也会继续执行下一个 case 的代码块

package main

import "fmt"

// 如果在 case 的代码块中使用了 fallthrough 关键字,
// 即使这个 case 匹配成功,程序也会继续执行下一个 case 的代码块。
func main() {
	var num int = 1
	switch num {
	case 1:
		fmt.Println("one")
		fallthrough
	case 2:
		fmt.Println("two")
	case 3:
		fmt.Println("three")
	default:
		fmt.Println("other number")
	}
}

image-20240326163912244

③for(循环)

Go语言中唯一的循环结构,可以用来实现传统的for循环、while循环(通过for实现)、无限循环(省略循环条件)。

例如,输出循环次数

for i := 0; i < 5; i++ {
    fmt.Println("循环次数:", i)
}

案例:计算1到100的和

package main

func main() {
	//for 条件的起始值:循环条件:控制变量自增或者自减
	//如果是全部省略,for {}的形式,循环将会因为没有条件的限制而一直进行下去
	sum := 0
	//计算1到100的和
	for i := 1; i <= 100; i++ {
		sum = sum + i
	}
	println(sum)
}

image-20240326164018090

案例2:打印5*5方阵

package main

import "fmt"

/*打印一个5×5的*方阵
*****
*****
*****
*****
*****
 */
func main() {
	for i := 0; i < 5; i++ {
		for j := 0; j < 5; j++ {
			fmt.Print("*")
		}
		fmt.Print("\n")
	}
}

image-20240326164201381

案例3:打印9*9乘法表

package main

import "fmt"

// 目标:使用for循环打印99乘法表
func main() {
    // j 1 2 3
    for i := 1; i <= 9; i++ {
       for j := 1; j <= i; j++ {
          fmt.Printf("%d*%d=%d\t", j, i, i*j)
       }
       println()
    }
}

image-20240326164322295

④break & continue

break用于中断当前循环,continue用于跳过当前循环的剩余代码,直接开始下一次循环迭代。

例如,输出1到5之间的奇数。

for i := 0; i < 10; i++ {
    if i == 5 {
        break // 中断循环
    }
    if i%2 == 0 {
        continue // 跳过本次循环迭代
    }
    fmt.Println("奇数:", i)
}

案例:break & continue

//创作者:Code_流苏(CSDN)
package main

import "fmt"

func main() {
	//break 结束当前整个循环
	for i := 1; i <= 10; i++ {
		if i == 5 {
			break
		}
		fmt.Println(i)
	}
	println("break内容结束")
	//continue 结束单次循环
	for i := 1; i <= 10; i++ {
		if i == 5 {
			continue
		}
		fmt.Println(i)
	}
	println("continue内容结束")
}

image-20240326164428307

综上来看,Go语言的简洁性,一部分就体现在它的流程控制语句中:没有dowhile循环,switch比许多其他语言更加强大且灵活。

4、总结

分支结构

  • if

  • if … else if

  • if … else

  • if … else if … else if … else if… else

  • swtich - case

  • swtich - case - fallthrough

  • swtich - case - default

循环

  • for init;end;post {}
  • for { } 死循环
  • break
  • continue
  • for循环的嵌套使用。

很感谢你能看到这里,如有相关疑问,还请下方评论留言。
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
希望本篇内容能对大家有所帮助,如果大家喜欢的话,请动动手点个赞和关注吧,非常感谢你们的支持!

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

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

相关文章

FPGA内部资源介绍(1)-逻辑资源块

近期有许多小伙伴私信小编&#xff0c;希望小编出一些FPGA基础知识&#xff0c;能对FPGA有初步的认识。小编立马奋笔疾书&#xff0c;熬夜整理了一些学习FPGA必备的基础知识&#xff0c;双手呈上~~&#xff0c;每天一个干货&#xff0c;一星期带你入门FPGA&#xff01; 敲黑板…

如何查询电脑是否被锁定了IP地址?锁定IP会出现什么问题?

前言 电脑刚到手的时候&#xff0c;基本上是通过路由器DHCP进行IP分配的。路由器DHCP分配IP给电脑的好处是网络不会出现IP冲突&#xff0c;网络能正常使用。 有些电脑可能在DHCP自动获取IP时出现错误&#xff0c;所以小伙伴就会通过手动设置IP让电脑可以正常上网。 这样的操…

springboot企业级抽奖项目业务四(缓存预热)

缓存预热 为什么要做预热: 当活动真正开始时&#xff0c;需要超高的并发访问活动相关信息 必须把必要的数据提前加载进redis 预热的策略: 在msg中写一个定时任务 每分钟扫描一遍card_game表 把(开始时间 > 当前时间)&& (开始时间 < 当前时间1分钟)的活动及相…

扫描电子显微镜如何对焦

扫描电子显微镜&#xff08;SEM&#xff09;的对焦过程是确保获得清晰、高分辨率图像的关键步骤。与传统光学显微镜相比&#xff0c;SEM使用电子束来照射样品&#xff0c;并通过检测样品发射的二次电子或背散射电子来生成图像。因此&#xff0c;对焦方法和原理也有所不同。以下…

模板设计模式经典案例

模板设计模式讲究的是将不变的设置为基类&#xff0c;将变的设置为虚函数来让子类实现。下面就以这样的写下模板设计模式的例子。 例子场景 一个工程步骤分为step1,step2&#xff0c;其中step1由总工程指定&#xff0c;step2由子工程指定&#xff0c;最后由一个函数串起来&am…

python 蓝桥杯之枚举、尺取法

文章目录 幸运数字组合型枚举排列型枚举python 排列函数子集尺取法 幸运数字 对于该题的思路&#xff1a;我们可以采用直接暴力枚举的方法 幸运数字就是 3 i 3^i 3i 5 j 5^j 5j 7 k 7^k 7k 的形式&#xff0c;那么我们就确定一个终极范围&#xff0c;直接用三层循环来遍历即可…

ruoyi-nbcio-plus基于vue3的flowable任务切换的主文件ElementTask.vue的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Linux:Jenkins全自动持续集成持续部署(4)

在上一章部署好了之后&#xff0c;还需要点击一下才能进行部署&#xff0c;本章的效果是&#xff1a;当gitlab上的代码发生了变化后&#xff0c;我们不需要做任何事情不需要去点击构建按钮&#xff0c;Jenkins直接自动检测变化&#xff0c;然后自动去集成部署Linux&#xff1a;…

vue3路由代码示例

路由简单分三步吧 第一定义路由&#xff1a; 包括访问地址&#xff0c;对应组件 第二使用&#xff1a;在index.html中使用它 下面是代码示例&#xff1a; components/Person.vue <template><router-link to"/test/hello">跳转</router-link>&…

RocketMQ学习笔记:分布式事务

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、分布式事务的难题2、解决方式2.1、半事务消息和事务回查2.2、代码样例2.2.1、TransactionListener2.2.2、TransactionMQProducer2.2.3、MessageListenerConcurrently2.2.4、流程图 1、分布…

浅谈双亲委派模型

本文浅析了双亲委派的基本概念、实现原理、和自定义类加载器的正确姿势。 对于更细致的加载loading过程、初始化initialization顺序等问题&#xff0c;文中暂不涉及&#xff0c;后面整理笔记时有相应的文章。 JDK版本&#xff1a;oracle java 1.8.0_102 基本概念 定义 双亲委…

智慧城市解决方案大全:标准规范顶层设计指南、整体解决方案、厂商售前宣讲PPT、招投标、智慧城市白皮书等全套680份,一次性打包下载

关键词&#xff1a;智慧城市&#xff0c;智慧城市解决方案&#xff0c;智慧城市发展的前景与趋势&#xff0c;智慧城市概念主力流出&#xff0c;智慧城市项目包括哪些方面&#xff0c;智慧城市项目方案&#xff0c;智慧城市宣传片&#xff0c;智慧城市白皮书&#xff0c;智慧城…

Linux如何将桌面版转为mini版-解决中文字体变为英文字体

中文字体转为英文字体 我们进入Rocky-Linux后&#xff0c;ls或者打开文件夹发现有中文 我们执行命令 sudo localedef -i en_US -f UTF-8 en_US.UTF-8将其转为英文&#xff0c;并且重启机器 此时中文转化为英文 桌面版linux转为MINN版 1. 我们可以卸载桌面版 sudo dnf gr…

c++ 跳转搜索(Jump Search)

与二分搜索一样&#xff0c;跳转搜索是一种针对排序数组的搜索算法。基本思想是通过按固定步骤向前跳跃或跳过某些元素来代替搜索所有元素来检查更少的元素&#xff08;比线性搜索&#xff09;。例如&#xff0c;假设我们有一个大小为 n 的数组 arr[] 和一个大小为 m 的块&…

PEReDi 完全隐私的央行数字货币方案

第一个对完全隐私保护建模的方案&#xff0c;基于账户模型&#xff0c;要求交易双方都在线。 角色分类 中央银行 B B B&#xff1a;负责发行数字货币和货币政策&#xff0c;但不控制用户账户的状态&#xff0c;没有能力对交易的发送者或接收者进行去匿名化或披露与特定交易相…

数据结构-队列-005

1链式队列 运行结果如下&#xff1a; 1.1链式队列结点定义 /*自定义一个数据类型*/ typedef struct student {char name[32];char sex;int age; }DATA_TYPE;/*定义一个链式队列结点*/ typedef struct link_queue_node {DATA_TYPE data;//数据域struct link_queue_node *pne…

SpringBoot和SpringCloud面试题

1、SpringBoot 1.1 和Spring对比 1.2 SpringBoot自动装配 springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类&#xff0c;并生成相应的Bean对象&#xff0c;然后将它们交给spring容器来帮我们进行管理 原理 SpringBootApplicatio…

BUUCTF-Misc13

[ACTF新生赛2020]outguess1 1.打开附件 2.outguess outguess -k "abc" -r mmm.jpg flag.txt “-k “abc”” 表示使用密码 “abc” 进行解密&#xff1b; “-r” 表示提取信息的操作&#xff1b; “mmm.jpg” 是包含隐藏信息的源图像文件&#xff1b; “flag.txt” …

共用体详解

1 共用体的概念 有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中(见图11.24)。以上3个变量在内存中占的字节数不同,但都从同一地址开始(图中设地址为1000)存放。也就是使用覆盖技术…

“数据持久化”和“缓存与数据库不一致”到底有什么区别?

之前&#xff0c;我一直把“数据持久化”和“缓存与数据库不一致问题”给搞混了。我当时复习的时候基本上就没有思考&#xff0c;就是纯背诵&#xff0c;数据持久化是什么&#xff0c;数据持久化有两种方式&#xff0c;这两种方式特点是什么&#xff0c;然后巴拉巴拉一堆。缓存…