随笔

本文指出了一本C++教程中关于逻辑表达式求值顺序的错误解释,并通过示例代码验证了逻辑运算符“&&”和“||”的实际求值行为。作者强调了正确的逻辑表达式求值规则,避免读者产生误解。

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算了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值