C++程序设计教程课本错误
偶然看到课本中在逻辑表达式部分这样说到:
#include <iostream>
using namespace::std;
int mian(){
int a = 0,b = 2, c = 3;
float x = 1.8, y = 2.4;
//此处的值为1
cout << (a>b && a<c || (x>y)-!a) << endl;
return 0;
}
课本说到上面表达式的求值顺序为:先求a>b,值为0,再求出a<c,值为1,再求0&&1,值为0;下面求x>y,值为0,再求!a,值为1,再求0-1,值为-1,作为逻辑值为1,最后求0||1,值为1。最后整个表达式的值为1。
但其实,在逻辑表达式的真正运算过程中,对于” && “运算符,若在运算符左边的值为0,那么右边的运算是不会进行的;对于” || “运算符,只有在左边的值为0时,才会对运算符右边的值进行运算。
可以通过以下代码进行验证:
#include <iostream>
using namespace::std;
int main(int argc, char *argv[]) {
enum color{RED=1,YELLOW,BLUE} c1=BLUE,c2;
int a = 0, b = 0;
//此处使用++a,如果&&运算符的右边进行了运算,
//那么下面输出的a就应该是1 ,
//否则为0
if(0 && ++a)
cout << "a自增不了,而我也不会被执行!" << endl;
cout << a << endl;
if(1 && ++a)
cout << "a自增了!" << endl;
cout << "a = " << a << endl;
if(1 || ++b)
cout << "b自增不了的!" << endl;
cout << "b = " << b << endl;
if(0 || ++b)
cout << "b自增了!" << endl;
cout << "b = " << b << endl;
return 0;
}
当然,抛开这道题,只考虑逻辑表达式的求值顺序,那么课本的说法就是对的,不过我只是觉得它这样的说法会引起不必要的误会。
发布的时候。。。明明分类是C++,但是它老是显示C+,有点迷。。C算了。。