C基础-操作符详解
操作符分类:
算数操作符:+ - * / %
//算数操作符
// int main()
// {
// // /除法 1.整数除法(除号两端都是整数) 2浮点数除法,除号的两端只要有一个小数就执行小数除法
// // 除法中,除数为0
// int a = 7 / 2;
// printf("%d\n",a); //3
// double b = 7 / 2;
// printf("%lf\n",b); //3.000000
// double c = 7 / 2.0;
// printf("%lf\n",c); //3.500000
// int d = 0;
// int e = 5 / d; //除数不可为0,编译器会报错// printf("%d\n",e);// return 0;
// }int main()
{int a = 17 % 8; //% 得到数整数的余数//int b = 17.0 % 8.0; // %取模操作符的两个操作数必须都是整数才行printf("%d\n",a);return 0;
}
移位操作符:<< >>
//移位操作符
// <<左移操作符
// >>右移操作符
//注意:以为操作符的操作数只能是整数 移动的是二进制
int main()
{//int a = 15;//00000000000000000000000000001111 -原码 //00000000000000000000000000001111 -反码 //00000000000000000000000000001111 -补码//int c = -15; //10000000000000000000000000001111 -原码 //11111111111111111111111111110000 -反码(原码的符号位不变,其他位按位取反) 11111111111111111111111111110001 -补码(反码+1就是补码)//int b = a >> 1;//移动的就是a中的二进制信息 //0000000000000000000000000000111 - 7//右移:算术右移(右边丢弃,左边直接补原来的符号位) 逻辑右移(右边丢弃,左边直接补0)// C语言没有明确规定是算术右移还是逻辑右移//int c = a << 1;//00000000000000000000000000011110//整数的二进制表示形式 : 原码 反码 补码 //正整数的原码、反码、补码是相同的//负的整数原码、反码、补码是要计算的//首先不管是正整数还是负整数都可以写出二进制原码 1.根据正负直接写出的二进制序列就是原码//1个整型是4个字节 = 32bit位//整数在内存中存储的是补码//计算的时候也是使用补码计算的// printf("%d\n",b); //7// printf("%d\n",c); //30// int d = -15; //10000000000000000000000000001111// int e = d >> 1;//11111111111111111111111111110001 -> 11111111111111111111111111111000 -> 11111111111111111111111111110111 ->00000000000000000000000000001000// printf("%d\n",e);//!移位操作符不要移负数哦int a = 6;// 110int b = a << 1;//1100printf("%d\n",b); //12return 0;
}
位操作符:& | ^
//位操作符
//也是操作二进制位
// &
// int main()
// {
// int a = 3; //00000000000000000000000000000011
// int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011
// int c = a & b;
// // & -- 对应二进制位,有0则为0,两个同时为1才是1
// //00000000000000000000000000000011
// //11111111111111111111111111111011
// //00000000000000000000000000000011 -补码// printf("%d\n",c); //3// return 0;
// }//|
// int main()
// {
// int a = 3; //00000000000000000000000000000011
// int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011
// int c = a | b;
// // | -- 对应二进制位,有1则为1,两个同时为0才是0
// //00000000000000000000000000000011
// //11111111111111111111111111111011
// //11111111111111111111111111111011 -补码
// //11111111111111111111111111111010
// //10000000000000000000000000000101 -5
// printf("%d\n",c); //-5// return 0;
// }//^
int main()
{int a = 3; //00000000000000000000000000000011int b = -5;//10000000000000000000000000000101 11111111111111111111111111111010 补码11111111111111111111111111111011int c = a ^ b;// ^ -- 对应二进制位,相同为0,相异为1//00000000000000000000000000000011//11111111111111111111111111111011//11111111111111111111111111111000 -补码//11111111111111111111111111110111//10000000000000000000000000001000printf("%d\n",c); //-8return 0;
}//不能创建临时变量,实现两个整数的交换
int main()
{int a = 3;int b = 5;printf("交换前: a=%d b=%d\n",a,b);// int tmp = a;// a = b;// b = tmp;// a = a + b;// b = a - b;// a = a - b; 超过整形最大存储则不行//a ^ a -> 0//a ^ 0 = a// 异或是支持交换律的//a ^ b ^ a = 5//a ^ a ^ b = 5a = a ^ b;b = a ^ b; // b = a ^ b ^ b = aa = a ^ b;// a = a ^ b ^ a = bprintf("交换后: a=%d b=%d\n",a,b);return 0;
}
编写代码实现:求一个整数存储在内存中的二进制中1的个数
//编写代码实现:求一个整数存储在内存中的二进制中1的个数
//方法1
// int main()
// {
// //整数有32个bit位
// //获得32个bit位的每一位,
// //判断这一位是否为1
// //是1就是记数器+1
// int num = 10;
// int count = 0;// while (num)
// {
// if (num%2 == 1)
// {
// count++;
// }
// num = num/2;// }
// printf("二进制中1的个数 = %d\n",count);// return 0;
// }//方法2
int main()
{int num = 10;int i = 0;int count = 0;for(i=0;i<32;i++){if (num & (1 << i)){count++;}}printf("二进制中1的个数 = %d\n",count);return 0;
}
赋值操作符: = += -= *= /= ....
//赋值操作符int main()
{int weight = 120;//体重weight = 89; //不满意就赋值double salary = 10000.0;salary = 20000.0;int a = 10;int x = 0;int y = 20;a = x = y+1;//连续复制return 0;
}
单目操作符: ! sizeof + - ~ & *
//单目操作符
// int main()
// {
// int flag = 5;
// if(flag == 0)
// {
// printf("hehe\n");
// }
// if(!flag) //flag为假打印hehe
// {
// printf("hehe\n");
// }
// if(flag)
// {
// printf("haha\n");
// }// return 0;
// }//单目操作符只有一个操作数
// int main()
// {
// int a = 5;
// int b = -a;
// printf("%d\n",b);// return 0;
// }//& * 应用于指针
// int main()
// {
// int a = 10;
// //pa是指针变量
// int* pa = &a; // &-取地址操作符 取出a的地址
// *pa = 20; //解引用操作符(间接访问操作符)-单目操作符-通过pa中存放的地址,找到指向的空间(内容)
// int c = *pa;
// printf("%d\n",c);// return 0;
// }//sizeof 不是函数,是操作符号
//sizeof 计算的是类型创建变量的大小,单位是字节
// int main()
// {
// int a = 10;
// double b = 10.0;
// printf("%d\n",sizeof(int));//4
// printf("%d\n",sizeof(a));//4
// printf("%d\n",sizeof(b));//8
// return 0;// }// int main()
// {
// int arr1[10];
// printf("%d\n",sizeof(arr1)); //40 计算整个数组的大小,单位字节
// printf("%d\n",sizeof(int [10])); //40
// int arr2[20];
// printf("%d\n",sizeof(arr2));//80// return 0;
// }// ~ 按位取反 按补码二进制位取反
// int main()
// {
// int a = 0;
// printf("%d\n", ~a);
// //00000000000000000000000000000000
// //11111111111111111111111111111111 -补码
// //11111111111111111111111111111110
// //10000000000000000000000000000001 -1
// return 0;
// }// int main()
// {
// int a = 13;
// //00000000000000000000000000001101
// //00000000000000000000000000010000
// a |= (1<<4);
// //00000000000000000000000000011101
// //11111111111111111111111111101111
// //00000000000000000000000000001101
// printf("%d\n",a); //29// a &= (~(1 << 4));
// printf("%d\n",a);
// return 0;
// }// int main()
// {
// int a = 0;
// //scanf 读取失败返回的是EOF
// //假设scanf读取失败了,返回了EOF ---> -1
// //while (scanf("%d",&a) != EOF)
// while(~scanf("%d",&a)) //~ -1为false
// {
// printf("%d\n",a);
// }// return 0;
// }// --前置、后置--
//++前置 、后置++
// int main()
// {
// int a = 1;
// int b = a++; //后置++,先使用,后++
// //int c = ++a; //先置++ ,先++在使用
// printf("b=%d a=%d\n",b,a);// int c = 1;
// int e = c--; //后置--,先使用,后--
// printf("e=%d c=%d\n",e,c);// return 0;
// }//强制类型转换
int main()
{int a = (int)3.14; //强制转换printf("%d\n",a);// int a = int(3.14) //errreturn 0;
}void test1(int arr[]) //int* 4/8个字节
{printf("%d\n",sizeof(arr));
}
void test2(char ch[]) //char* 4/8个字节
{printf("%d\n",sizeof(ch));
}
int main()
{int arr[10] = {0};char ch[10] = {0};printf("%d\n",sizeof(arr)); //40printf("%d\n",sizeof(ch)); // 10test1(arr); // x86上是4 ,x64上是8test2(ch); // x86上是4 ,x64上是8return 0;
}
关系操作符: > < >= <= =. !=. 关系操作符只能应用到适合的类型上
int main()
{int a = 0;int b = 0;scanf("%d %d",&a ,&b);if(a == 5 && b ==5){printf("hehe\n");}if(a == 5 || b ==5){printf("haha\n");}return 0;
}int main()
{int y = 0;scanf("%d",&y);//判断是否是闰年 1.能被4整除,并且不能被100整除//2 .能被400整除是闰年if(((y%4==0) && (y%100!=0)) || (y%400==0)){printf("y=%d是闰年\n",y);}else{printf("不是闰年");}return 0;
}
逻辑操作符:&& 逻辑与 并且 || 逻辑或 或者
int main()
{int i = 0, a = 0, b = 2, c = 3, d =4;//i = a++ && ++b && d++;//printf("a = %d\n b = %d\n c = %d\n d = %d\n",a,b,c,d);//1 2 3 4i = a++ || ++b ||d++;printf("a = %d\n b = %d\n c = %d\n d = %d\n",a,b,c,d);//1 3 3 4return 0;
}
条件操作符:? :
//条件操作符也叫三目操作符 有三个操作数 exp1 ? exp2 : exp3
//双目操作符 a+b
//单目操作符 !a// int main()
// {
// int a = 0;
// int b = 0;
// // if (a > 5)
// // {
// // b = 3;
// // } else
// // {
// // b = -3;
// // }// //(a > 5) ? (b = 3) : (b = -3);// b = (a > 5) ? 3 : -3;
// printf("%d\n",b);// return 0;
// }int main()
{int a = 0;int b = 0;scanf("%d %d",&a,&b);int m = (a > b) ? a : b;printf("%d\n",m);return 0;
}
逗号表达式 : ,
//exp1,exp2,exp3,....expN
//逗号表达式 : 从左向右计算,整个表达式的结果是最后一个表达式的结果
// int main()
// {
// int a = 1;
// int b = 2;
// int c = (a>b, a = b+10 ,a,b=a+1); //13
// printf("%d\n",a); //12
// printf("%d\n",b); //13
// printf("%d\n",c); //13
// return 0;
// }// int main()
// {
// // a = get_val();
// // count_val(a);// // while (a > 0)
// // {
// // //业务处理
// // a = get_val();
// // count_val(a);
// // }// //使用逗号表达式
// while (a = get_val(),count_val(a), a>0)
// {
// //业务处理
// }// return 0;
// }
下标引用,函数调用和结构成员: []. (). . ->
[] 下标引用操作符
操作数:一个数组名+一个索引值
//[] 下标引用操作符
// int main()
// {
// int arr[10] = {1,2,3,4};
// //数组的起始是有下标的,下标是从0开始的
// printf("%d\n",arr[2]); //arr 和 2是[]的两个操作数// return 0;
// }
()函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
// return 0;
// }int Add(int x,int y)
{return x + y;
}
//函数调用操作符
int main()
{int len = strlen("abc"); //()函数调用操作符//()的操作数是:strlen 函数名 "abc" 实参printf("%d\n",len);int c = Add(3,5);printf("%d\n",c);//对于函数调用操作符来说,最少有1个操作数return 0;
}
访问一个结构的成员
. 结构体,成员名
-> 结构体指针 -> 成员名
结构体 -复杂类型 -自定义类型
//可变参数列表 -参数的个数是变化的 -探索
struct Book
{char name[30];char author[20];float price;
};void Print(struct Book * p)
{//printf("%s %s %f\n",(*p).name,(*p).author,(*p).price);printf("%s %s %f\n",p->name,p->author,p->price);// -> //结构指针->成员名 p->name
}int main()
{struct Book b1 = {"C语言","ccc",66.8f};//书struct Book b2 = {"Java入门","jjj",55.8f}; //书Print(&b1);//printf("%s %s %f\n",b1.name,b1.author,b1.price);//printf("%s %s %.1f\n",b2.name,b2.author,b2.price);//结构体变量,成员名return 0;}
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结核性决定。
同样,有些表达式的操作数在求值的过程中困难需要转化为其他类型
//表达式求值
//1表达式在计算的过程中,有哪些类型转换?
//2表达式的求值顺序是怎么样的
//类型转换 1整型提升 2算术转换
//整形提升 C的整型算术运算总是至少一缺省整型类型的精度来进行的 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升int main()
{char c1 = 5;//00000000000000000000000000000101//00000101 - c1char c2 = 127;//00000000000000000000000001111111char c3 = c1 + c2; // -124//00000000000000000000000000000101//00000000000000000000000001111111//00000000000000000000000010000100//%d - 10进制的形式打印有符号的整数//11111111111111111111111110000100//10000000000000000000000001111100 -124printf("%d\n",c3);return 0;
}
// %u 打印10进制的形式无符号的整数
// int main()
// {
// char c = 1;
// printf("%u\n",sizeof(c)); //1
// printf("%u\n",sizeof(+c)); //1
// printf("%u\n",sizeof(-c)); //1// return 0;
// }// int main()
// {
// float f = 3.14;
// int a = 10;// char b = a + f; // 13
// int c = a + f; // 13// printf("%d\n",b);
// printf("%d\n",c);// return 0;
// }//相邻操作符优先级高的先算,低低后算
//相邻操作符的优先级相同的情况下,结合性起作业
// int main()
// {
// int a = 2 + 3 * 5;// return 0;
// }// int main()
// {
// int i = 10;
// i = i-- - --i * (i = -3) * i++ + ++i;
// printf("i = %d\n", i);// return 0;
// }int fun()
{static int count = 1;return ++count;
}int main()
{int answer;answer = fun() - fun() * fun(); // 2 - 3*4 -10printf("%d\n",answer); //输出多少return 0;}
相关文章:

C基础-操作符详解
操作符分类: 算数操作符: - * / % //算数操作符 // int main() // { // // /除法 1.整数除法(除号两端都是整数) 2浮点数除法,除号的两端只要有一个小数就执行小数除法 // // 除法中,除数为0 // int a 7 / 2; /…...

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测
时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测。…...

【深度学习实验】线性模型(五):使用Pytorch实现线性模型:基于鸢尾花数据集,对模型进行评估(使用随机梯度下降优化器)
目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 线性模型linear_model 2. 损失函数loss_function 3. 鸢尾花数据预处理 4. 初始化权重和偏置 5. 优化器 6. 迭代 7. 测试集预测 8. 实验结果评估 9. 完整代码 一、实验介…...

ADB底层原理
介绍 adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序,说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的and…...

etcd之读性能主要影响因素
1、Raft模块-线性读ReadIndex-节点之间的RTT延时、磁盘IO 线性读时Follower节点首先会向Raft 模块发送ReadIndex请求,此时Raft模块会先向各节点发送心跳确认,一半以上节点确认 Leader 身份后由leader节点将已提交日志索引 (committed index) 封装成 Rea…...

【Stable Diffusion】安装 Comfyui 之 window版
序言 由于stable diffusion web ui无法做到对流程进行控制,只是点击个生成按钮后,一切都交给AI来处理。但是用于生产生活是需要精细化对各个流程都要进行控制的。 故也就有个今天的猪脚:Comfyui 步骤 下载comfyui项目配置大模型和vae下载…...

Ansys Zemax | 如何建立二向分色分光镜
分光镜(Beam splitter)可被运用在许多不同的场合。一般而言,入射光抵达二向分色分光镜(dichroic beam splitter)时,会根据波长的差异产生穿透或反射的现象。这篇文章将说明如何在OpticStudio的非序列模式(non-sequential mode)中建立二向分色分光镜&…...

Mybatis学习笔记8 查询返回专题
1.返回实体类 2.返回List<实体类> 3.返回Map 4.返回List<Map> 5.返回Map<String,Map> 6.resultMap结果集映射 7.返回总记录条数 新建模块 依赖 目录结构 1.返回实体类 如果返回多条,用单个实体接收会出异常 2.返回List<实体类> 即使返回一条记…...

【测试开发】基础篇 · 专业术语 · 软件测试生命周期 · bug的描述 · bug的级别 · bug的生命周期 · 处理争执
【测试开发】基础篇 文章目录 【测试开发】基础篇1. 软件测试生命周期1.1 软件生命周期1.2 软件测试生命周期 2. 描述bug3. 如何定义bug的级别3.1 为什么要对bug进行级别划分3.2 bug的一些常见级别 4. bug的生命周期5. 产生争执这么怎么办(处理人际关系)…...

bing许少辉乡村振兴战略下传统村落文化旅游设计images
bing许少辉乡村振兴战略下传统村落文化旅游设计images...
第三十一章 Classes - 继承规则
第三十一章 Classes - 继承规则 继承规则 与其他基于类的语言一样,可以通过继承组合多个类定义。 类定义可以扩展(或继承)多个其他类。这些类又可以扩展其他类。 请注意,类不能继承 Python 中定义的类(即 .py 文件中…...

华为云HECS安装docker并安装mysql
1、运行安装指令 yum install docker都选择y,直到安装成功 2、查看是否安装成功 运行版本查看指令,显示docker版本,证明安装成功 docker --version 3、启用并运行docker 3.1启用docker指令 systemctl enable docker 3.2 运行docker指令…...
MQ - 04 基础篇_存储_消息数据和元数据的存储设计
文章目录 导图概述元数据信息的存储消息数据的存储数据存储结构设计思路一 (Kafka的方案)思路二 (RocketMQ、RabbitMQ 和 Pulsar 的底层存储 BookKeeper 采用的方案)消息数据的分段实现根据偏移量定位根据索引定位 (RabbitMQ 和 RocketMQ的思路)使用场景消息数据存储格式…...
JavaScript:隐式转换、显示转换、隐式操作、显示操作
一、理解js隐式转换 JavaScript 中的隐式转换是指不需要显式地调用转换函数,而是在执行期间自动发生的数据类型的转换。即在使用不同类型的值进行操作时,JavaScript会自动进行类型转换。这种转换通常发生在不同数据类型之间进行运算或比较时。 序号分类…...

2023全新TwoNav开源网址导航系统源码 | 去授权版
2023全新TwoNav开源网址导航系统源码 已过授权 所有功能可用 测试环境:NginxPHP7.4MySQL5.6 一款开源的书签导航管理程序,界面简洁,安装简单,使用方便,基础功能免费。 TwoNav可帮助你将浏览器书签集中式管理&#…...

Android 12 源码分析 —— 应用层 六(StatusBar的UI创建和初始化)
Android 12 源码分析 —— 应用层 六(StatusBar的UI创建和初始化) 在前面的文章中,我们分别介绍了Layout整体布局,以及StatusBar类的初始化.前者介绍了整体上面的布局,后者介绍了三大窗口的创建的入口处,以及需要做的准备工作.现在我们分别来细化三大窗口的UI创建和…...

华为云ROMA Connect亮相Gartner®全球应用创新及商业解决方案峰会,助力企业应用集成和数字化转型
9月13日-9月14日 Gartner全球应用创新及商业解决方案峰会在伦敦举行 本届峰会以“重塑软件交付,驱动业务价值”为主题,全球1000多位业内专家交流最新的企业应用、软件工程、解决方案架构、集成与自动化、API等企业IT战略和新兴技术热门话题。 9月13日…...

虚拟线上发布会带来颠覆性新体验,3D虚拟场景直播迸发品牌新动能
虚拟线上发布会是近年来在数字化营销领域备受关注的形式,而随着虚拟现实技术的不断进步,3D虚拟场景直播更成为了品牌宣传、推广的新选择。可以说,虚拟线上发布会正在以其颠覆性的新体验,为品牌带来全新的活力。 1.突破时空限制&am…...
Linux arm64 pte相关宏
文章目录 一、pte 和 pfn1.1 pte_pfn1.2 pfn_pte 二、其他宏参考资料 一、pte 和 pfn // linux-5.4.18/arch/arm64/include/asm/pgtable.h#define pte_pfn(pte) (__pte_to_phys(pte) >> PAGE_SHIFT) #define pfn_pte(pfn,prot) \__pte(__phys_to_pte_val((phys_addr_t)…...
MVCC:多版本并发控制案例分析(一)
(笔记总结自b站马士兵教育课程) 一、简介 MVCC:全称multi-version Concurency control,多版本并发控制,是为了解决并发读写问题存在的。MVCC的实现原理由三部分组成:隐藏字段、undolog、readview。 二、概…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...