3

我有一个 C 程序,它使用大量数学计算,在计算过程中的某些地方,表达式有很多多余的括号和大括号

eg: ((x*y)+(((z*c))))

它会降低性能吗?我们应该避免它吗?

4

2 回答 2

7

不,这不应该影响执行时间,因为编译器会简化表达式。

它可能会对编译时间产生微小的影响,但请注意“分钟”这个词 - 你甚至会注意到它是值得怀疑的。

任何阅读该代码的开发人员都会产生更大的影响。多余的括号可能会使它们更难理解,或者可能会延迟它们一点,同时它们会诅咒对它们造成如此垃圾的编码器:-)

于 2013-09-09T07:11:47.350 回答
6

不,我将介绍典型的编译器阶段并向您展示它们为什么不这样做。

编译的第一阶段是词法分析,将字符(或它们的序列)转换为标记。表达式((x*y)+(((z*c))))可能被标记为:

LEFT_PAREN
LEFT_PAREN
ID x
SYMBOL *
ID y
RIGHT_PAREN
SYMBOL +
LEFT_PAREN
LEFT_PAREN
LEFT_PAREN
ID z
SYMBOL *
ID c
RIGHT_PAREN
RIGHT_PAREN
RIGHT_PAREN
RIGHT_PAREN
RIGHT_PAREN

在此之后,解析器出现并构建一个解析树(并丢弃它不再需要的东西,比如括号)。解析树可能如下所示:

      +
     / \
    /   \
   /     \
  *       *
 / \     / \
X   Y   Z   C

此时括号不再存在,所以不,它们不会影响编译阶段的其余部分(包括代码生成)。表达式的求值顺序(添加括号的全部要点)隐含在树本身的结构中,因此括号不再有目的并被丢弃。当然,在词法分析和解析期间,它们必须被处理,给你的编译时间增加一些纳秒,但仅此而已。除此之外它们不存在,因此不会影响执行时间。

于 2013-09-09T07:26:15.000 回答