C中函数调用操作符的相关性

Dee*_*epu 31 c associativity

我正在讨论C运营商的关联性话题.

在那里我遇到了这个事实,函数调用操作符()具有从左到右的关联性.但是,当表达式中出现相同优先级的多个运算符时,关联性才会发挥作用.但我找不到涉及函数调用运算符的任何示例,其中关联性起着至关重要的作用.

例如,在语句中a = f(x) + g(x);,结果取决于评估顺序,而不取决于两个函数调用的关联性.类似地,调用f(g(x))g()首先评估函数,然后是函数f().这里我们有一个嵌套的函数调用,并且再次关联不起任何作用.

此优先级组中的其他C运算符是数组下标[],postfix ++postfix --.但我找不到任何涉及这些运算符组合的例子,()其中关联性在表达式评估中起作用.

所以我的问题是函数调用的关联性是否从左到右定义影响C中的任何表达式?任何人都可以提供一个示例,其中函数调用运算符的关联性()在表达式求值中是否重要?

Grz*_*ski 44

下面是一个示例,其中函数调用操作符的左右关联性很重要:

#include <stdio.h>

void foo(void)
{
    puts("foo");
}

void (*bar(void))(void) // bar is a function that returns a pointer to a function
{
    puts("bar");
    return foo;
}

int main(void)
{
    bar()();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

函数调用:

bar()();
Run Code Online (Sandbox Code Playgroud)

相当于:

(bar())();
Run Code Online (Sandbox Code Playgroud)

  • 这不是函数调用操作符的关联性很重要的示例.没有其他方法可以解释`bar()()`而不是`(bar())()`; 值得注意的是`bar(()())`是没有选择的,不仅仅是因为现在`bar`的参数不是语法,而是更基本的因为现在添加的括号本身成为"函数调用运算符",并且不能省略.所以正确(左到右)的关联性就没有任何意义.它也不适用于其他后缀运算符,它们是左联的; 类似地,_prefix_运算符必然是右关联的. (2认同)

pas*_*pkT 15

除了@ GrzegorzSzpetkowski的答案,您还可以拥有以下内容:

void foo(void) { }

int main(void) {
    void (*p[1])(void);
    p[0] = foo;
    p[0]();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将创建一个函数指针数组,因此您可以将数组下标运算符与函数调用运算符一起使用.

  • 如果数组中的那些函数是`int*(*p [1])(int)`,那么你可以使用`p [0](1)[2];`.取第一个函数指针,用参数1调用它,然后返回第三个数组元素.几乎没有限制C表达式的复杂性 (2认同)