C编译器剖析_4.2 语义检查_表达式的语义检查(5)_结构体成员选择

本文深入解析了C语言中后缀表达式的语义检查过程,包括成员选择运算符、后加加和后减减表达式的处理方法。通过详细分析,读者将了解到如何正确地对这些复杂表达式进行分析和处理。

4.2.5         成员选择运算符

     在C语言中,结构体struct和联合体union被称为记录类型RecordType,在形如dt.a和ptr->a的后缀表达式中,运算符.和->被称为成员选择运算符。函数CheckMemberAccess()用于对这些表达式进行语义检查,与之相关的代码如图4.2.28所示。在表达式dt.a中,dt和a相当于是运算符.的两个操作数,dt对应的语法树结点的类型应是记录类型,图4.2.28第8行对此进行了判断;而在形如ptr->a的表达式中,ptr对应的结点类型应为“指向记录”的指针,第15行的if语句对此进行了检查。第4行用于对成员选择运算符的左操作数进行语义检查,结构体对象dt可当作左值,由此dt.a也可充当左值,但由于函数的返回值只存放在临时变量中,不可充当左值,所以GetData().a也不可充当左值,第11行对此进行了设置。对ptr->a来说,左操作数不必是左值,即使是个临时变量也可,例如在表达式((Data *)ptr2)->a中,强制转型后的结果((Data*)ptr2)就存放在一个临时变量中,但ptr或((Data *)ptr2)的值代表的是一个可寻址内存单元的地址,所以我们可把ptr->a当作左值来用,第19行完成了这个设置。当然,即便表达式dt.a或者ptr->a对应的语法树结点的lvalue域为1,在对dt.a或者ptr->a进行赋值时,我们还会检查一下其类型信息,看看是否有const限定符,如第27行的注释所示,如果定义dt变量时有const的限定,那么dt.a也相当于有const限定符,第28行的Qualify()函

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值