【问题标题】:& operator optional in function pointer assignment& 运算符在函数指针赋值中可选
【发布时间】:2010-11-29 04:03:40
【问题描述】:

在以下代码中:

/* mylog.c */
#include <stdio.h>
#include <stdlib.h> /* for atoi(3) */

int mylog10(int n)
{
    int log = 0;
    while (n > 0)
    {
        log++;
        n /= 10;
    }
    return log;
}

int mylog2(int n)
{
    int log = 0;
    while (n > 0)
    {
        log++;
        n >>= 1;
    }
    return log;
}

int main(int argc, const char* argv[])
{
    int (*logfunc)(int); /* function pointer */
    int n = 0, log;

    if (argc > 1)
    {
        n = atoi(argv[1]);
    }

    logfunc = &mylog10; /* is unary '&' operator needed? */

    log = logfunc(n);
    printf("%d\n", log);
    return 0;
}

排队

logfunc = &mylog10;

我注意到一元&amp;(地址)运算符是可选的,无论有没有它,程序的编译和运行方式都是相同的(在带有GCC 4.2.4的Linux中)。为什么?这是编译器特定的问题,还是编译器接受了两种不同的语言标准?谢谢。

【问题讨论】:

  • 顺便说一句-这是否意味着函数指针“行为方式与对函数的引用相同”?
  • @Kos:它在源代码级别的行为可能看起来相同,尽管相似之处纯粹是肤浅的:底层抽象语言机制相当不同。然而,如果您深入挖掘并查看机器级别的机制,您会发现它们似乎再次相同。

标签: c gcc function-pointers


【解决方案1】:

&amp; 是可选的,这是正确的。函数,如数组,可以自动转换为指针。它既不是特定于编译器的,也不是不同语言标准的结果。根据标准,第 6.3.2.1 节,第 4 段:

函数指示符是具有函数类型的表达式。除非它是 sizeof 运算符或一元 &amp; 运算符的操作数,否则为“函数返回类型”类型的函数指示符" 转换为类型为“指向返回类型的函数的指针”的表达式。

【讨论】:

  • 我也被否决了,我强烈怀疑这些是竞争对手的否决...这是我的补偿
  • @Armen Tsirunyan:一个“竞争对手”的统计数据没有显示出足够多的反对票来让他成为罪魁祸首。这显然使我受到怀疑:) 但我没有这样做!一定是一些巨魔的反对票。
  • @AndreyT:我很抱歉仓促地假设对手投反对票。我显然错了。一定是挫败感 :)
  • @AndreyT, @Armen:我没有被否决,但正如你所注意到的,我的反对票太少而不会有罪。是摆设!我可以证明我的清白!
【解决方案2】:

运算符&amp; 在获取上下文中的函数地址时确实是可选的(将其分配给某物)。它不是特定于编译器的,它遵循语言的正式定义。

对称地,运算符* 在通过指针调用函数时是可选的。在您的示例中,您可以以(*logfunc)(n)logfunc(n) 的形式调用该函数。您使用了后者,但前者也可以。

【讨论】:

    【解决方案3】:

    用 C++ 回答。对于 C 也是如此

    引用 C++ 标准 (4.3.1):

    函数类型 T 的左值可以是 转换为类型的右值 “指向 T 的指针。”结果是一个 指向函数的指针。50)

    数组也是如此。 (4.2.1)

    “N 数组”类型的左值或右值 T”或“T的未知边界数组” 可以转换为类型的右值 “指向 T 的指针。”结果是一个 指向第一个元素的指针 数组。

    但请注意,这些是转换,绝不是函数是函数指针,也不是数组是指针。高温

    【讨论】:

      【解决方案4】:

      来自标准(6.3.2.1/4):

      函数指示符是一个表达式 具有功能类型。除了当它 是 sizeof 的操作数 运算符或一元 & 运算符,a 带类型的功能指示符 ‘‘函数返回类型’’ 是 转换为具有 type ‘‘指向函数返回的指针 输入''

      所以是的,省略 &amp; 无论如何都会产生一个指向函数的指针。

      【讨论】:

        猜你喜欢
        • 2021-05-13
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        相关资源
        最近更新 更多