问题解决:当 -1 > 2 一直被判定为 true 的时候,我差点崩溃
【摘要】 @[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)