【问题标题】:C Function evaluation order with operator associativity and precendece [duplicate]具有运算符关联性和优先级的C函数评估顺序[重复]
【发布时间】: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

标签: c function


【解决方案1】:

运算符优先级和关联性不决定评估顺序。它们只告诉编译器在哪里添加括号。优先级意味着f() + g() * h() 被解析为f() + (g() * h())。而关联性意味着f() + g() + h() 被解析为(f() + g()) + h()。但在所有这些情况下(即使括号是明确给出的),函数都可以按任何顺序调用。

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2013-10-02
    • 2014-04-14
    • 1970-01-01
    • 2012-08-13
    • 2013-07-30
    相关资源
    最近更新 更多