Il y a une autre façon, qui étend la réponse @bitmask:
Supposons qu'il y ait un nombre fixe de critères que vous pouvez vérifier. Ainsi, au lieu d'utiliser bitmask pour les valeurs de fruit_and_vegetables
ENUM (qui vous limite à la taille du mot), vous pouvez utiliser LUT supplémentaire:
enum fruit_and_vegetables {
apples = 0,
pears,
tomatoes,
cucumbers
}
enum qualifs {
is_fruit = 1,
is_sweet = 1<<1,
is_round = 1<<2,
is_tasty = 1<<3
}
const qualifs qualifs_LUT[] = { // can be generated
is_fruit | is_sweet | is_round, // apple
...
};
afin que la vérification d'un testament de qualification spécifique est devenu
if (qualifs_LUT[tomato] & is_tasty)
EDIT: et une autre méthode intéressante. Considérons (encore une fois) la méthode @bitmask: Il s'appuie sur les pouvoirs de 2. Mais qu'en est-il des nombres premiers? Ils se développent beaucoup plus lentement, en assignant des nombres premiers aux valeurs ENUM, vous pouvez squize plus de valeurs, en supposant que le produit ne débordera pas:
enum fruit_and_vegetables {
apples = 2,
pears = 3,
tomatoes = 5,
cucumbers = 7
}
if ((apples * pears * tomatoes) % tomatoes == 0)
printf("it's tasty!");
celui-ci limite le nombre d'éléments dans l'ensemble de commande.
Tomates et concombres * sont * fruits ;-P –
non selon la SCOTUS: http://en.wikipedia.org/wiki/Tomato#Fruit_or_vegetable.3F –
@Noah: '' tomates sont * et pas 'tomates est *' – ruslik