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

C编译器剖析_4.2 语义检查_表达式的语义检查(3)_字符串与标识符 4.2.3             在这一小节,我们先来分析一下基本表达式PrimaryExpression的语义检查,由C的标准文法,我们可以知道与PrimaryExpression相关的产生式如下所示,即加了一对小括号的表达式(Expression)在语法上也相当于标志符ID、常量CONST和字符串StringLiteral。 primary-expression: 阅读详情

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()函

C编译器剖析_4.2 语义检查_表达式的语义检查(4)_函数调用 4.2.4 函数调用的语义检查      在这一小节中,我们来讨论一下函数调用的语义检查,语法上,函数调用对应的表达式属于后缀表达式PostfixExpression,UCC编译器exprchk.c的函数CheckFunctionCall()完成了对函数调用的语义检查,如图4.2.18所示。在阅读这份代码时,需要对语法分析后为函数调用构造的语法树有较好认识,请先参照”图3.1.21后缀运算符对应 阅读详情

相关推荐

C编译器剖析_5.2.1 中间代码生成及优化_布尔表达式的翻译

5.2  中间代码生成与优化_布尔表达式的翻译     我们仍然按照语法分析和语义检查时的思路,先讨论表达式的翻译,再处理语句。表达式从概念上来说,可分为算术表达式和布尔表达式,在一些编程语言(例如Java)中对这两者是有严格区分的,算术表达式的结果是整数或浮点数,而布尔表达式的结果是逻辑上的真或假。布尔是英国数学家,由于布尔较早进行了关于“与或非”逻辑运算的研究,为了纪念这位先驱,在Java中

SheIsC的专栏 2989

C语言结构体成员大小与偏移量计算原理

结构体是C语言中组织数据的基础方式,其内存布局直接影响程序性能与兼容性。通过sizeof操作符和地址运算可以获取成员大小与偏移量,这些操作在编译期由编译器静态完成,不会产生实际内存访问。理解这种编译期计算机制对开发内存敏感型程序尤为重要,特别是在嵌入式系统、协议解析等需要精确控制内存布局的场景中。本文解析的GET_MEMBER_SIZE和GET_MEMBER_OFFSET宏,通过巧妙利用0地址的象征性计算,实现了安全高效的编译期结构体分析,这种技术在系统编程和性能优化中具有广泛应用价值。

weixin_42591413的博客 341

表达式求值C++代码(含实验报告)

里面包含数据结构代码和实现表达式求值的代码,结构一目了然!还包括实验报告!适用于学生!

C++计算数学表达式的计算器

一个.CPP文件 通过栈匹配运算符,计算字符串类型的数学表达式,支持小数点。 运算符包括: + - * / ( ) ^

(10)Proteus 8.9上的STM32仿真系列(HAL)---freertos

实验设计:通过cubemxide生成freertos工程,然后创建一个 pc13 led灯间隔200ms闪烁的任务。非常遗憾的是proteus8.9仿真失败,实物上没有问题,但还是把流程过一遍。 一、原理图 实物是淘宝上stm32f103 c8t6的核心板,proteus上没有这个芯片,这里图上大概表示一下,用的是核心板自带的pc13引脚的led灯。 二、cubemxide配置 1.RCC如之前工程一样配置 2、配置SYS timebase Source不要使用systick,自己选择一个定时器,我这

qq_35442550的博客 7342

DDR March系列算法整理

一

不吃鱼的猫的博客 1万+

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

weixin_45390670的博客 1869

STM32 HAL库定时器中断实现步进电机S型加减速控制与脉冲精准计数

本文详细介绍了如何使用STM32 HAL库定时器中断实现步进电机的S型加减速控制与脉冲精准计数。通过CubeMX配置定时器、计算PSC和ARR值,并结合S型曲线算法,实现平滑启停和精准定位。文章还提供了脉冲计数方案和常见问题排查技巧,帮助开发者优化步进电机控制性能。

weixin_29189363的博客 373

[ROS] rviz 可视化工具

[ROS] rviz 可视化工具 摄像头没讲 文章目录[ROS] rviz 可视化工具1. todo2. todo*. 参考*. 问题解决*. rough 1. todo 2. todo *. 参考 *. 问题解决 *. rough roscore + rviz

weixin_37834269的博客 2049

脑肿瘤MRI图像分割实战:基于U-Net的深度学习完整指南

脑肿瘤是中枢神经系统最常见的疾病之一,全球每年有超过30万人被诊断为原发性脑肿瘤。在临床诊断和治疗过程中,磁共振成像(MRI)已成为评估脑肿瘤的标准影像学检查方法。然而,手动分割MRI图像中的肿瘤区域是一项耗时且依赖于专家经验的工作,不同医生之间可能存在显著差异。

YOLO 150

7.12真题华为OD机试真题 新系统 - 字符串压缩编码 (Java/Py/C/C++/Js/Go)

7.12真题华为OD机试真题 新系统 - 字符串压缩编码 (Java/Py/C/C++/Js/Go)

算法大师! 835

高精度地图数据的结构

本文是个人在学习高精度地图数据结构的心得,主要是描述高精度地图的几层数据结构以及元数据信息。

qq_40664711的博客 5575

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: C编译器剖析_4.2 语义检查_表达式的语义检查(4)_函数调用
下一篇: C编译器剖析_C类型系统_相容类型Compatible Type
SheIsC
博客等级 码龄12年 224粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值