问题解决:当-1>2一直被判定为true的时候,我差点崩溃(代码片段)

看,未来 看,未来     2023-01-07     309

关键词:

bug 复现

完整代码我就不贴了,带了业务。

贴个demo:

int demo(vector<int> vec,int i)
	while(i<vec.size())
		cout<<(i<vec.size());	//这里endl都接不上
		cout<<endl;
		i++;
	


int main()
	vector<int> vec = 1,2,3,4;
	demo(vec,-1);
	return 0;

好家伙,直接就跳过循环了。
给我唬的一愣一愣的。

我寻思着这个大小也没错啊。。。


直达病灶

1、size() 的返回值是 size_t。(这个我知道啊)
2、size_t是无符号类型。(这个我也知道啊)
3、若和int进行比较时,会先把int类型转换为无符号类型再做比较。(那这个就有点意思了哈)
4、当出现负数,比如-1时,对应的无符号是4294967295,程序将会陷入错误中!(好家伙)

这个,如果不知道其中细节,怎么调试啊?

ssize_t是有符号整型。


返回值为 size_t 的函数

所有的 sizeof 类型函数,比方说这里的 STL size(),又或者 strlen 等,遇到的时候再往这里面添加。

此外,要注意有些函数使用 size_t 类型的参数。

今后遇到有符号数和无符号数之间的运算时要千万小心。如果不放心,那就手动把无符号数强转为有符号数。


float、double、int 比大小

#include<iostream>
using namespace std;
int main() 
	int a = 1;
	float b= 0.99999999;

	cout << (a > b);

试一下。

#include<iostream>
using namespace std;
int main() 
	int a = 1;
	float b= 0.99999998;

	cout << (a > int(b));

这样也是没用的哈。

那怎么办?

一般不会这么刚好哈,那要真这么刚好,你去网上也不好找,我给你提供个方案,瞧好了:

#include<math.h>
#include<iostream>
using namespace std;
int main() 
	int a = 1;
	float b= 1.99999999999;
	int c = ceil(b);
	int d = floor(b);
	cout << c << endl;
	cout << d << endl;


遇到要比较的时候,如果觉得有可能会出现这么刚好的情况,那就先判断一下是不是这么刚好了。

整数向上取整和向下取整都是那个数,一样的。

那判断出来了那么刚好,怎么办?

那我也没办法了,,,,
我觉得吧:
1、回头想想为什么会出现这种情况,是不是前面的设计就出问题了,
2、自求多福吧,哪天我灵机一动想到办法了再补进来。


其他

int main() 
	char c[10] = "12345";

	char *p = c;
	std::cout << p << std::endl;	//c
	std::cout << *p << std::endl;	//c[0]
	std::cout << &p << std::endl;	//p的地址
	std::cout << &c[0] << std::endl;//c
	std::cout << &c << std::endl;	//c[0]的地址
	std::cout << &(*p) << std::endl;	//c
	std::cout << *(&p) << std::endl;	//c
	std::cout << *p+1 << std::endl;	//c[0]的值加一
	std::cout << *p+2 << std::endl;
	std::cout << *(p - 1) << std::endl;//空
	std::cout << *(p + 2) << std::endl;//3
	std::cout << *c << std::endl;
	return 0;


当返回值应该为 true 时,二分查找一直返回 false

...lsewhenthereturnvalueshouldbetrue【发布时间】:2016-06-0421:40:47【问题描述】:我正在使用NetBeans编写一种带有参考编号的图书馆数据库来查找书籍。我同时使用线性搜索和二进制搜索来确定参考号是否在库中,但是当它应该为真时,二... 查看详情

移动端vue界面缓存处理

...西叫keep-alive于是决定使用这个内置组件试试.然后吧发现问题确实能够得到结局但是出了个新问题如图:问题1:界面虽然被缓存但是当退出到前一个页面再进入的时候界面还是被缓存状态,我觉得这是不合理的.问题2:被缓存的界面从... 查看详情

解决vuekeepalive二次进入页面显示首次缓存问题

参考技术A问题场景:当某个带有筛选条件查询列表的页面需要进行缓存,以便不再需要重复进行选择或者输入筛选条件的时候,我们就可以利用keepAlive来进行缓存,但keepAlive也存在着一些坑,这是需要注意的地方。如何利用keepA... 查看详情

hive-3.1.2(五)解决数据倾斜问题和优化

...MapReduce,这次就回归正常shuffle,但是数据分布不均匀的问题再第一次有很大的改善,因此基本解决数据倾斜。再hive里输入如下:或在hive-site.xml里添加如下:当使用以上参数设置时,需要注意sql写的时候,小表一定要在前面(最... 查看详情

解决layui-table复杂表头数据错位问题(代码片段)

如果每个colspan>1的时候应该是没问题如果colspan=1的时候会导致错位    检查表头代码发现colspan=1在去检查表格内容代码发现会把合并的头td也显示出来解决方案:在lay-data里面合并的数据里面增加一个[,colGroup:true]参... 查看详情

ant的坑

  使用ant组件碰到的坑组件名称描述问题解决方案Modal<Modal>{children}</Modal>中,children是只有当第一次visible为true的时候才会创建,所以不要试图在componentDidMount的时候去操作里面的元素1、可以在componentWillReceiveProps... 查看详情

unityguilayout的button怎么判定按住状态

...,如果指针离开按钮,或者离开后重新进入按钮,按钮会一直是Selected状态。只有当指针执行了按下的动作,Selected的状态才会被取消。也就是说,当按钮被Selected之后,只有按别的地方才能让按钮退出Selected的状态。最后,Disable... 查看详情

解决弹出的窗口window.open会被浏览器阻止的问题

问题现象最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,有时候会一直连接,有时候会偶尔拦截,尝试了很多方法,走了很多弯路,总结一下结果分享大家原因分析&深入研究1当浏览器检测到非用户操作产生的... 查看详情

思考2

...些鸡毛蒜皮的小事显得自己的心胸狭窄所以呢 我最近一直情绪不好,甚至有些抑郁,或者说是很抑郁.自己给自己看病把自己判定为抑郁症.好在有个好朋友经常关心我的情绪,关心我的一日三餐,倾听我的烦闷忧愁鸡毛蒜皮的唠叨... 查看详情

内存回收策略

...要理解内存回收机制,有助于程序员规避、排查内存泄漏问题。GC机制,最重要的是三个问题:对象已死对象是否已经死亡,可被回收,经常能听到下面这种说法:引用计数法:给对象中添加一个引用计数器,每当有一个地方引... 查看详情

80端口被pid=4的进程占用的解决方法

目录1、序言2、解决办法 内容1、序言  今天在启动程序内置的Nginx的时候,一直报错说80端口被占用。所以首先通过命令行查询发现80端口被Pid为4的进程占用了,但是通过各种方法都无法将进程结束掉,最后几经曲折终于... 查看详情

腾讯前端经典react面试题(附答案)(代码片段)

...会影响性能,这时就可以使用shouldComponentUpdate来解决这个问题。使用方法如下:shouldComponentUpdate(nexrProps)if(this.props.num===nexrProps.num)returnfalsereturntrue;shouldComponentUpdate提供了两个参数nextProps和nextState,表示下一次props和一次state的值... 查看详情

怎么让android程序一直后台运行,像qq一样不被杀死

...启的时候第一时间上报数据。5、服务器连接。对于以上问题的解决:1、利用广播BroadcastReceiver监听,当系统启动时启动服务service,监听的action是android.intent.action.BOOT_COMPLETED,当服务被kill时在onDestroy()再次启动服务,在onStartComman... 查看详情

hive数据倾斜的原因及主要解决方法

...的任务执行完成,所以会一直看到map100%reduce99%的情况;解决方法:sethive.map.aggr=true;sethive.groupby.skewindata=true;原理:hive.map.aggr=true这个配置代表开启map端聚合;hive.groupby.skewindata=true,当选项设定为true,生成的查询计划会有两个MRJ... 查看详情

什么时候为 recyclerView 使用 hasStableIds true?

...sStableIdstruefortherecyclerView?【发布时间】:2019-10-1822:34:44【问题描述】:我目前正在使用回收站视图的hasStableIds,我有以下观察结果:1)当hasStableIds=false:一旦调用了notifyDataSetChanged(),它会将所有视图变为脏视图并再次 查看详情

区间跳跃问题

区间跳跃问题有时我们会碰到需要跳着区间处理的问题,这个时候目前我接触到的有两种思路:一是利用(set)来处理,因为(set)可以从序列中删除元素,利用好一个或者多个(set),就可以完美地解决问题。二是利用并查集来处理,... 查看详情

ideacrlflf编码问题,解决保存时自动更改换行符

1:检查git配置。  确保git的全局配置、系统配置保持一致的crlf,比如:autocrlf=true  #我公司要求autocrlf=false,我建议用true较好,网上一搜都是true。2:检查idea设置,codestyle  换行符自定,注意codestyle中红色框的选项。idea... 查看详情

题目:三个boolean值至少两个为ture,则判为true(代码片段)

...个为ture,则判为true。解题思路:这题是朋友问我的一个问题,网上查了下,发现是一道面试题。该题的解决方案有很多,我使用的方法如下表格所示。首先求出a异或b,然后发现,当a(oplus)b=0的时候,结果为a的值;当a(oplus)b=1的... 查看详情