【发布时间】:2018-03-28 04:14:16
【问题描述】:
C 课程的练习测试复习题。
int c = f1(2,3) * f2(3,4) + f3(4,5);
函数求值的顺序是什么?答案取决于编译器。 我的问题:为什么它不使用 *,+ 运算符的从左到右的关联性和优先级?我把它改成了f1()+f2()*f3(),并在每个函数中放置了puts("f1 now)类型命令进行快速测试。结果是命令f1,f2,f3,所以显然没有使用运算符的关联性和函数评估顺序的优先级。我在思考 3 个函数设置/操作 3 个全局变量的后果,所以评估顺序很重要。
除此之外,不要编写这样的代码(这是一个练习审查问题),我很困惑为什么运算符优先级/关联性不决定函数评估的顺序。提前致谢。
【问题讨论】:
-
回答:专业工程师不在乎,因为他们为了使代码的操作清晰而放入了明确的括号,或者因为他们根本不使用这样的表达式,因为 temp var 和两行代码使调试更容易。
-
只有在顺序无关紧要时才编写这样的代码。你可以写
y = sin(x) + cos(x);,但永远不会写y = create_file(x) + write_data(x) + close_file(x);。这没有任何意义。 -
@MartinJames 但是添加额外的括号不会改变评估的顺序,对吧?似乎这就是将其标记为重复的线程的全部要点。 (此外,我会说我顽固地拒绝放入额外的括号,因为避免它们确保我知道优先/关联规则。等待西红柿的弹幕)
-
@underscore_d wheeeeeeeeee >splat