1. 程式人生 > >C++數值比較時遇到的問題

C++數值比較時遇到的問題

平時我寫程式的時候遇到要放在一個區間的數值的時候總是習慣的用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$ 

雖然這是一個很簡單很基礎的東西,但是如果沒有良好的習慣或者細心真的注意不到這裡。