服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++超详细讲解逻辑操作符

C++超详细讲解逻辑操作符

2022-12-13 14:20清风自在 流水潺潺 C/C++

在C语言中,逻辑运算符有&&、||、!;&&表示“与”的意思,需要两端的表达式的值都为true,该式的值才为true。||表示“或”的意思,两端的表达式的值只要有一端为true,该式的值就为true。!表示“非”的意思,将该式的真值换成相

一、逻辑运算符的原生语义

  1. 操作数只有两种值( true和 false )逻
  2. 辑表达式不用完全计算就能确定最终值
  3. 最终结果只能是 true 或者 false

下面看一个逻辑表达式的代码:

#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(0) && func(1))
  {
      cout << "Result is true!" << endl;
  }
  else 
  {
      cout << "Result is False!" << endl;
  }
  cout << endl;
  if (func(0) || func(1))
  {
      cout << "Result is true!" << endl;
  }
  else 
  {
      cout << "Result is False!" << endl;
  } 
  return 0;
}

输出结果如下:

C++超详细讲解逻辑操作符

这就是逻辑操作符的短路规则,可以参照我之前写的详细讲解逻辑运算符的使用

 

二、重载逻辑操作符

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

下面看一个重载逻辑操作符示例:

#include <iostream>
using namespace std;
class Test
{
  int mValue;
public:
  Test(int v)
  {
      mValue = v;
  }
  int value() const
  {
      return mValue;
  }
};
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(0);
  Test t1(1);
  if (func(t0) && func(t1))
  {
      cout << "Result is true!" << endl;
  }
  else
  {
      cout << "Result is false!" << endl;
  }
  cout << endl;
  if (func(t0) || func(t1))
  {
      cout << "Result is true!" << endl;
  }
  else
  {
      cout << "Result is false!" << endl;
  }
}

输出结果如下:

C++超详细讲解逻辑操作符

按照短路法则,func(t0) && func(t1) 应该只执行 func(t0),这里却输出了func(t0) 和 func(t1) 运行后的值,这是为什么呢?且看下面解析。

问题的本质分析

  1. C++ 通过函数调用扩展操作符的功能
  2. 进入函数体前必须完成所有参数的计算
  3. 函数参数的计算次序是不定的
  4. 短路法则完全失效

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

上述代码等效写法如下:

#include <iostream>
using namespace std;
class Test
{
  int mValue;
public:
  Test(int v)
  {
      mValue = v;
  }
  int value() const
  {
      return mValue;
  }
};
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(0);
  Test t1(1);
  if (operator && (func(t0), func(t1)))
  {
      cout << "Result is true!" << endl;
  }
  else
  {
      cout << "Result is false!" << endl;
  }
  cout << endl;
  if (operator || (func(t0), func(t1)))
  {
      cout << "Result is true!" << endl;
  }
  else
  {
      cout << "Result is false!" << endl;
  }
}

输出结果和上面一样:

C++超详细讲解逻辑操作符

将func(t0) && func(t1) 改写成operator && (func(t0), func(t1)),就不难理解为什么了。核心就两点:

1.进入函数体前必须完成所有参数的计算

2.函数参数的计算次序是不定的

一些有用的建议

  • 实际工程开发中避免重载逻辑操作符
  • 通过重载比较操作符代替逻辑操作符重载
  • 直接使用成员函数代替逻辑操作符重载
  • 使用全局函数对逻辑操作符进行重载

 

三、小结

  • C++ 从语法上支持逻辑操作符重载
  • 重载后的逻辑操作符不满足短路法则
  • 工程开发中不要重载逻辑操作符
  • 通过重载比较操作符替换逻辑操作符重载
  • 通过专用成员函数替换逻辑操作符重载

到此这篇关于C++超详细讲解逻辑操作符的文章就介绍到这了,更多相关C++逻辑操作符内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43129713/article/details/124550630

延伸 · 阅读

精彩推荐
  • C/C++探讨C语言的那些小秘密之断言

    探讨C语言的那些小秘密之断言

    我尽可能的把我所理解的断言的使用讲解清楚,希望我在此所讲的断言能够对你有所帮助,让你以后能够在代码中灵活使用断言...

    C语言教程网7422020-12-31
  • C/C++C++获取本地时间常见方法汇总

    C++获取本地时间常见方法汇总

    这篇文章主要介绍了C++获取本地时间的常见方法,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下...

    Dabelv6632021-09-27
  • C/C++C语言实现猜数字

    C语言实现猜数字

    这篇文章主要为大家详细介绍了C语言实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    hairrrrr8382021-08-11
  • C/C++C语言三种方法解决轮转数组问题

    C语言三种方法解决轮转数组问题

    这篇文章主要给大家讲解轮转数组的问题,一个问题不局限于一种解法,希望你看了本文的解决方法以后可以举一反三自己编写,这样你的技术水平会有质...

    平凡的人15682022-11-14
  • C/C++C语言的语法风格与代码书写规范指南

    C语言的语法风格与代码书写规范指南

    这篇文章主要介绍了C语言的语法风格与代码书写规范指南,文中主张了一些诸如变量和结构体的命名规范等细节方面的问题,需要的朋友可以参考下...

    C语言教程网10782021-03-24
  • C/C++详解C++实现链表的排序算法

    详解C++实现链表的排序算法

    链表排序思想和数组排序类似,区别就是数组遍历容易,数据交换也容易;链表(单项链表)只能一个方向遍历,不能逆序遍历,且不能随机访问,所以排序...

    Ouyang_Lianjun5502021-11-15
  • C/C++C++常用函数之XML JSON格式转换问题

    C++常用函数之XML JSON格式转换问题

    XML在Json出现前应用很广泛,灵活性好,应用语言也没有限制,发展了这么长时间后xml标准已经很臃肿。这篇文章主要介绍了C++常用函数之XML JSON格式转换问...

    程序员的成长10962021-08-20
  • C/C++详解C++编程中表达式的语义与计算顺序

    详解C++编程中表达式的语义与计算顺序

    这篇文章主要介绍了C++编程中表达式的语义与计算顺序,是C++入门学习中的基础知识,需要的朋友可以参考下...

    C++教程网12602021-03-19