我正在讨论C运营商的关联性话题.
在那里我遇到了这个事实,函数调用操作符()具有从左到右的关联性.但是,当表达式中出现相同优先级的多个运算符时,关联性才会发挥作用.但我找不到涉及函数调用运算符的任何示例,其中关联性起着至关重要的作用.
例如,在语句中a = f(x) + g(x);,结果取决于评估顺序,而不取决于两个函数调用的关联性.类似地,调用f(g(x))将g()首先评估函数,然后是函数f().这里我们有一个嵌套的函数调用,并且再次关联不起任何作用.
此优先级组中的其他C运算符是数组下标[],postfix ++和postfix --.但我找不到任何涉及这些运算符组合的例子,()其中关联性在表达式评估中起作用.
所以我的问题是函数调用的关联性是否从左到右定义影响C中的任何表达式?任何人都可以提供一个示例,其中函数调用运算符的关联性()在表达式求值中是否重要?
这个页面说"前缀运算符通常是右关联的,后缀运算符是左关联的"(强调我的).
是否存在左关联前缀运算符或右关联后缀运算符的实例?如果没有,假设的那个会是什么样子,怎么解析?
根据此表,函数应用程序关联到左侧.那是什么意思?当二元运算符多次出现时,相关性很重要,例如a - b - c.这与功能应用有什么关系?如果函数应用程序与右侧相关联,它将如何不同?
C++入门练习4.20,5e问表达式iter++->empty();是否合法。假设这iter是一个vector<string>::iterator.
这个表达是合法的。我用 gcc 编译它,并且Stack Overflow 上另一个问题的答案已经解决了这么多。但是,我很困惑为什么它是合法的。
This answer to a similar question给出了以下作为一对等价的表达式:
iter->empty();
iter++;
Run Code Online (Sandbox Code Playgroud)
我书中的运算符优先级表列出的->优先级高于后缀++运算符。这与上面等效代码中的显式操作顺序相匹配。但是,我习惯于看到运算符适用于它们旁边的任何内容。在 的情况下->,我希望编译器将它应用于++(单独,没有iter)并抛出错误。换句话说,我试图将原始表达式括起来为iter(++->empty());,这显然是非法的。
因此,似乎 c++ 需要编译器以更复杂的方式解析表达式,而不仅仅是基于优先级和关联性的括号。那正确吗?如果有一种简单的方法来解释这实际上是如何发生的,我想知道。