2014-11-10 4 views

ответ

3

Невозможно вставить список, разделенный запятой, в оператор if, как в вашем примере, но вы можете написать что-то подобное, чтобы использовать формат списка, разделенный запятыми.

int allowed_counts[] = {5, 8, 9, 10}; 
int i; 
for (i = 0; i < 4; i++) { 
    if (count == allowed_counts[i]) { 
     ... 
     break; 
    } 
} 

Хотя оператор switch более эффективен для вычислений для всех размеров списка.

+0

Thats, вероятно, лучший способ сделать это. – Gugi

+2

@Gugi: В зависимости от того, что вы делаете, простое выражение 'if' в вашем вопросе может быть лучшим способом сделать это. Это более читаемо, чем большинство альтернатив, и для чего-то эта небольшая производительность вряд ли будет серьезной проблемой. –

0

Я думаю, что вы ищете что-то вроде этого:

Так условие тестирования, если счетчик равен 5, 8, 9, 10:

if (count == 5 || (count >= 8 && count <= 10)) 
    printf("count is 5, 8, 9 or 10"); 
+0

Если 'count' не равно 6 или 7! – Clifford

+0

@Clifford NO! Попробуйте, это работает! – Rizier123

+0

@ Rizier123: Исходный код хотел только 5, 8, 9 и 10 добиться успеха в условном выражении. Ваш код также преуспевает в 6 и 7. –

4

В зависимости на сколько разных значений и разных филиалов у вас есть, иногда может быть опрятно/проще использовать выключатель:

switch (count) 
{ 
case 5: 
case 8: 
case 9: 
case 10: 
    do_something(); 
    break; 
default: 
    do_something_else(); 
    break; 
} 
+0

У меня только 4 значения. Просто хотел сократить код. count - макс. 16. – Gugi

4

В некоторых случаях может иметь смысл использовать бит-карту.

Например, ваш тест:

if (count == 5 || count == 8 || count == 9 || count == 10) 

эквивалентно:

if ((1<<count) & 0x720) 

Значения 5, 8, 9 и 10 кодируют в бит значения 0x720.

Как правило, это будет иметь смысл, если у вас есть значимые символические константы для значений 5, 8, 9 и 10, с 0x720 построен из побитового «или» (|) этих констант - что привело бы к более многословным кода, чем простой if, который у вас есть в вашем вопросе.

На практике код реального мира должен минимизировать использование «магических чисел». Трудно сказать, что означают значения 5, 8, 9 и 10.

Возможно, вам стоит рассмотреть возможность использования другого алгоритма, но это невозможно рассказать без дополнительной информации.

+0

Да, возможно, есть лучшее решение моей проблемы, но это не имеет значения, поскольку это всего лишь небольшая часть моей домашней работы по программированию, и я не хочу публиковать всю задачу. – Gugi

+1

Чтобы избежать неопределенного поведения, сделайте это только в том случае, если известно, что 'count <31'! (или независимо от вашего размера int) –

0

EXIST(count, (5,8,9,10) например расшириться макроса наддува

#include <boost/preprocessor/tuple/to_seq.hpp> 
#include <boost/preprocessor/seq/for_each_i.hpp> 
#include <boost/preprocessor/control/if.hpp> 

#include <stdio.h> 

#define F(r, data, i, elem) BOOST_PP_IF(i, ||,) (data == elem) 
#define EXIST(var, values) BOOST_PP_SEQ_FOR_EACH_I(F, var , BOOST_PP_TUPLE_TO_SEQ(values)) 

int main(){ 
    int count; 
    scanf("%d", &count); 
    if(EXIST(count, (5,8,9,10)))//if((count == 5) || (count == 8) || (count == 9) || (count == 10)) 
     printf("yes\n"); 
    else 
     printf("no\n"); 
    return 0; 
} 
Смежные вопросы