什么是函数指示符和实际调用?
What is function designator and actual call?
根据 C99 标准:
The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.
谁能解释清楚什么是函数指示符和实际调用;他们之间有什么区别?
我假设函数指示符告诉程序调用哪个函数。它可能是一个函数名或一个导致函数指针的表达式。
编辑:
这是一个函数指针示例:
// Two random functions
int foo(int i);
int bar(int i);
// define a function pointer type
typedef int (* func)(int)
// Array of functions
func a[] = {foo, bar}
// calling bar(123)
// (a[1]) is an expression that evaluates to a pointer to `bar`
(a[1])(123);
"What is a function designator?"
A function designator is an expression that has function type. Except when it is the operand of the sizeof operator, 66) or the unary & operator, a function designator with type "function returning type" is converted to an expression that has type "pointer to function returning type".
66) Because this conversion does not occur, the operand of the sizeof operator remains a function designator and violates the constraints in 6.5.3.4.
Source: C18, §6.3.2.1/4 - "Lvalues, arrays, and function designators"
函数指示符是一个表达式,它标识 某个函数并且在求值时指定 一个函数。
int tip (int);
tip
(函数名称)例如是函数指示符。
或者例如:
#include <stdio.h>
int tip (int a) {
return a;
}
int main (void) {
int (**foo)(int);
int (*bar[5])(int);
bar[0] = &tip;
foo = &bar;
printf("%d", (**foo)(4));
}
指向返回 int 的函数的指针的指针 foo
- (**foo)(4)
- 是函数 tip
.
的函数指示符
"函数调用是什么?"
函数调用其实就是对一个函数的调用,如tip(4);
.
函数指示符是具有函数类型的表达式。也就是说,当您键入 func(a,b);
调用函数时,func
是函数指示符。
(这样的函数指示符出现在表达式中时通常会“衰减”为指向函数的指针,就像数组衰减为指向第一个元素的指针一样。)
“实际调用之前的顺序点”的意思是所有的操作数必须在调用函数之前被完全求值(执行)。
如果你有func(a(), b())
,则未指定是先执行a()
还是b()
,但你知道它们肯定都在调用func
之前执行。
因此,如果 a()
例如修改了一个也被 func
使用的全局变量,那会很好,因为对该变量的访问将按照明确定义的顺序进行排序。
编辑 - 来源
有 C17 6.5.2.2 要求 每当调用函数时都有一个函数指针:
Constraints
The expression that denotes the called function shall have type pointer to function returning void
or returning a complete object type other than an array type.
这是通过强制性“功能衰减”实现的,C17 6.3.2.1/4:
A function designator is an expression that has function type. Except when it is the operand of the sizeof
operator, or the unary &
operator, a function designator with type "function returning type" is converted to an expression that has type "pointer to function returning type".
根据 C99 标准:
The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.
谁能解释清楚什么是函数指示符和实际调用;他们之间有什么区别?
我假设函数指示符告诉程序调用哪个函数。它可能是一个函数名或一个导致函数指针的表达式。
编辑:
这是一个函数指针示例:
// Two random functions
int foo(int i);
int bar(int i);
// define a function pointer type
typedef int (* func)(int)
// Array of functions
func a[] = {foo, bar}
// calling bar(123)
// (a[1]) is an expression that evaluates to a pointer to `bar`
(a[1])(123);
"What is a function designator?"
A function designator is an expression that has function type. Except when it is the operand of the sizeof operator, 66) or the unary & operator, a function designator with type "function returning type" is converted to an expression that has type "pointer to function returning type".
66) Because this conversion does not occur, the operand of the sizeof operator remains a function designator and violates the constraints in 6.5.3.4.
Source: C18, §6.3.2.1/4 - "Lvalues, arrays, and function designators"
函数指示符是一个表达式,它标识 某个函数并且在求值时指定 一个函数。
int tip (int);
tip
(函数名称)例如是函数指示符。
或者例如:
#include <stdio.h>
int tip (int a) {
return a;
}
int main (void) {
int (**foo)(int);
int (*bar[5])(int);
bar[0] = &tip;
foo = &bar;
printf("%d", (**foo)(4));
}
指向返回 int 的函数的指针的指针 foo
- (**foo)(4)
- 是函数 tip
.
"函数调用是什么?"
函数调用其实就是对一个函数的调用,如tip(4);
.
函数指示符是具有函数类型的表达式。也就是说,当您键入 func(a,b);
调用函数时,func
是函数指示符。
(这样的函数指示符出现在表达式中时通常会“衰减”为指向函数的指针,就像数组衰减为指向第一个元素的指针一样。)
“实际调用之前的顺序点”的意思是所有的操作数必须在调用函数之前被完全求值(执行)。
如果你有func(a(), b())
,则未指定是先执行a()
还是b()
,但你知道它们肯定都在调用func
之前执行。
因此,如果 a()
例如修改了一个也被 func
使用的全局变量,那会很好,因为对该变量的访问将按照明确定义的顺序进行排序。
编辑 - 来源
有 C17 6.5.2.2 要求 每当调用函数时都有一个函数指针:
Constraints
The expression that denotes the called function shall have type pointer to function returningvoid
or returning a complete object type other than an array type.
这是通过强制性“功能衰减”实现的,C17 6.3.2.1/4:
A function designator is an expression that has function type. Except when it is the operand of the
sizeof
operator, or the unary&
operator, a function designator with type "function returning type" is converted to an expression that has type "pointer to function returning type".