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

C总结(C语言知识点,深化重难点)

C语言

  • 1.使用C语言的7个步骤
  • 2.ASCII码
  • 3.提高程序可读性的机巧
  • 4.如何使用多种整形
  • 5.打印多种整形
  • 6.课移植类型:stdint.h和inttypes.h
  • 7.浮点数常量
  • 8.浮点值的上溢和下溢
  • 9.使用数据类型
  • 11.常量和C预处理器
  • 12.转换说明的意义
    • 12.1转换不匹配
    • 13.副作用和序列点
    • 14.数组简介
  • 15.ctype.h系列的字符函数
  • 16.缓冲区
  • 17.文件结尾
  • 18.重定向
  • 19.创建更友好的用户界面
    • 19.1 使用缓冲输入
    • 19.2混合数值和字符输入
    • 19.3输入验证
    • 19.4 菜单浏览
  • 20.函数
    • 20.1 形参的创建
    • 20.2 黑盒视角
  • 21.编译多源代码文件的程序
  • 22.指定初始化器(C99)
  • 23.声明数组形参
  • 23.指针的兼容性
  • 24.复合字面量
  • 25.数组和指针
  • 26.字符串数组
  • 28.fgets()函数(和fputs())
  • 29.命令行参数
  • 30.结构体
  • 31.存储类别、链接和内存管理
    • 31.1作用域
    • 31.2 链接
    • 31.3 存储期
      • 31.3.1 自动变量
      • 31.3.2 寄存器变量
  • 32 ANSI C类型限定符
    • 32.1 volatile限定符
    • 32.2 restrict限定符
    • 32.3_Atomic类型限定符(C11)
    • 32.4 旧关键字的新位置
    • 33.结构体
    • 34.位操作
  • 35 其他

1.使用C语言的7个步骤

定义程序目标
思考你的程序需要哪些信息,要进行哪些计算和控制,以及程序应该要报告什么信息

设计程序
如何用程序来完成它,列如用户界面是怎样的?如何组织程序?目标用户是谁?准备花多少时间来完成这个程序?
除此之外还要决定在程序中如何表示数据,以及用什么方法处理数据

编写代码
编译

运行程序

测试和调试程序

维护和修改代码

在这里插入图片描述

2.ASCII码

在这里插入图片描述

• 字符A~ Z的ASCII码值从65~90
• 字符a~ z的ASCII码值从97~122
• 对应的大小写字符(a和A)的ASCII码值的差值是32
• 数字字符0~9的ASCII码值从48 ~ 57
• 换⾏ \n 的ASCII值是:10
• 在这些字符中ASCII码值从0~31这32个字符是不可打印字符,⽆法打印在屏幕上观察


3.提高程序可读性的机巧

  • 选择有意义的函数名和写注释
  • 用空行分割概念上的多个部分
  • 每条语句各占一行(尽管这不是C语言要求的)

9.2.4 赋值忽略符
有时,⽤⼾的输⼊可能不符合预定的格式。
为了避免这种情况, scanf() 提供了⼀个赋值忽略符 * 。
只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
scanf(“%d%*c%d%*c%d”, &year, &month, &day);
%*c 就是在占位符的百分号后⾯,加⼊了赋值忽略符 * ,表⽰这个占位符没有对应的变量,解读后不必返回

#pragma pack(1)修改默认对其数

4.如何使用多种整形

对于需要32位的整数选择long而不是int

对于需要16位的整数选择int而不是short


整数溢出
如果整数超出了相应类型的取值范围会怎样?C标准并未定义有符号类型的溢出规则,以下是比较有代表性的行为,但是也可能出现其他情况

在这里插入图片描述

有符号整数直接跳到了最小值,无符号整数则是直接截断


5.打印多种整形

C语言提供了丰富的转换类型,要需要可以直接查表。

使用错误的转换说明会得到意想不到的结果,如无符号值3000000000和-129496296在系统内存中的内部完全相同


4.3 位段的跨平台问题
1.int位段被当成有符号数还是⽆符号数是不确定的。
2. 位段中最⼤位的数⽬不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会
出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配,标准尚未定义。
4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃
剩余的位还是利⽤,这是不确定的。
总结:
跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。

在这里插入图片描述

7.1 被错误使⽤的 feof
牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。
feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

  1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
    例如:
    • fgetc 判断是否为 EOF .
    • fgets 判断返回值是否为 NULL .

  2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
    例如:
    • fread判断返回值是否⼩于实际要读的个数。

  3. #和##
    7.1 #运算符
    #运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带参数的宏的替换列表中。
    #运算符所执⾏的操作可以理解为”字符串化“。
    当我们有⼀个变量 int a = 10; 的时候,我们想打印出: the value of a is 10 .
    就可以写:
    1 #define PRINT(n) printf(“the value of “#n " is %d”, n);
    当我们按照下⾯的⽅式调⽤的时候:
    PRINT(a);//当我们把a替换到宏的体内时,就出现了#a,⽽#a就是转换为"a”,时⼀个字符串

printf("the value of ““a” " is %d”, a)

  1. 命令⾏定义
    许多C的编译器提供了⼀种能⼒,允许在命令⾏中定义符号。⽤于启动编译过程。
    例如:当我们根据同⼀个源⽂件要编译出⼀个程序的不同版本的时候,这个特性有点⽤处。(假定某
    个程序中声明了⼀个某个⻓度的数组,如果机器内存有限,我们需要⼀个很⼩的数组,但是另外⼀个
    机器内存⼤些,我们需要⼀个数组能够⼤些。)

//linux 环境演⽰
gcc -D ARRAY_SIZE=10 programe.c

6.课移植类型:stdint.h和inttypes.h

C语言提供了许多有用的整数类型。但是在不同系统下某些类型名的功能不一样,这些新的类型吗定义在stdint.h头文件中

例如,int32_t表示32位的有符号整数类型,在32位系统下会将int32_t作为int的别名

当然以上都是精确宽度整数类型,C99和C11提供了张宇轩宽度类型如int_least8_t是可容纳8位有符号整数值的类型中宽度最小的类型的一个别名(sizeof(类型)>=8),此外还定义了最大整数类型,可以自己去了解一下,同时为了针对不同平台下要打印相同类型提供了一系列字符串宏,如inttypes.h定义了PRId32字符串宏

#include <stdio.h>
#include <inttypes.h> // supports portable types
int main(void)
{int32_t me32;     // me32 a 32-bit signed variableme32 = 45933945;printf("First, assume int32_t is int: ");printf("me32 = %d\n", me32);printf("Next, let's not make any assumptions.\n");printf("Instead, use a \"macro\" from inttypes.h: ");printf("me32 = %" PRId32 "\n", me32);return 0;
}

;

7.浮点数常量

浮点数常量默认是double类型,可以通过后面加上f或F覆盖默认设置,也可以用l或L后缀使得数字成为long double 类型

C99标准添加了一种新的浮点型常量格式——用十六进制表示浮点型常量。
如下所示
0xa.1fp10
0x是前缀,a等于十进制10,.lf是1/16+15/256(十六进制f等于十进制15),p10是210


8.浮点值的上溢和下溢

在这里插入图片描述
上溢会赋给变量一个表示无穷大的特定值,且用printf打印会显式为inf


下溢会导致位数部分的为向右移空出二进制位,并丢弃最后二进制数。尽管得到了结果但是损失了精度,不过C库提供了用于检查计算是否会产生低于正常值的函数。


9.使用数据类型

初始化变量应使用与变量类型匹配的常数类型(避免隐式类型转换)
进行系统化的命名约定,在变量名中体现其类型。
例如,用i_前缀表示int类型,us_前缀表示unsigned short类型
在这里插入图片描述

在这里插入图片描述

11.常量和C预处理器

符号常量

#define PI 3.1415926

12.转换说明的意义

转换说明是翻译说明,%d的意思是“把给定的值翻译成十进制整数文本并显示到显示屏上”

12.1转换不匹配

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

13.副作用和序列点

序列点是程序执行的点,在该点上,所用的副作用都在进入下一步之前发生。在C语言,语句的分号标记了一个序列点。对运算对象做的改变必须在程序执行下一条语句之前完成

任何一个完整表达式的结果也是一个序列点
什么是完整表达式?这个表达式不是另一个更大表达式的子式
如while(guests++<10)是一个完整的表达式,因此在执行下一条语句时guests已经递增了,而y=(4 + x++) +(6 + x++),表达式4 + x++不是一个完整的表达式,因此无法保证执行完4 + x++之后x立即递增

这样的代码是非常糟糕的,在C和C++标准中,对于没有显式序列点分隔的多个副作用,它们的执行顺序是未定义的(undefined behavior)。

14.数组简介

C编译器对数据下标的检查是一种抽查,且只针对写



在这里插入图片描述



在这里插入图片描述

只抽查索引后的两位
在这里插入图片描述

15.ctype.h系列的字符函数

在这里插入图片描述

备选拼写:iso646.h头文件
程序包含该头文件,便可用and代替&&、or替代||、not代替!

16.缓冲区

在这里插入图片描述
为什么要有缓冲区?首先,把若干字符作为一个块进行传输比逐个发送这些字符节约时间。其次,如果用户打错字符,可以直接通过键盘修正错误。当最后按上Enter键时,传输的是正确的输入

缓冲分为两类:完全缓冲I/O和行缓冲I/O。完全缓冲输入指的是当缓冲区被填满时才刷新缓冲区。行缓冲I/O指的是出现换行符是刷新缓冲区。

17.文件结尾

操作系统可以用内嵌的Ctrl+Z字符来标记文件结尾,操作系统使用的另一种方法是存储文件大小的信息,如果文件有3000字节,程序在读到3000字节时便达到文件的结尾

无论用何种语言检测文件结尾,在C语言中,用getchar()读取文件检测到文件结尾时将返回一个特殊的值,即EOF(end of file的缩写)。scanf()函数检测到文件结尾时也返回EOF。通常,EOF定义在stdio.h文件中;
#define EOF (-1)

使用EOF?不能直接输入-1或EOF来表明EOF,正确的方法是根据当前系统的要求,如Vs下连续输入三下Ctrl+Z表示文件结尾

18.重定向

重定向输入输出让程序指定文件输入输出(Linux学习会详细介绍)

19.创建更友好的用户界面

19.1 使用缓冲输入

设计一个猜谜程序

while((response=getchar())!='y')//获得响应
{
//业务处理
while(getchar()!='/n')
continue;//跳过剩余的输入行
}

程序会输出猜得的数字,用户可以进行否定和肯定。但是程序无法识别用户说的所有话,例如业务处理让程序仅能识别’n’和’y’,只要用户输出的首字符是’n’或’y’,程序就能正常运行同时跳过剩余输入,否则则提示无法识别重新输入


19.2混合数值和字符输入

设计一个打印m x n字符的程序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void display(char cr, int lines, int width);
int main(void)
{int ch;             /* character to be printed      */int rows, cols;     /* number of rows and columns   */printf("Enter a character and two integers:\n");while ((ch = getchar()) != '\n'){if (scanf("%d %d",&rows, &cols) != 2)//确保输入正确break;display(ch, rows, cols);while (getchar() !=  '\n')//跳过剩余输入包括换行符保证下次执行时不会退出continue;printf("Enter another character and two integers;\n");printf("Enter a newline to quit.\n");}printf("Bye.\n");return 0;
}void display(char cr, int lines, int width)
{int row, col;for (row = 1; row <= lines; row++){for (col = 1; col <= width; col++)putchar(cr);putchar('\n');  /* end line and start a new one */}
}

19.3输入验证

在实际应用中,用户不一定会按照程序的指令形式,设计程序时我们应该处理一些可能得输入错误

例子
只处理正数

while(n>=0)
{
//业务处理
//获取下一个值
}

通过scanf函数的返回值来处理

while(scanf()==2)
{
//业务处理
//获取
}

通过getchar处理剩余的输入

while (getchar() !=  '\n')putchar(ch);

19.4 菜单浏览

在这里插入图片描述

但是遗憾的是并不是所有人都会按规矩办事,所以现在的应用程序使用图形界面,避免了错误输入


一个简单的设计

/* menuette.c -- menu techniques */
#include <stdio.h>
char get_choice(void);
char get_first(void);
int get_int(void);
void count(void);
int main(void)
{int choice;void count(void);while ( (choice = get_choice()) != 'q'){switch (choice){case 'a' :  printf("Buy low, sell high.\n");break;case 'b' :  putchar('\a');  /* ANSI */break;case 'c' :  count();break;default  :  printf("Program error!\n");break;}}printf("Bye.\n");return 0;
}void count(void)
{int n,i;printf("Count how far? Enter an integer:\n");n = get_int();for (i = 1; i <= n; i++)printf("%d\n", i);while ( getchar() != '\n')continue;
}char get_choice(void)
{int ch;printf("Enter the letter of your choice:\n");printf("a. advice           b. bell\n");printf("c. count            q. quit\n");ch = get_first();while (  (ch < 'a' || ch > 'c') && ch != 'q'){printf("Please respond with a, b, c, or q.\n");ch = get_first();}return ch;
}char get_first(void)
{int ch;ch = getchar();while (getchar() != '\n')continue;return ch;
}int get_int(void)
{int input;char ch;while (scanf("%d", &input) != 1){while ((ch = getchar()) != '\n')putchar(ch);  // dispose of bad inputprintf(" is not an integer.\nPlease enter an ");printf("integer value, such as 25, -178, or 3: ");}return input;
}

想创造出让人满意的菜单界面并不容易。就是从0到1实现很难,但是CV比较简单然后修改一下复用就行了

20.函数

20.1 形参的创建

在原型中使用变量名并没有实际创造变量,char仅代表了一个char类型的变量。只有当调用函数的时候才开辟形参

20.2 黑盒视角

在这里插入图片描述

21.编译多源代码文件的程序

在这里插入图片描述

22.指定初始化器(C99)

在这里插入图片描述

没初始化的元素都会变成零


当然这样赋值的话检查就比较严格,能检测下标是否越界
在这里插入图片描述

在这里插入图片描述
元素个数为最大下标个数+1

23.声明数组形参

在这里插入图片描述

23.指针的兼容性

指针之间的赋值比数值类型之间的赋值要严格
在这里插入图片描述

24.复合字面量

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

// flc.c -- funny-looking constants
#include <stdio.h>
#define COLS 4
int sum2d(const int ar[][COLS], int rows);
int sum(const int ar[], int n);
int main(void)
{int total1, total2, total3;int * pt1;int (*pt2)[COLS];pt1 = (int [2]) {10, 20};pt2 = (int [2][COLS]) { {1,2,3,-9}, {4,5,6,-8} };total1 = sum(pt1, 2);total2 = sum2d(pt2, 2);total3 = sum((int []){4,4,4,5,5,5}, 6);printf("total1 = %d\n", total1);printf("total2 = %d\n", total2);printf("total3 = %d\n", total3);return 0;
}int sum(const int ar[], int n)
{int i;int total = 0;for( i = 0; i < n; i++)total += ar[i];return total;
}int sum2d(const int ar[][COLS], int rows)
{int r;int c;int tot = 0;for (r = 0; r < rows; r++)for (c = 0; c < COLS; c++)tot += ar[r][c];return tot;
}

25.数组和指针

数组形式中,ar1是地址常量,不能更改ar1

26.字符串数组

在这里插入图片描述

28.fgets()函数(和fputs())

了解文件I/O,最简单的方法就是运用Linux下一切皆文件的哲学,包括键盘和显示器也视作文件,它们也有读写函数只不过键盘写方法为空,显示器读方法为空

char * fgets ( char * str, int num, FILE * stream );
int fputs ( const char * str, FILE * stream );

f前缀代表file,get从文件读取,put写到文件中

无前缀代标准流,get从标准输入流读取,put写到标准输出流

s前缀代表string,get从字符串读取,put写到字符串中


理解这个你也能理解scanf,fscanf,sscanf这类

f前缀代表file,从文件读取,

无前缀代标准流,从标准输入流读取,

s前缀代表string,从字符串读取,、


事实上正如鹏哥所说甚至公司会单独封装一套文件I/O,现有的文件I/O设计不是很理想

char * s_gets(char * st, int n)
{char * ret_val;int i = 0;ret_val = fgets(st, n, stdin);if (ret_val){while (st[i] != '\n' && st[i] != '\0')i++;if (st[i] == '\n')st[i] = '\0';else // must have words[i] == '\0'while (getchar() != '\n')continue;}return ret_val;
}

29.命令行参数

在图形界面普及之前都是用命令行界面

尤其是Linux环境往往使用的就是命令行界面

/* repeat.c -- main() with arguments */
#include <stdio.h>
int main(int argc, char *argv[])
{int count;printf("The command line has %d arguments:\n", argc - 1);for (count = 1; count < argc; count++)printf("%d: %s\n", count, argv[count]);printf("\n");return 0;
}

在这里插入图片描述

Linux环境下会详细介绍

30.结构体

在这里插入图片描述

在这里插入图片描述

/* complit.c -- compound literals */
#include <stdio.h>
#define MAXTITL  41
#define MAXAUTL  31struct book {          // structure template: tag is bookchar title[MAXTITL];char author[MAXAUTL];float value;
};int main(void)
{struct book readfirst;int score;printf("Enter test score: ");scanf("%d",&score);if(score >= 84)readfirst = (struct book) {"Crime and Punishment","Fyodor Dostoyevsky",11.25};elsereadfirst = (struct book) {"Mr. Bouncy's Nice Hat","Fred Winsome",5.99};printf("Your assigned reading:\n");printf("%s by %s: $%.2f\n",readfirst.title,readfirst.author, readfirst.value);return 0;
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
1.int位段被当成有符号数还是⽆符号数是不确定的。
2. 位段中最⼤位的数⽬不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会
出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配,标准尚未定义。
4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃剩余的位还是利⽤,这是不确定的。
总结:
跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。

31.存储类别、链接和内存管理

前置知识
C提供了多种不同的存储类别在内存中存储数据。
C语言中也有对象概念但是并不同于C++中的对象概念,对象指的是指内存中的一段有意义的区域,这段区域根据程序的声明被分配存储的每个值占用的物理内存区域,一块内存可以存储一个或多个值,也可以未存储实际的值。

软件方面来看,程序需要一种方法访问对象。这可以通过声明变量来完成

int entity = 3;,虽然这里说是声明变量但同时也定义了变量(开了空间,声明存在了多久这块对象就保留了多久时间)

entity可以指定特定的一块内存空间的内容,这样的方式可以得到一块特定的内存空间,同时也提供了存储在这块内存空间的内容

当然也可以通过一下方式指定对象
int*pt = &entity;//声明指针的方式
int ranks[10];//声明数组的方式实则就是声明指针的方式

在这里插入图片描述

31.1作用域

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

块作用域指的是从定义到包含该定义的块的末尾,不是指{}括起来的范围。比如if语句就不需要花括号,但是它是块作用域

大家看以前的C语言代码是这样写的

int i;
for(i=0;i<length;i++//现在我们都是这么写的
forint i=0;i<length;i++

C99我们把块的概念拓展到到了循环语句和if语句,

函数作用域不需要过多了解,因为这仅仅作用在goto语句,但是goto语句尽量别用

函数原型作用域从作用域的范围到从形参定义处到原型声明结束。就是说编译器只关注类型,不关注形参名。只有在变长数组中,形参名才有用

void use_a_VLM(int n,int m,ar[n][m]);

文件作用域也叫全局作用域,从他的定义到该定义文件的结尾甚至文件外部也能使用

31.2 链接

在这里插入图片描述

31.3 存储期

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

31.3.1 自动变量

在这里插入图片描述

内部块会隐藏外层块的定义,但是离开内层块之后后,程序使用的是当前块(外层块)的定义

尽量别使用同名变量,上述仅仅是编译器如何看待同名变量

31.3.2 寄存器变量

在这里插入图片描述

32 ANSI C类型限定符

在这里插入图片描述

32.1 volatile限定符

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

32.2 restrict限定符

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

32.3_Atomic类型限定符(C11)

在这里插入图片描述

32.4 旧关键字的新位置

在这里插入图片描述

33.结构体

在这里插入图片描述

在这里插入图片描述

/* complit.c -- compound literals */
#include <stdio.h>
#define MAXTITL  41
#define MAXAUTL  31struct book {          // structure template: tag is bookchar title[MAXTITL];char author[MAXAUTL];float value;
};int main(void)
{struct book readfirst;int score;printf("Enter test score: ");scanf("%d",&score);if(score >= 84)readfirst = (struct book) {"Crime and Punishment","Fyodor Dostoyevsky",11.25};elsereadfirst = (struct book) {"Mr. Bouncy's Nice Hat","Fred Winsome",5.99};printf("Your assigned reading:\n");printf("%s by %s: $%.2f\n",readfirst.title,readfirst.author, readfirst.value);return 0;
}

在这里插入图片描述

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

34.位操作

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

//  mytype.c#include <stdio.h>#define MYTYPE(X) _Generic((X),\
int: "int",\
float : "float",\
double: "double",\
default: "other"\
)int main(void)
{int d = 5;printf("%s\n", MYTYPE(d));     // d is type intprintf("%s\n", MYTYPE(2.0*d)); // 2.0* d is type doubleprintf("%s\n", MYTYPE(3L));    // 3L is type longprintf("%s\n", MYTYPE(&d));    // &d is type int *return 0;
}

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

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

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

//varargs.c -- use variable number of arguments
#include <stdio.h>
#include <stdarg.h>
double sum(int, ...);int main(void)
{double s,t;s = sum(3, 1.1, 2.5, 13.3);t = sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1);printf("return value for ""sum(3, 1.1, 2.5, 13.3):                %g\n", s);printf("return value for ""sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1): %g\n", t);return 0;
}double sum(int lim,...)
{va_list ap;                    // declare object to hold argumentsdouble tot = 0;int i;va_start(ap, lim);             // initialize ap to argument listfor (i = 0; i < lim; i++)tot += va_arg(ap, double); // access each item in argument listva_end(ap);                    // clean upreturn tot;
}

35 其他

预处理详解

数据在内存中的存储

相关文章:

C总结(C语言知识点,深化重难点)

C语言 1.使用C语言的7个步骤2.ASCII码3.提高程序可读性的机巧4.如何使用多种整形5.打印多种整形6.课移植类型&#xff1a;stdint.h和inttypes.h7.浮点数常量8.浮点值的上溢和下溢9.使用数据类型11.常量和C预处理器12.转换说明的意义12.1转换不匹配13.副作用和序列点14.数组简介…...

[Collection与数据结构] 位图与布隆过滤器

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

Redis与缓存

目录 缓存 缓存优缺点 缓存更新策略 超时剔除 先删缓存再更新数据库 旁路缓存(先更新数据库&#xff0c;再删缓存&#xff09; 先更新数据库&#xff0c;再更新缓存 读写穿透 ​编辑 异步缓存写入模式 缓存常见问题 缓存穿透 缓存雪崩 缓存击穿 缓存 在业务开发…...

Ubuntu Linux 文件、目录权限问题(五)

本文为Ubuntu Linux操作系统- 第五弹 此文是在上期文件目录的内容操作基础上接着讲权限问题 上期回顾&#xff1a;Ubuntu Linux 目录和文件的内容操作 文件访问者身份与文件访问权限 Linux文件结构 所有者&#xff08;属主&#xff09;所属组&#xff08;属组&#xff09;其他…...

AI 名人堂:Jeff Dean

Jeff Dean&#xff0c;谷歌的高级研究员和人工智能领域的领军人物&#xff0c;以其在大规模分布式计算系统和人工智能系统的杰出贡献而闻名。 谷歌AI掌门人 TensorFlow项目负责人 美国工程院院士 2AGI.NET AI 名人堂 AI 名人堂&#xff1a;Jeff DeanAI 名人堂&#xff1a;Je…...

基础排序算法详解:冒泡排序、选择排序与插入排序

引言 上一章&#xff0c;我们聊到了排序的基本概念和常见算法的分类。这一次&#xff0c;我们从基础开始&#xff0c;深入剖析三种常见的O(n) 排序算法&#xff1a;冒泡排序、选择排序 和 插入排序。 它们是学习排序算法的入门神器&#xff0c;不仅实现简单&#xff0c;还能帮…...

Flink如何基于数据版本使用最新离线数据

业务场景 假设批量有一张商户表&#xff0c;表字段中有商户名称和商户分类两个字段。 批量需要将最新的商户名称和分类的映射关系推到hbase供实时使用。 原实现方案 a.原方案内容 为解决批量晚批问题&#xff0c;批量推送hbase表时一份数据产生两类rowkey&#xff1a;T-1和…...

什么是反向代理?作用、原理和实例详解

&#x1f680; 什么是反向代理&#xff1f;作用、原理和实例详解 在现代的网络架构中&#xff0c;反向代理&#xff08;Reverse Proxy&#xff09;无处不在。无论是负载均衡、加速缓存&#xff0c;还是WebSocket 支持&#xff0c;反向代理都是必不可少的工具。 这篇文章将带您…...

国产GPU中,VLLM0.5.0发布Qwen2.5-14B-Instruct-GPTQ-Int8模型,请求返回结果乱码

概述 国产GPU: DCU Z100 推理框架&#xff1a; vllm0.5.0 docker容器化部署 运行如下代码&#xff1a; python -m vllm.entrypoints.openai.api_server --model /app/models/Qwen2.5-14B-Instruct-GPTQ-Int8 --served-model-name qwen-gptq --trust-remote-code --enforce…...

Stable Diffusion本地部署:从零开始的完整指南

1、引言 Stable Diffusion是计算机视觉领域的一个生成式大模型&#xff0c;能够进行文生图&#xff08;txt2img&#xff09;和图生图&#xff08;img2img&#xff09;等图像生成任务。它利用深度学习技术&#xff0c;特别是RealisticVision v2.0模型&#xff0c;能够创造出接近…...

隐式神经网络实现低光照图像增强

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

Flutter动画(三)内建显式动画Widget

常见的内建显式动画Widget&#xff1a; ListenableBuilder&#xff1a; AnimatedBuilder AnimatedWidget AlignTransition DecoratedBoxTransition DefaultTextStyleTransition PositionedTransition RelativePositionedTransition RotationTransition ScaleTransiti…...

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…...

Spring Boot日志:从Logger到@Slf4j的探秘

写在前面 Hello大家好&#xff0c;今日是2024年的第一天&#xff0c;祝大家元旦快乐?? 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用&#xff1f;三、日志怎么用&#xff1f;四、自定义日志打印 ?? 常见日志框架说明4.1 在程序中得到?志对象【…...

使用 LabVIEW 与 PLC 通信的方式

要将 PLC 与 LabVIEW 或其他 NI 产品进行通信&#xff0c;首先需要明确 PLC 支持的通信协议和接口类型。NI 提供了多种方案&#xff0c;包括 OPC 服务器、Modbus、Ethernet/IP 和其他工业通信协议。下面将详细介绍这些方法&#xff0c;并进行比较分析&#xff0c;帮助你选择最适…...

python录制鼠标键盘操作循环播放

依赖 pip install pynput 程序: from pynput import mouse, keyboard import time import threading# 用于存储录制的鼠标和键盘事件 mouse_events [] keyboard_events []# 定义事件处理函数# 处理鼠标事件 def on_move(x, y):mouse_events.append((move, x, y))def on_cl…...

开发者如何使用GCC提升开发效率Opencv操作

看此篇前请先阅读 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144216351?spm=1001…...

异常与文件

目录 1.异常 1.1.概念 1.2.常见异常 1.3.异常处理方式 1.3.1.try except 1.3.2.try except else 1.3.3.try except else finally 2.文件 2.1.文件分类 ps&#xff1a;python 程序的数据保存在哪里? 2.2.常见的文件类型 2.3.python 操作文件的函数 2.3.1.读取文件…...

【C语言】完成程序设计填空

文章目录 1、请阅读下面的程序,在空白处填写正确的代码,要求各在一行从头开始输出m和n的值。2、求100~599之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。3、以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序 拆分并输出。请填空…...

西湖大学:LLM零样本推理任务校准

&#x1f4d6;标题&#xff1a;Task Calibration: Calibrating Large Language Models on Inference Tasks &#x1f310;来源&#xff1a;arXiv, 2410.18764 &#x1f31f;摘要 &#x1f538;大型语言模型&#xff08;LLM&#xff09;在推理任务上表现出令人印象深刻的零样本…...

windows下Qt5自动编译配置QtMqtt环境(11)

文章目录 [toc]1、概述2、准备1.1 下载源码1.2 配置环境1.3 解释原理 3、编译4、验证5、参考6、视频 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt网络编程 &#x1f448; 1、概述 Qt默认是不包含mqtt库的&#xff0c;如果需要使用到mqtt库就只能自己编译配…...

每天五分钟深度学习:神经网络的前向传播的计算(多样本)

本文重点 前面我们学习了单样本的前向传播,本文我们学习多样本的前向传播,我们先来回忆一下,神经网络的单样本的前向传播的向量化的方式: m个样本依次进行前向传播 这里我们说明一下符号: 我们使用(m)表示第m个样本,用[m]表示神经网络的第m层 a[2](i) 表示第i个样本计…...

基于 NXP S32K312+FS23 的汽车通用评估板方案

S32K3 系列是 NXP 推出的面向汽车电子和工业应用的微控制器&#xff0c;基于 ARMCortex-M7 内核&#xff0c;支持单核、双核和锁步内核配置。S32K3 系列具有内核、内存和外设数量方面的可扩展性&#xff0c;符合 ISO26262 标准&#xff0c;能达到 ASIL B/D 安全等级&#xff0c…...

11进阶篇:专业课论文阅读方向指南(2025版)

文章目录 第一个检索式:图情档核心期刊(北大 + CSSCI)发文情况研究方法类关键词研究主题类关键词论文阅读建议第二个检索式:川大公共管理学院在核心期刊(北大 + CSSCI)的发文情况研究方法类关键词研究主题类关键词特点关键词与2024年972(现815)两道题目的映射情况815信…...

Qt之第三方库‌QXlsx使用(三)

Qt开发 系列文章 - QXlsx&#xff08;三&#xff09; 目录 前言 一、Qt开源库 二、QXlsx 1.QXlsx介绍 2.QXlsx下载 3.QXlsx移植 4.修改项目文件.pro 三、使用技巧 1.写入数据 2.读出数据 总结 前言 Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用程序功能的控件…...

第145场双周赛: 使数组的值全部为 K 的最少操作次数、破解锁的最少时间 Ⅰ、使两个整数相等的位数操作、统计最小公倍数图中的连通块数目

Q1、使数组的值全部为 K 的最少操作次数 1、题目描述 给你一个整数数组 nums 和一个整数 k 。 如果一个数组中所有 严格大于 h 的整数值都 相等 &#xff0c;那么我们称整数 h 是 合法的 。 比方说&#xff0c;如果 nums [10, 8, 10, 8] &#xff0c;那么 h 9 是一个 合法…...

AJAX三、XHR,基本使用,查询参数,数据提交,promise的三种状态,封装-简易axios-获取省份列表 / 获取地区列表 / 注册用户,天气预报

一、XMLHttpRequest基本使用 XMLHttpRequest&#xff08;XHR&#xff09;对象用于与服务器交互。 二、XMLHttpRequest-查询参数 语法: 用 & 符号分隔的键/值对列表 三、XMLHttpRequest-数据提交 核心步骤 : 1. 请求头 设置 Content-Type 2. 请求体 携带 符合要求 的数…...

Android期末复习题

1.如何搭建Android开发环境&#xff1f; 答案:搭建Android开发环境需要以下几个步骤&#xff1a; &#xff08;1&#xff09;下载和安装JDK &#xff08;2&#xff09;配置PATH环境变量 &#xff08;3&#xff09;下载和安装Android Studio &#xff08;4&#xff09;创建A…...

《蓝桥杯比赛规划》

一、比赛简介 蓝桥杯全国软件和信息技术专业人才大赛是一项具有较高影响力的编程竞赛&#xff0c;旨在促进软件和信息技术领域专业技术人才的培养&#xff0c;提升高校毕业生的就业竞争力。比赛涵盖了多个编程语言和专业方向&#xff0c;包括 C/C、Java、Python 等。 二、目标…...

三、Zookeeper

Zookeeper 三、Zookeeper3.1什么是zookeeper?3.2为什么需要zookeeper3.3Zookeeper基本运行流程3.4Zookeeper数据模型3.5Zookeeper主要角色3.6Zookeeper工作原理3.7Zookeeper节点数据操作流程三、Zookeeper 3.1什么是zookeeper? ZooKeeper是一个分布式的,开放源码的分布式应…...

Wireshark数据抓包分析之传输层协议(TCP协议)

根据实验环境&#xff0c;本实验的步骤如下&#xff1a; 1.在测试环境使用发包工具和Wireshark抓取TCP三次握手和四次断开的数据包。 2.详细分析TCP协议的三次握手以及四次断开。 任务描述&#xff1a;安装发包工具&#xff0c;并配置TCP客户端&#xff0c;服务端&#xff0…...

用ai做机器视觉的事情

cnn&#xff08;卷积神经网络&#xff09;是典型的ai算法。 我们已经cnn实现像机器视觉中形状匹配的功能&#xff0c;因为使用了roi抠图匹配&#xff0c;所以就叫做roicnn&#xff0c;以区分整图匹配。下面是roicnn笔记总结&#xff1a; 20241022&#xff0c;roicnn搞定&…...

LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144304351 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaVA-…...

qtcanpool 知 10:包管理雏形

文章目录 前言痛点转机雏形实践后语 前言 曾听闻&#xff1a;C/Qt 没有包管理器&#xff0c;开发起来太不方便。这是一个有过 node.js 开发经验的人对 Qt 的吐槽。 确实&#xff0c;像 python、golang、node.js 这些编程语言都有包管理器&#xff0c;给用户带来了极佳的开发体…...

[保姆式教程]使用目标检测模型YOLO11 OBB进行旋转目标检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

之前写了一个基于YOLOv8做旋转目标检测&#xff08;OBB&#xff09;的文章&#xff0c;内容写得不够好&#xff0c;内容也有些杂乱无序。现如今YOLO已经更新到11了&#xff0c;数据集也集齐了无人机和卫星的农业大棚&#xff0c;所以这次就写一个基于YOLO11 OBB的农业大棚旋转检…...

MySQL 权限管理分配详解

MySQL 权限管理分配详解 MySQL权限系统的工作原理权限表的存取用户通过权限认证、进行权限分配的流程账号管理我们常用的授权all privileges到底有哪些权限呢&#xff1f;以及带来的安全隐患有哪些&#xff1f;创建账户的时候最好分配指定的权限&#xff0c;这样子安全也高管理…...

【期末速成】《微机原理与接口技术》知识点总结

文章目录 前言第一、二章 接口技术概述1. 接口的定义*2. 接口功能特点*3. 接口的分类*4. 接口中的传输信息及其组成5. 接口的编址与译码*6. CPU 与外设之间的数据传送方式* 第三章 总线1. 总线&#xff08;BUS&#xff09;的定义*2. 总线的标准3. 采用标准总线的优点*4. 总线的…...

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735&#xff0c;目前主流的版本都适用&#xff08;V1R5~V2R1的就不在列了&#xff0c;版本太老了&#xff0c;界面完全不一样&#xff0c;这里调试线接的console口&#xff0c;电脑的网络接在ETH口&#xff09; 「模拟器、工具合集」复制整段内…...

【Elasticsearch】初始化默认字段及分词

1、添加分词插件 1&#xff09;在线安装 执行命令 需要指定相同的版本 bin/elasticsearch-plugin.bat install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.24 2&#xff09;离线安装 将安装包解压到 /plugins 目录下 安装包可以从对应的资源处下载 启动成…...

asdf-java配置

asdf list all java 无结果 asdf list all java 显示结果 No compatible versions available 解决方案 参考 执行 cp ~/.asdf/plugins/java/data/jdk-macosx-x86_64-ga.tsv $TMPDIR/asdf-java-$(whoami).cache/releases-macosx-x86_64.tsv 在此执行 asdf list all java 就可…...

2-2-18-14 QNX系统架构之 TCP/IP 网络

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…...

RabbitMQ延迟消息的实现

RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中&#xff0c;消费者不会立即收到消息&#xff0c;而是过一段时间之后才会收到消息&#xff0c;进行处理。在一些业务中&#xff0c;可以用到延…...

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…...

Ubuntu22.04深度学习环境安装【Anaconda+Pycharm】

anaconda可以提供多个独立的虚拟环境&#xff0c;方便我们学习深度学习&#xff08;比如复现论文&#xff09;&#xff1b; Pycharm编辑器可以高效的编写python代码&#xff0c;也是一个很不错的工具。 下面就记录下Ubuntu22.04的安装流程&#xff1a; 1.Anaconda安装 下载Ana…...

springboot整合canal

学习链接 Cannal项目地址 SpringBoot整合Canal实现数据同步到ElasticSearch - 原文地址 Spring Boot整合canal实现数据一致性解决方案解析-部署实战 Java&#xff1a;SpringBoot整合Canal实现数据同步 docker环境安装mysql、canal、elasticsearch&#xff0c;基于binlog利…...

8.在 Vue 3 中使用 OpenLayers 加载天地图示例(多种形式)

前言 OpenLayers 是一个强大的开源地图框架&#xff0c;可以轻松实现地图加载与操作。而 Vue 3 则通过 Composition API 提供了更加简洁和灵活的开发体验。本文将介绍如何在 Vue 3 中结合 OpenLayers 实现对天地图的加载&#xff0c;包括矢量地图、卫星地图以及中文和英文标记等…...

如何设置 Java 开发环境

如果你在这里&#xff0c;可能是想学习如何为 Java 开发设置环境。第一步是安装 SDK&#xff08;软件开发工具包&#xff09;&#xff0c;它是一组由硬件和软件供应商提供的工具和库。 对于 Java&#xff0c;我们使用 JDK&#xff08;Java 开发工具包&#xff09;。JDK 是一组…...

MetaGPT 安装

1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令&#xff0c;在C盘位置C:\Users\325…...

石岩湿地公园的停车场收费情况

周末石岩湿地公园停车场【967个】小车停车费封顶14元价格还行&#xff0c;我还记得2020年的时候湿地公园还是10元一天封顶。现在的收费情况也是可以的&#xff0c;尤其是周末停车比工作日停车便宜还是很得民心的哈。 车型 收费标准 小车 工作日 高峰时间8:00~20:00 首小时…...

v3账号密码登录随机图片验证码

安装插件 pnpm i identify --save图形验证码组件 <template><div class"s-canvas"><!-- 图形验证码的宽和高都来自于父组件的传值&#xff0c;若父组件没有传值&#xff0c;那么就按当前子组件的默认值进行渲染 --><canvas id"s-canvas&…...