C++数值比较时遇到的问题
程序员文章站
2022-03-13 22:52:20
...
平时我写程序的时候遇到要放在一个区间的数值的时候总是习惯的用i<j<k这种形式,说实话程序没有报错是真的没有注意到这个错误,直到前面一段时间写opencv程序的时候发现没办法这样比较,当时还没有想到这里去,只觉得是自己的那个地方写错了,最近看c++ primer的时候才发现这种写法是错的。下面举一个例子来说明。
#include <iostream>
using namespace std;
int main()
{
int i;
cin>>i;
if(1<i<10)
{
cout<<"true"<<endl;
}
else
{
cout<<"false"<<endl;
}
return 0;
}
上面这段程序如果输入大于1小于10的数的时候应该会输出true,大于10以后的数都会输出false,然而实际情况是都是输出的true,因为第一次与1比较的时候返回的一个布尔值,程序将他装换成了0或者1,也就是true或false,这样无论输入的数字是几都会返回1或0再与后面的10进行比较,所以无论怎么都是小于10的数了。
[email protected]:~/workspace$ g++ -o test test.cpp
[email protected]:~/workspace$ ./test
2
true
[email protected]:~/workspace$ g++ -o test test.cpp
[email protected]:~/workspace$ ./test
12
true
[email protected]:~/workspace$
我们修改一下程序就知道怎么回事了
#include <iostream>
using namespace std;
int main()
{
double i;
cin>>i;
if(0 < i < 0.5)
{
cout<<"true"<<endl;
}
else
{
cout<<"false"<<endl;
}
return 0;
}
如果我输入0.3应该返回true,但是实际返回的是false
[email protected]:~/workspace$ g++ -o test test.cpp
[email protected]:~/workspace$ ./test
0.3
false
因为0.3与0比较返回1,1大于0.5就会输出false了。
所以实际的比较不能这么写,下面是修改之后的代码
#include <iostream>
using namespace std;
int main()
{
int i;
cin>>i;
if(0 < i && i < 5)
{
cout<<"true"<<endl;
}
else
{
cout<<"false"<<endl;
}
return 0;
}
[email protected]:~/workspace$ g++ -o test test.cpp
[email protected]:~/workspace$ ./test
2
true
[email protected]:~/workspace$ ./test
6
false
[email protected]:~/workspace$
虽然这是一个很简单很基础的东西,但是如果没有良好的习惯或者细心真的注意不到这里。
上一篇: 二分查找和顺序查找
下一篇: JS实现队列效果,先进先出
推荐阅读