【发布时间】:2015-11-02 06:22:21
【问题描述】:
我正在讨论 C 运算符的关联性。
我发现函数调用运算符() 具有从左到右的关联性。但是只有当一个表达式中出现多个具有相同优先级的运算符时,关联性才会发挥作用。但我找不到任何涉及函数调用运算符的示例,其中关联性起着至关重要的作用。
例如在语句a = f(x) + g(x); 中,结果取决于评估顺序,而不取决于两个函数调用的关联性。
同样,调用f(g(x)) 将首先评估函数g(),然后是函数f()。这里我们有一个嵌套的函数调用,并且关联性再次不起作用。
此优先级组中的其他 C 运算符是数组下标 []、postfix ++ 和 postfix --。但是我找不到任何涉及这些运算符与() 组合的示例,其中关联性在表达式评估中起作用。
所以我的问题是函数调用的关联性被定义为从左到右是否会影响 C 中的任何表达式?谁能提供一个例子,说明函数调用运算符 () 的关联性在表达式评估中很重要吗?
【问题讨论】:
-
如果
f本身就是一个表达式(比如从数组中选择的一个函数指针)怎么办? -
任何返回函数指针的函数都可以用作示例,因为函数调用运算符不需要函数指针解引用。因此,您开始拥有
f()()()()之类的东西,它是有效的 C。有关可能的示例,请参见 Grzegorz 的答案。 -
28 upvotes.... 它必须从左到右。你想生活在一个
f(a)(b)调用f传递b然后用a调用结果的世界中(也就是说(f(b))(a)) - 你愿意吗? -
我不同意现有的答案,无论是否投票。他们确实很好地解释了一些基础知识,但this answer 更深入地方式。是的,我们可以就 C 语法区分“主要”和“一元”运算符进行长时间的争论,但这种区分也只是语法的产物。
标签: c associativity