不考虑公共子表达式优化,将表达式 x=a*b+c 翻译为四元式序列。下列结果正确的是()。
按运算优先级先计算 a*b,得到临时结果 t1;再计算 t1+c,得到 t2;最后把 t2 赋给 x。四元式一般写成(操作符,参数1,参数2,结果),赋值只有一个源操作数,因此未使用的参数位置可记为“-”。
选项分析
错误。先做了 a+b,改变了原表达式的运算顺序;最后赋值的源和目标也写反了。
错误。把赋值误写成二元操作,并漏掉了加法步骤。
正确。先乘后加再赋值,参数与结果位置都符合四元式格式。
错误。把结果变量放在了参数位置,既不符合四元式字段顺序,也没有正确保存中间结果。
本题为什么容易错
四元式最容易错的不是优先级,而是把 result 当成第一个参数。尤其赋值四元式,不同资料可能写成 (=,t2,-,x) 或 (:=,t2,-,x),符号可以有差异,但源值和目标变量的位置不能反。
简短答案
表达式 x=a*b+c 的四元式怎么写,正确答案是 C((*,a,b,t1),(+,t1,c,t2),(=,t2,-,x))。按运算优先级先计算 a*b,得到临时结果 t1;再计算 t1+c,得到 t2;最后把 t2 赋给 x。四元式一般写成(操作符,参数1,参数2,结果),赋值只有一个源操作数,因此未使用的参数位置可记为“-”。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| (+,a,b,t1),(*,t1,c,t2),(=,x,-,t2) | 本题干扰项 | 错误。先做了 a+b,改变了原表达式的运算顺序;最后赋值的源和目标也写反了。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| (=,a,b,t1),(*,t1,c,x) | 本题干扰项 | 错误。把赋值误写成二元操作,并漏掉了加法步骤。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| (*,a,b,t1),(+,t1,c,t2),(=,t2,-,x) | 本题正确答案 | 正确。先乘后加再赋值,参数与结果位置都符合四元式格式。 | 看到题干核心场景时优先联想到它 |
| (*,x,a,b),(+,x,c,t1) | 本题干扰项 | 错误。把结果变量放在了参数位置,既不符合四元式字段顺序,也没有正确保存中间结果。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- (+,a,b,t1),(*,t1,c,t2),(=,x,-,t2):错误。先做了 a+b,改变了原表达式的运算顺序;最后赋值的源和目标也写反了。
- (=,a,b,t1),(*,t1,c,x):错误。把赋值误写成二元操作,并漏掉了加法步骤。
- (*,x,a,b),(+,x,c,t1):错误。把结果变量放在了参数位置,既不符合四元式字段顺序,也没有正确保存中间结果。
知识点详解
三地址码把复杂表达式拆成一系列简单语句,每条语句右侧通常只有一个运算符。四元式显式记录操作符、两个参数和结果,临时变量名不会因指令位置变化而改变,便于代码移动和优化。对一元运算或赋值,未使用的参数字段可用占位符表示;具体占位符和赋值符号随教材而异,但数据依赖关系应保持一致。
备考速记
先写 t1、t2 的小步骤,再按 op、arg1、arg2、result 装四格。
四元式在四元式场景中的作用
四元式在本题中的核心价值,是解决“不考虑公共子表达式优化,将表达式 x=a*b+c 翻译为四元式序列。下列结果正确的是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 把带括号和多级运算的表达式转换为三地址码或四元式。
- 给出四元式序列,反推原表达式或画出 DAG。
- 比较四元式、三元式和间接三元式对临时结果的表示方式。
四元式在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把四元式放到四元式场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
这题不用一上来画树,先按实际计算顺序念三句话:t1 等于 a 乘 b;t2 等于 t1 加 c;x 等于 t2。每句话再塞进(操作、左参数、右参数、结果)四个格子,位置就不会颠倒。
考点定位
四元式格式通常为(op,arg1,arg2,result)。复杂表达式要按求值顺序拆成每条至多含一个运算符的三地址语句,并用临时变量连接。
易错提醒
- 不按乘法优先级拆分,先生成加法四元式。
- 把四元式误当成普通赋值语句顺序,将结果写在第二个字段。
- 一条三地址语句中塞入两个运算符,没有引入必要的临时变量。
备考提示
- 先写三地址语句,再转换四元式,比直接填四元组更稳。
- 检查每个临时变量必须先定义后使用,最后一条赋值目标应是 x。
你可能还想了解
- 四元式四个字段的顺序是什么?
- 为什么复杂表达式需要临时变量?
- 赋值语句的四元式为什么有一个空参数?
- 四元式和三元式的主要区别是什么?
本文小结
x=a*b+c 应先生成 t1=a*b,再生成 t2=t1+c,最后执行 x=t2。按(操作符,参数1,参数2,结果)填写,得到 (*,a,b,t1)、(+,t1,c,t2)、(=,t2,-,x)。