c++表达范围勿用数学符号
目的
遇上了一个C++基础问题,一下子陷到里面,不知怎么回事了,知道后,又感觉太可笑。
这也许就是成长的代价。
下面就是细说说所遇上的问题。
关于C++逻辑的一些知识点:
定义:
用逻辑运算符将两个表达式链接起来的式子称为逻辑表达式。
注意说明:
(1)c语言编译系统在给出逻辑运算结果时,以数字1表示 “真” ,以数字0表示 “假” 。
(2)在判断一个量是否为 “真” 时,以0表示 “假” ,以非0表示 “真” 。
问题分析
一段代码总是结果不是自己所预想的(我是想着b的值应该在a值与c值的中间),输出结果却不是在中间,非常的奇怪:
int main()
{
double a = 0.0;
double b = 0.123;
double c = 0.1433;
if (a <= b < c)
{
cout <<"b is between a and c"<<endl;
}
else
{
cout << "b is not between a and c" << endl;
}
}
运行结果如下:
我就是感觉奇怪了,b明明就是在a和c中间啊,b是0.123,显然大于0.0,而小于0.1433,怎么程序的结果竟然是:
b is not between a and c
这也是真奇怪了!
真是想不明白了!
问了问群里的高手们,交流如下:
基础中的基础,太不好意思了。
继续问:
根据上面的提醒改成这样就可以了:
int main()
{
/*
double y = 0.0;
vector<double> score = {60, 70, 100};
vector<double> bonus= {1, y, 10 };
cout << "bonus is: " << calcLinearValue(bonus[2], score[2], bonus[0], score[0], score[1]) << endl;
*/
double a = 0.0;
double b = 0.123;
double c = 0.1433;
if ((a <= b) && (b < c))
{
cout <<"b is between a and c"<<endl;
}
else
{
cout << "b is not between a and c" << endl;
}
}
输出结果:
这样就与预想的一样了,哈哈!
总结
这种错误,其实就是把数学的表达,带到程序来了。
在C++ primer plus书籍中P157,专门提到了这一点:
取值范围的测试的每一部分都使用AND操作符将两个完整的关系表达式组合起来。
if(age > 17 && age < 35) //OK
不要使用数学符号将其表示为:
if(17 < age <35) //Don’t do this!
编译器不会捕获这种错误,因为它仍然是有效的C++语句。<操作符从左到右结合,因此上述表达式的含义如下:
if((17<age) < 35)
但17<age的值要么为true(1),要么为false(0)。
不管是哪种情况,表达式17<age的值都小于25,因此整个测试的结果总是true.
最后,以图说明: