C++数值比较时遇到的问题

本文揭示了C++中使用连续比较符(如i<j<k)的常见误区,通过实例展示了这种写法如何导致逻辑错误,并提供了正确的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平时我写程序的时候遇到要放在一个区间的数值的时候总是习惯的用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的数了。

zeng@sanko:~/workspace$ g++ -o test test.cpp
zeng@sanko:~/workspace$ ./test
2
true
zeng@sanko:~/workspace$ g++ -o test test.cpp
zeng@sanko:~/workspace$ ./test
12
true
zeng@sanko:~/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

zeng@sanko:~/workspace$ g++ -o test test.cpp
zeng@sanko:~/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;
}
zeng@sanko:~/workspace$ g++ -o test test.cpp
zeng@sanko:~/workspace$ ./test 
2
true
zeng@sanko:~/workspace$ ./test 
6
false
zeng@sanko:~/workspace$ 

虽然这是一个很简单很基础的东西,但是如果没有良好的习惯或者细心真的注意不到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值