软件设计师 · 高频练习

表达式 x=a*b+c 的四元式怎么写?

中级 单选题 第 847 题 中等 软件设计师编译原理中间代码三地址码四元式
题目

不考虑公共子表达式优化,将表达式 x=a*b+c 翻译为四元式序列。下列结果正确的是()。

A (+,a,b,t1),(*,t1,c,t2),(=,x,-,t2)
B (=,a,b,t1),(*,t1,c,x)
C (*,a,b,t1),(+,t1,c,t2),(=,t2,-,x)
D (*,x,a,b),(+,x,c,t1)
题目类型:原创高频练习题 用途:用于帮助理解软件设计师相关考点和答案解析,不等同于官方真题。
正确答案
C
答案解析

按运算优先级先计算 a*b,得到临时结果 t1;再计算 t1+c,得到 t2;最后把 t2 赋给 x。四元式一般写成(操作符,参数1,参数2,结果),赋值只有一个源操作数,因此未使用的参数位置可记为“-”。

选项分析

A

错误。先做了 a+b,改变了原表达式的运算顺序;最后赋值的源和目标也写反了。

B

错误。把赋值误写成二元操作,并漏掉了加法步骤。

C

正确。先乘后加再赋值,参数与结果位置都符合四元式格式。

D

错误。把结果变量放在了参数位置,既不符合四元式字段顺序,也没有正确保存中间结果。

本题为什么容易错

四元式最容易错的不是优先级,而是把 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)。