Вызов функции - это постфиксное выражение.
Вот в этих выражениях
x = a * (b+c)-(d*e);
subexpressioins (b+c)
и (d*e)
являются первичными выражениями. Вы можете заключить любое выражение в скобки, и вы получите основное выражение.
Например, вы можете даже переписать выражение выражения следующим образом
( x = ( ( ( a ) * (b+c) )-(d*e) ) );
В этом выражении выражения есть следующие первичные выражения
( a )
(b+c)
(d*e)
( ( a ) * (b+c) )
( ( ( a ) * (b+c) )-(d*e) )
( x = ( ( ( a ) * (b+c) )-(d*e) ) )
Вот несколько примеров выражений постфикса
( *p )() // a function call
a[n] // using the subscript operator
x++; // using the postfix increment operator
Определение вызова функции:
postfix-expression:
primary-expression
postfix-expression ( argument-expression-listopt )
Из стандарта C (6.5.2.2 Функциональные вызовы)
1 Выражение, которое обозначает вызываемую функцию92), должно иметь тип
указатель на функцию, возвращающую void или возвращающую полный тип объекта
кроме типа массива.
Вот несколько примеров странных вызовов функций .:)
#include <stdio.h>
void f( void )
{
printf( "Hello " );
}
void g( void )
{
puts( "Broman" );
}
int main( void )
{
void ( *funcs[] )( void ) = { f, g };
void ( **p_func )( void ) = funcs;
( *p_func++ )();
p_func[0]();
}
Вывод программы
Hello Broman
Учтите, что в этих звонках
( *p_func++ )();
p_func[0]();
выражение ( *p_func++ )
является основным выражением, а выражение p_func[0]
является выражением постфикса (см. Частичное определение выражения постфикса выше)