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. vue.js(09)--v-for中的key

    v-for中key的使用注意事项 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  2. 一、WebApi模型验证实践项目使用

    一.启语 前面我们说到,模型验证的原理(包含1.项目创建,2.模型创建,3.走通测试模型验证,4.在过滤器中处理返回json格式(非控制器内))-完全是新手理解使用的,新番理解 通常情况下,对于那些经 ...

  3. 五 shell 变量与字符串操作

    特点:1 shell变量没有数据类型的区分 2 Shell 把任何存储在变量中的值,皆视为以字符组成的“字符串”.    3  设定的变量值只在当前shell环境中有作用    4   不能以数字开头 ...

  4. 01.基础架构:一条SQL查询语句是如何执行的?学习记录

    01.基础架构:一条SQL查询语句是如何执行的?学习记录http://naotu.baidu.com/file/1c8fb5a0f2497c3a2655fed89099cb96?token=ff25d ...

  5. Ansible用法playbook

    playbook文件 hello.yml --- - name: test_tasks [各个任务的总描述] hosts: webserver remote_user: root gather_fac ...

  6. jsonp跨域获取数据实现百度搜索

    本菜鸡最近在写某个页面请求数据时,报了如下的错误. Failed to load https://...:No 'Access-Control-Allow-Origin' header is pres ...

  7. 洛咕P4180 严格次小生成树

    鸽了很久的一道题(?)貌似是去年NOIP前听的emm... 首先我们分析一下最小生成树的性质 我们kruskal建树的时候呢是从小到大贪心加的边,这个的证明用到拟阵.(我太菜了不会) 首先我们不存在连 ...

  8. 20_1.Condition

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas ...

  9. Code Review怎样做好

    一.背景 最近随着交易业务快速扩展,研发组内新项目及新成员越来越多,如何做好Code Review,把控研发人员开发代码质量很是关键. 对于大部分业务团队,谈到Code Review就会面露哀状:   ...

  10. thinkphp 配置格式

    ThinkPHP支持多种格式的配置格式,但最终都是解析为PHP数组的方式. PHP数组定义 返回PHP数组的方式是默认的配置定义格式,例如: //项目配置文件 return [ // 默认模块名 'd ...