前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >问题解决:当 -1 > 2 一直被判定为 true 的时候,我差点崩溃

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

作者头像
看、未来
发布2021-10-09 11:51:50
3610
发布2021-10-09 11:51:50
举报
文章被收录于专栏:CSDN搜“看,未来”

文章目录

bug 复现

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

贴个demo:

代码语言:javascript
复制
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 比大小

代码语言:javascript
复制
#include<iostream>
using namespace std;
int main() {
	int a = 1;
	float b= 0.99999999;

	cout << (a > b);
}

试一下。

代码语言:javascript
复制
#include<iostream>
using namespace std;
int main() {
	int a = 1;
	float b= 0.99999998;

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

这样也是没用的哈。

那怎么办?

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

代码语言:javascript
复制
#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、自求多福吧,哪天我灵机一动想到办法了再补进来。


其他

代码语言:javascript
复制
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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • bug 复现
  • 直达病灶
  • 返回值为 size_t 的函数
  • float、double、int 比大小
  • 其他
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档