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

举报
看,未来 发表于 2021/10/24 16:48:13 2021/10/24
【摘要】 @[toc] 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,-...

@[toc]

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;
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。