我在C中有一个程序,它使用了大量的数学计算。在计算过程中的某些地方,表达式有许多冗余的括号和括号
eg: ((x*y)+(((z*c))))
是否会降低性能?我们应该避免吗?
答案 0 :(得分:7)
不,这不应该影响执行时间,因为编译器将简化表达式。
它可能会对编辑时间产生微小影响,但请注意“分钟”这个词 - 你甚至不会注意到这一点。
任何开发人员阅读该代码都会产生更多影响。多余的括号可能会使它更难理解,或者它可能会在他们诅咒那些给他们造成这种垃圾的编码器时耽误他们: - )
答案 1 :(得分:4)
不,我将介绍典型的编译阶段,并告诉你他们为什么不这样做。
编译的第一阶段是lexing,将字符(或它们的序列)转换为标记。表达式((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
此时括号不再存在,所以不,它们不会影响编译阶段的其余部分(包括代码生成)。表达式的评估顺序(添加括号的整个点)隐含地编码在树本身的结构中,因此括号不再具有目的而被丢弃。当然,在lexing和解析期间,它们必须被处理,在编译时添加一些纳秒,但这就是它。它们不存在,因此不会影响执行时间。