第五章:表达式基础与详述(三)

本文详细介绍了C++中的自增和自减运算符,包括前缀和后缀的区别,以及它们在表达式中的求值顺序。此外,还讨论了成员访问操作符、条件操作符、逗号操作符和sizeof运算符的用法。C++17以后的规范对表达式求值顺序进行了明确,保证了在某些情况下的求值顺序。
摘要由CSDN通过智能技术生成

表达式详述

自增与自减运算符

自增与自减运算符:++--,它最基本的含义与x = x +/- 1等价。在使用自增和自减运算符时我们需要注意以下几点

  • 自增和自减运算符分为前缀和后缀两种
    int x = 3;
    int y ;
    int z ;
    y = x++;				// y = 3,x = 4
    
    y = ++x;				// y = 4,x = 4
    

    后缀自增运算符返回x变化之前的值,前缀自增运算符返回x变化之后的值,对于自减运算符也是类似的

  • 自增和自减运算符是右结合的
  • 自增和自减运算符的操作数为左值,前缀时返回左值,后缀时返回右值(临时对象)
    ++(++x);					// 合法的代码
    (x++)++;					// 非法的代码
    
  • 使用前缀形式会更加高效,可能的情况下尽量使用前缀形式

其他操作符

除了前面所述的操作符,还有一些其他的操作符

  • 成员访问操作符,用于结构体和类中:.->。关于成员访问操作符我们需要注意以下几点

    1. ptr->等价于(*ptr).
    2. .的操作数可以是左值也可以是右值,如果操作数是左值则返回左值,如果操作数是右值则返回将亡值
      	struct Str{
      		int x;
      	}
      	int main(){
      	Str A;
      	A.x;		// 左值
      	Str().x;	// 将亡值
      	}
      
    3. ->的左操作数为一个指针,返回值为左值
  • 条件操作符:条件操作符是C++中唯一的三元操作符:条件?条件为真的分支1 :条件为假的分支2,关于条件操作符我们需要注意以下几点

    1. 条件操作符接收一个可以转换为bool类型的表达式与两个类型相同的表达式,其中只有一个表达式会被求值
    2. 如果后两个表达式均为左值,则条件操作符构成的表达式返回左值,否则返回右值
    3. 条件操作符是右结合的
  • 逗号操作符:逗号操作符确保操作数会被从左向右求值,求值的结果为右操作数,它是左结合的

    注意函数调用中的,不是逗号操作符,也不会进行求值并返回一个求值结果

  • sizeof操作符:sizeof操作符的操作数可以是一个类型或者一个表达式,它返回类型或表达式的返回类型对应的对象的尺寸。关于sizeof表达式我么你需要注意,它并不会实际求值,而是只返回相应的尺寸,比如

    int * ptr = nullptr;
    sizeof(*ptr);				// 语句合法,并不会实际求值,只返回相应的尺寸
    

除了这些,还剩下一些非常简单,不需要额外说明的操作符

  • 域解析操作符:::
  • 函数调用操作符:()
  • 索引操作符:[]
  • 抛出异常操作符:throw

C++17对表达式求值顺序的限定

在C++17以后,在以下表达式中,可以确保e1会先于e2被求值

  • e1[e2]
  • e1.e2
  • e1.*e2
  • e1->e2
  • e1<<e2
  • e1>>e2
  • e2=e1/e2+=e1/e2*=e1等等

同时在使用new Type(e)时会确保e在分配内存之后被求值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值