Сначала вы должны помнить, что хороший компилятор должен оптимизировать множественные сравнения, если он может сделать выводы о них, например, если значение сравнивается с помощью набора литералов.Таким образом, нет необходимости «оптимизировать» выражения типа x == 1 ||х == 3 ||x == 7 от руки.
В C работает для целых чисел в диапазоне 0..31 (или у этих битов есть long, но вместо этого вы можете использовать long long)
if(((1UL<<val1)|(1UL<<val2)|(1UL<<val3)) & (1UL<<x)) ...
Это создает число, имеющее единицы в битах, соответствующие значениям, которые должны принимать значение true.Это удобно, если вам нужно сравнить со списком переменных маленькие целые числа.
Вы также можете использовать отсортированный массив значений и стандартную функцию c bsearch ():
int valuelist[] = { /* note it sorted */
2, 5, 17, 33, 99, 103, 808
}
int valuelist_length = sizeof(valuelist)/sizeof(int);
/* this works only for statically allocated non-external arrays, */
/* you may need another method of evaluating number of items */
int compar_int(const void *a, const void *b) {
return ((const int *)b < (const int *)a) - ((const int *)a < (const int *)b);
}
...
if(bsearch(&x, valuelist, sizeof(int), valuelist_length, compar_int)) {
/* bsearch returns pointer to found value or NULL if it is not found */
/* so it will be evaluated as true if value exists in array */
}
Но это эффективнотолько если у вас действительно много чисел для сравнения.