1,逻辑运算符的原生语义:

1,操作数只有两种值(true 和 false);

1,C 语言中只有非 0 和 0;

2,逻辑表达式不用完全计算就能确定最终值;

1,短路规则;

3,最终结果只能是 true 或者 false;

2,逻辑表达式编程实验:

1,main.cpp 文件:

 #include <iostream>
#include <string> using namespace std; int func(int i)
{
cout << "int func(int i) : i = " << i << endl; return i;
} int main()
{
if( func() && func() ) // func(1) 不会被调用;
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
} cout << endl; if( func() || func() ) // func(0) 和 func(1) 都被调用;
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
} return ;
}

3,逻辑操作符可以重载吗?重载逻辑操作符有什么意义?

1,可以重载;

4,重载逻辑操作符编程实验:

1,main.cpp 文件:

 #include <iostream>
#include <string> using namespace std; class Test
{
int mValue;
public:
Test(int v)
{
mValue = v;
}
int value() const
{
return mValue;
}
}; /* 逻辑操作符必须返回 bool 类型 */
bool operator && (const Test& l, const Test& r)
{
return l.value() && r.value();
} bool operator || (const Test& l, const Test& r)
{
return l.value() || r.value();
} Test func(Test i)
{
cout << "Test func(Test i) : i.value() = " << i.value() << endl; return i;
} int main()
{
Test t0();
Test t1(); if( func(t0) && func(t1) ) // ==> operator && (func(t0), func(t1))
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
} cout << endl; if( func() || func() ) // ==> operator || (func(0), func(1))
{
cout << "Result is true!" << endl;
}
else
{
cout << "Result is false!" << endl;
} return ;
}

 2,输出结果:

 Test func(Test i) : i.value() =
Test func(Test i) : i.value() =
Result is false! Test func(Test i) : i.value() =
Test func(Test i) : i.value() =
Result is true!

3,重载的逻辑操作符都是从左向右调用操作数,短路规则不再适用;

5,重载逻辑操作符:

1,问题的分析:

1,C++ 通过函数调用扩展操作符的功能;

1,调用重载函数需要将两个操作数传递给函数进行调用,这就是问题的本质;

2,进入函数体前必须完成所有函数参数的计算;

3,函数参数的计算次序是不定的;

4,短路法则完全失效;

2,逻辑操作符重载后无法完全实现原生的语义;

1,无法通过函数调用满足短路规则;

3,一些有用的建议:

1,实际工程开发中避免重载逻辑操作符;

2,通过重载比较操作符代替逻辑操作符重载;

1,将一个对象与 true 或 false 比较,来重载;

3,直接使用成员函数代替逻辑操作符重载;

4,使用全局函数对逻辑操作符进行重载;

1,当必须实现逻辑操作符的重载时,用全局函数实现;

6,小结:

1,C++ 从语法上支持逻辑操作符重载;

2,重载后的逻辑操作符不满足短路法则;

3,工程开发中不要重载逻辑操作符;

4,通过重载比较操作符替换逻辑操作符重载;

5,通过专用成员函数替换逻辑操作符重载;

C++中逻辑操作符的重载分析的更多相关文章

  1. python中的逻辑操作符

    python中主要有三个逻辑操作符,分别是:and.or.not. and:且,所有人为真才为真. or:或,一个为正就是真. not:非,取反. >>> print(3>2 ...

  2. php逻辑操作符中&和&&的异同

    php有5种算术操作符(+ - * / %),6种赋值操作符(+= -= *= /= %= .=),8种比较操作符(=== < > <= >= != <> !==) ...

  3. Linux Shell脚本逻辑操作符简介

    在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...

  4. 逻辑操作符---Lua: and,or,not 对比 C++:&&,||,!

    lua中有三个逻辑操作符:and,or,not(逻辑与,逻辑或,逻辑非),同样c++也有类似的三个逻辑操作符:&&,||,!(逻辑与,逻辑或,逻辑非).他们的运算对象就是真和假.lua ...

  5. 你好,C++(17)0.1*10不等于1.0——4.1.4 关系操作符4.1.5 逻辑操作符

    4.1.4  关系操作符 在C++中,除了需要用算术操作符对数据进行加减乘除的算术操作之外,我们有时候还需要对数据之间的关系进行操作,也就是对两个数据进行大小比较,得出它们之间的大小关系.在现实世界中 ...

  6. Javascript赋值语句中的“&&”操作符和"||"操作符

    有这么一种常见的语句: var a = a || 4; 那赋值语句中的"&&"操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数 ...

  7. shell 的条件表达式及逻辑操作符简单介绍

    查看系统的shell: cat /etc/shells 文件测试表达式: -f 文件  文件存在且为普通文件则真,即测试表达式成立. -d 文件  文件存在且为目录文件则真,即测试表达式成立. -s ...

  8. shell 中的操作符

    1.算术操作符 2.关系操作符 3.布尔操作符 4.字符串操作符 5.文件相关操作符 算术操作符 bash shell 没有提供任何机制来执行简单的算术运算,不过我们可以借助于一些其他程序,如 exp ...

  9. 《C++ Primer Plus》读书笔记之四—分支语句和逻辑操作符

    第六章 分支语句和逻辑操作符 1.&&的优先级低于关系操作符. 2.取值范围:取值范围的每一部分都使用AND操作符将两个完整的关系表达式组合起来: if(age>17&& ...

随机推荐

  1. MVC与设计模式的关系及MVC的实现原理和设计原理

    1 MVC介绍 众所周知MVC不是设计模式,是一个比设计模式更大一点的模式,称作设计模式不合理,应该说MVC它是一种软件开发架构模式,它包含了很多的设计模式,最为密切是以下三种:Observer (观 ...

  2. PHP算法[转]

    这里是用PHP写的几个基础算法,算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重 要的,经典名句:算法+数据结构=程序.作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序 ...

  3. centos GIT安装

    [注](yum 源仓库里的 Git 版本更新不及时,最新版本的 Git 是 1.8.3.1,但是官方最新版本已经到了 2.9.2.想要安装最新版本的的 Git,只能下载源码进行安装.) 安装git服务 ...

  4. linux篇—Nginx反向代理负载均衡

    一.环境准备 反向代理功能架构 3台web服务器,组建出web服务器集群 web01 10.0.0.7 172.16.1.7 web02 10.0.0.8 172.16.1.8 web03 10.0. ...

  5. Linux系统理解以及Linux系统学习心得

    原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Lin ...

  6. MySQL中常见函数

    一.日期函数 1.NOW()   返回当前日期和时间 mysql> SELECT NOW(); +---------------------+ | NOW() | +-------------- ...

  7. hive中为分区表增加字段需要注意默认不会修改已有分区的字段,导致查询时新增字段为null

    若向hive表添加字段,通常会使用下面这种语句 alter table default.testparquet add columns(c8 string); 但是对于分区表来说, 1. 若新建的分区 ...

  8. vagrant(二)配置文件vagrantfile详解 以及安装php、nginx、mysql

    上一篇文章完整的讲叙了如何安装一个vagrant的环境.这里主要说一说vagrant的配置文件Vagrantfile. 一 配置详解 在我们的开发目录下有一个文件Vagrantfile,里面包含有大量 ...

  9. 03 spring security执行流程分析

    spring security主要是依赖一系列的Filter来实现权限验证的,责任链设计模式是跑不了的.下面简单记录一下spring操作这些Filter的过程. 1. WebSecurityConfi ...

  10. webpack使用问题记录

    1.版本问题 webpack的安装并不是越新越好.当使用最新版本时不使用配置文件,直接编译不生成文件甚至报错:使用3.12版本时编译文件可以成功但是不生成新文件:使用 3.5.3 版本时成功且生成新文 ...