Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解奇怪的返回语法:return(*scriptFunction[x])(参数);_C - Fatal编程技术网

理解奇怪的返回语法:return(*scriptFunction[x])(参数);

理解奇怪的返回语法:return(*scriptFunction[x])(参数);,c,C,我知道这个标题很可怕,对此我很抱歉;老实说,我不知道该怎么问我的问题,因为我在这方面没有受过良好的教育。下面是我的问题涉及的一小部分代码,因为我不知道发生了什么,或者它是否有效!尽管如此,我怀疑它是有效的 return(*scriptFunction[x])(arguments); 根据我的理解,在C中只能返回1个值(可以有多个return语句,但这是不同的和离题的)。上述语句实际上在做什么?代码: return(*scriptFunction[x])(arguments); 实际上只返回一

我知道这个标题很可怕,对此我很抱歉;老实说,我不知道该怎么问我的问题,因为我在这方面没有受过良好的教育。下面是我的问题涉及的一小部分代码,因为我不知道发生了什么,或者它是否有效!尽管如此,我怀疑它是有效的

return(*scriptFunction[x])(arguments);
根据我的理解,在C中只能返回1个值(可以有多个return语句,但这是不同的和离题的)。上述语句实际上在做什么?

代码:

return(*scriptFunction[x])(arguments);
实际上只返回一个值

变量
scriptFunction
将是一个函数指针数组(1)。您可以查找该数组的元素编号
x
,并调用该函数,传递参数
arguments
。那么该函数的返回值就是您返回给调用者的值

除了函数指针方面,它与返回sqrt(42)没有什么不同


作为示例,以下程序演示了如何执行此操作:

#include <stdio.h>

// Two simple functions which add a fixed value.

int fnPlus3 (int n) { return n + 3; }
int fnPlus7 (int n) { return n + 7; }

// An array holding those two functions.

int (*scriptFunction[])(int) = { fnPlus3, fnPlus7 };

int main (void) {
    // Call first function in array.

    int x = 0;
    printf ("%d\n", (*scriptFunction[x])(100));

    // Then call second one.

    x = 1;
    printf ("%d\n", (*scriptFunction[x])(100));

    return 0;
}


(1) 或者某种形式的等价物,例如指向函数指针数组的指针,或者指向单个函数指针的指针(假设后一种情况下
x
始终设置为零)。

大概
scriptFunction
是指向函数的指针数组
*scriptfunction[x]
是指向函数的未引用指针(第x个)。最后,
*scriptfunction[x](arguments)
表示对应用于
arguments
的函数的调用,因此该函数的结果就是最终返回的结果

旁注:
*
不是真的需要。调用函数时不需要取消引用函数指针,也就是说,您可以使用

return scriptFunction[x](arguments);

相反。

从外观上看,行
似乎返回(*scriptFunction[x])(参数)
scriptFunction
是一个函数指针数组,它只是在变量
x
索引的位置调用函数,并发送
参数
变量内容作为其输入

此调用函数的返回值是最终返回的值


此工作示例应有用:

#include <iostream>
using namespace std;

void func_a(int i)
{
        cout << "func_a: " << i << endl;
}

void func_b(int i)
{
        cout << "func_b: " << i << endl;
}

int main()
{
        void (*funcs[])(int) = { func_a, func_b };

        for(int i = 0; i < 2; ++i)
                (*funcs[i])(i+1);

        return 0;
}


另外,为了将来的参考,你应该参考:

这取决于你在学习C方面走了多远,这可能看起来确实很陌生。正如答案所揭示的,返回是返回一个指向函数的指针。函数指针数组并不是在C编程的开始阶段就可以看到的。因此,如果你不认识它,请不要自责——查一下……。@DavidC.Rankin它并没有返回函数指针。我可以纠正,它是返回函数指针的结果……然后第一对参数同样多余。
scriptFunction
也可以是函数指针的指针。@Keith,增加了一个附录来涵盖那个和其他(在我看来不太可能,但正如你们所指出的)案例。给每个人!我感谢你们给我的帮助。你的每一个例子都是增值的,非常有用。令我印象深刻的是,你们每个人都假设它是指向函数的指针数组;也许你可以让我知道你是怎么知道的!那是我没有先说的错,所以我道歉。是的,指向函数的指针数组在这个阶段不是最清晰的。。。再次感谢大家!假设它是指向函数的指针数组。。你怎么知道的!这可以通过查看C运算符优先级表和表达式来解决。括号具有最高的优先级和从左到右的关联性。所以必须首先计算左一对
()
。其中,
[]
的优先级高于
一元数*
。因此,
[]
是第一位的。所以我们知道scriptFunction是一个数组。由于数组元素被取消引用,然后应用于它,因此它是指向函数的指针
#include <iostream>
using namespace std;

void func_a(int i)
{
        cout << "func_a: " << i << endl;
}

void func_b(int i)
{
        cout << "func_b: " << i << endl;
}

int main()
{
        void (*funcs[])(int) = { func_a, func_b };

        for(int i = 0; i < 2; ++i)
                (*funcs[i])(i+1);

        return 0;
}
➜  /tmp  g++ test.cpp -o test
➜  /tmp  ./test
func_a: 1
func_b: 2