20.C++- &&,||逻辑重载操作符的缺陷、,逗号重载操作符的分析

大家,都知道"&&","||"拥有"短路"功能

  • 比如a=(0&&b) :  由于第一个操作数为0,所以不会去判断b的内容,直接执行a=0
  • 比如a=(-100||b): 由于-100不为0,所以不会去判断b的内容,直接执行a=1

可以参考下面代码:

运行打印:

并没有调用func(100)函数,同样"||"逻辑操作符也具有拥有"短路"功能

||"就不会具备"短路"功能

参考以下示例:

打印:

从结果看出,调用了func(t0)和func(t1),并且调用顺序是从右往左的.

这是因为执行func(t0)&&func(t1)时:

编译器实际是执行的operator && (func(t0), func(t1))函数,所以需要进入func()初始化两个参数

然后通过下面代码, 发现参数初始化顺序是从右往左的:

运行打印:

首先回顾下编译器自带的","逗号操作符

  • 逗号表达式前N-1子表达式不需要返回值
  • 逗号表达式从左往右计算,且最终的值等于最后一个表达式的值

比如:

  • 逗号表达式,通过()圆括号来表示

比如:

编译器实际是执行的operator , (t1+1, t2+2)重载操作符函数.

由于初始化参数的顺序是从右往左初始化的,所以执行顺序变反了,先执行t2+2.

总结:

其实使用编译器自带的","逗号操作符,用在对象上也能成功,因为","主要就是用来隔离代码运行,并返回最后一个参数的值.不会参与对象的运算.

所以在以后的开发中,不要重载","逗号操作符



文章来源:https://www.cnblogs.com/lifexy/p/8660910.html

原文地址:https://www.cnblogs.com/xiongjim/p/9673939.html

时间: 2024-10-16 01:06:02

20.C++- &&,||逻辑重载操作符的缺陷、,逗号重载操作符的分析的相关文章

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、>>和<<运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

C++ Primer笔记10_运算符重载_赋值运算符_进入/输出操作符

1.颂值运营商 首先来福值运算符引入后面要说的运算符重载.上一节说了构造函数.拷贝构造函数:一个类要想进行更好的控制.须要定义自己的构造函数.拷贝构造函数.析构函数.当然,还有赋值运算符.常说的三大函数就是指拷贝.赋值.析构. 假设一个类不定义自己的赋值运算符.会自己生成一个默认的赋值运算操作.这个默认的赋值运算满足一般类的需求.它实现的是一个浅拷贝.可是当类的功能.作用逐渐完好时,就会出现非常多问题.所以,通过自己定义赋值运算符来控制赋值操作时类的行为是非常有必要的.当一个类的对象与对象之间发

C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函数调用的方式,只有在设计涉及的代码更容易写,尤其是更容易读的时候才有必要重载. 2.实现运算符重载的方式 类的成员函数 友元函数(即类外的普通函数) 3.运算符重载的原则: 不能重载的运算符有5个:  .  .*  ?: ::  sizeof 运算符重载不允许发明新的运算符 不能改变运算符操作对象的

JavaScript操作符(关系操作符、相等操作符和条件操作符)

关系操作符用于对两个值进行比较,返回一个布尔值.关系操作符包括大于(>),小于(<),大于等于(>=),小于等于(<=).当关系操作符用于非数值时,也要先进行数值的转换.如 var result=5>3; 1.尝试将两个操作符转换为数字: 2.如果两个操作符均为字符串,则进行字符串的比较 3.如果任一表达式为NaN,则返回false: 4.-0等于+0: 5.负无穷小于包含自身在内的任何数 6.正无穷大于包含自身在内的任何数 相等操作符,用于确定两个变量是否相等.字符串.数值

从一个二级题来看成员函数重载运算符和友元函数重载运算符

先上题:下列运算符都可以被友元函数重载的是: A)=,+,-,\ B)[],+,(),new C)->,+,*,>> D)<<,>>,+,* 正确答案为D 我们知道,在运算符重载,友元函数运算符重载函数与成员运算符重载函数的区别是:友元函数没有this指针,而成员函数有,因此,在两个操作数的重载中友元函数有两个参数,而成员函数只有一个. 因此,我们可以总结如下: 1.对双目运算符而言,成员函数重载运算符的函数参数表中只有一个参数,而用友元函数重载运算符函数参数表中

Win32 API编程:WinMain无法重载函数或_tWinMain无法重载

#include "windows.h" #include "tchar.h" int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { MessageBox(NULL, TEXT("Hello,World!"), TEXT("haha"), MB_OK); return 0;

为什么C不支持重载,而C++支持重载?

C语言不支持重载,C++可以支持重载.这是什么原因呢? 在编译过程中需要将obj文件进行link,link负责将每一个obj中的符号查找表中的东西转换为一个地址,这个地址就是最后编译完成后的exe文件的函数对应这个函数的入口地址. 一个简单函数: int Test(); 按C语言方式的命名方式(_cdecl):_Test 按C++方式的命名(_stdcall)  :[email protected]@YAHXZ   ? 和 @@YAH 是用来表示调用协议的, 其中的H为返回值是int X表示没有

操作符重载之解引用与箭头操作符

箭头操作符与众不同.它可能表现得像二元操作符一样:接受一个对象和一个成员名,对对象解引用以获取成员.不管外表如何,箭头操作符不接受显式形参.这里没有第二个形参,因为 -> 的右操作数不是表达式,相反,是对应着类成员的一个标识符.没有明显可行的途径将一个标识符作为形参传递给函数,相反,由编译器处理获取成员的工作. 理解1 当这样编写时:point->action();由于优先级规则,它实际等价于编写:(point->action)();换句话说,我们想要调用的是对 point->ac