如果数组没有静态存储持续时间,则运算符可以用作初始化表达式。
来自 C 标准(6.7.9 初始化)
4 具有静态或线程存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字。
考虑到您可能不会声明一个函数数组,但您可以声明一个指向函数的指针数组。
这是一个演示程序
#include <stdio.h>
void f( void ) { puts( "f"); }
void g( void ) { puts( "g"); }
int main(void)
{
int x = 1, y = 2;
void ( *fp[] )( void ) = { x < y ? f : g };
fp[0]();
return 0;
}
程序输出为
f
如果函数类型太复杂,您可以为其引入 typedef。例如
#include <stdio.h>
void f( void ) { puts( "f"); }
void g( void ) { puts( "g"); }
int main(void)
{
int x = 1, y = 2;
typedef void F( void );
F * fp[] = { x < y ? f : g };
fp[0]();
return 0;
}
您可以使用条件运算符来初始化具有静态存储持续时间的数组。问题是条件必须是一个并不总是合适的常量表达式。例如
#include <stdio.h>
void f( void ) { puts( "f"); }
void g( void ) { puts( "g"); }
typedef void F( void );
F * fp[] = { 1 ? &f : &g };
int main(void)
{
fp[0]();
return 0;
}
来自 C 标准(6.6 常量表达式)
9 地址常量是空指针、指向指定静态存储持续时间对象的左值指针或指向函数指示符的指针;它应使用一元 & 运算符或转换为指针类型的整数常量显式创建,或通过使用数组或函数类型的表达式隐式创建。数组下标 [] 和成员访问。和 -> 运算符、地址 & 和间接 * 一元运算符以及指针转换可用于创建地址常量,但不应使用这些运算符访问对象的值。