首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“双(双)”和“双(*)(双)”有什么区别?

“双(双)”和“双(*)(双)”有什么区别?
EN

Stack Overflow用户
提问于 2014-08-16 23:57:17
回答 3查看 2K关注 0票数 2

下面的代码可以工作,我认为double(double)double (*)(double)square&square之间没有什么不同,对吗?

代码语言:javascript
复制
#include <stdio.h>

double square(double x)
{
    return x*x;
}

void test1(double f(double), double x)
{
    printf("test1 %f\n", f(x));
}

void test2(double (*f)(double), double x)
{
    printf("test2 %f\n", f(x));
}

int main()
{
    double (*fp)(double);
    test1(square, 3);
    test2(square, 3);
    fp = square;
    test1(fp, 3);
    test2(fp, 3);
    fp = &square;
    test1(fp, 3);
    test2(fp, 3);
    return 0;
}

但是下面的cython引发不能将'double (*)(double)‘类型分配给'double (double)',它是一个bug还是我遗漏了什么?

代码语言:javascript
复制
from libc.stdio cimport printf

cdef double square(double x):
    return x*x

cdef void test1(double f(double), double x):
    printf("test1=%g\n", f(x))

cdef void test2(double (*f)(double), double x):
    printf("test2=%g\n", f(x))

def test():
    cdef double(*fp)(double)
    fp = square
    test1(fp, 3.0)
    test2(fp, 3.0)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-17 00:11:20

具体地在函数参数列表中使用这个表示法时,没有什么不同。

但在函数参数上下文之外,double(double)是函数类型,double (*)(double)是函数指针类型。这是两种不同的类型,具有非常不同的属性。

因此,您的第一段的答案是:在函数参数列表中是正确的,而且只在函数参数列表中是正确的。

换句话说,在函数参数列表函数类型中使用时,函数类型的行为方式与数组类型非常相似:它会立即衰退为指针类型。然而,正如数组和指针类型非常不同一样,函数类型和函数指针类型也有很大的不同。

在其他上下文中,如果以double(double)类型声明某项内容,则将其声明为函数。例如

代码语言:javascript
复制
typedef double D(double);

D foo;
double foo(double);

上述两种声明都是有效的和等价的。它们声明函数foo,该函数接受double类型的单个参数并返回double。这个特性(通过typedef名称声明函数)通常不在实际的C代码中使用,但是它在语言中是存在的。

票数 4
EN

Stack Overflow用户

发布于 2014-08-17 00:12:00

double(double)是一种函数的类型,它接受一个双,然后返回一个双。

double(*)(double)是指向上述函数类型的指针。

恰巧的是,如果你用力地呼吸,函数就会衰减为指针到函数。例如,不能将一个函数作为另一个函数的参数。如果尝试,类型“衰变”为函数指针。类似地,如果将函数按名称传递为参数(或通常在表达式中传递),则如果目标类型不是对函数的引用或其他类似类型,则它可以自动衰减为函数指针。

数组也会发生类似的情况。

您还可以在指针到函数上调用操作符(),它会自动取消指针的引用.

这些是继承自C.

在C++中,您可以形成对函数的引用,有时还可以使用纯函数类型。std::function< void(int) >采用纯函数类型。现在,它不能创建void(int)类型的变量,但仍然可以操作该类型。

cython可能没有实现自动转换衰变。

票数 3
EN

Stack Overflow用户

发布于 2014-08-17 00:07:27

double(double)在语义上与double (*)(double)在参数上完全等价:函数和数组是通过引用传递的.但是,作为局部变量,double(double)类型的变量永远不可能是lvalue。当然,在全球范围内,它们都是功能。

&squaresquare一样,后者只是第一个词的语法糖。

我对cython没有经验,但就C语义而言,它似乎不兼容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25345109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档