2016-12-19 2 views
3

Я реализую простой оператор if в c, где я сравниваю значение integer 'tile' с четырьмя другими целыми числами: w, a, s и d.Альтернативный синтаксис объединения проверки нескольких условий

Вот мой код:

if(tile == w || tile == a || tile == s || tile == d) 
{ 
    printf("legal\n"); 
    return true; 
} 

Хотя выше правильно, синтаксис утомительно. Есть ли более элегантный способ написания условия? «Плитка» является одним из следующих целых чисел ... »

Я новичок в программировании, поэтому прошу прощения, поскольку я подозреваю, что ответ очень очевиден. Однако мне не удалось найти его в другом месте.

+0

Этот вопрос, вероятно, лучше подходит для обзора кода. – jadhachem

+0

Спасибо. Я здесь новенький. Я буду иметь это в виду. – Tikhon

+0

Обратите внимание, что все решения в ответах зависят от особых случаев и * более сложны *, чем ваш вопрос. У вас также есть наивное понятие «утомительное». Если у вас возникла ситуация с определенной связкой значений, просто проверьте их. В противном случае значения должны быть в некотором (абстрактном) контейнере для остальной части вашего кода. Просто напишите самую прямую вещь. Это то, чему вы должны учиться на этом, а не куча извращений. – philipxy

ответ

2

Два варианта я могу думать ...

битовые

#define TILE_W 0x0001 
#define TILE_A 0x0002 
#define TILE_S 0x0004 
#define TILE_D 0x0008 

if (tile&(TILE_w|TILE_A|TILE_S|TILE_D)) 
{ 
    printf("legal\n"); 
    return true; 
} 

переключатель случая

switch (tile) 
{ 
case w: 
case a: 
case s: 
case d: 
    printf("legal\n"); 
    return true; 
default: 
    return false; 
} 
+0

Пока я иду первым методом, второй метод по-прежнему утомителен и не стоит усилий. – sjsam

+0

Спасибо, что отвечает на него. – Tikhon

+0

Первый вариант работает только в том случае, если вы можете утверждать, что 'tile' является степенью 2, и каждое из значений также имеет силу 2. Второй вариант работает только в том случае, если' tile' имеет тип 'int' или меньше, и каждый из 'w',' a', 's' и' d' являются константой в диапазоне типа 'int'. Ни один из вариантов не является общей заменой для вашего условия 'if'. – chqrlie

1

Раствор для улучшения может зависеть от значений, которые вы сравните с ,

Если w, a, s и d являются целыми числами, которые имеют последовательные значения (например, 10, 11, 12 и 13), Условный оператор может использовать условие для границ:

if(tile >= w && tile <= d) { printf("legal\n"); } 

Если значения несопоставимы (например, 6, 32, 142, 55), вы можете использовать switch .. case строительство, как

switch (tile) 
{ 
    case w: 
    case a: 
    case s: 
    case d: 
      printf("legal\n"); 
      break; 
    default: 
      printf("ILLEGAL\n"); 
      break; 
} 

Также вы можете использовать установки флага в одном или нескольких if в

int legal = 0; 

// checking can be in different places of code 
if (tile == w) 
    legal = 1; 
if (tile == a || tile == s) 
    legal = 1; 
if (tile == d) 
    legal = 1; 

if(legal) 
{ 
    printf("legal\n"); 
} 

И считают хранение w, a, s и d значения как массив допустимых значений, так что цикл может быть использован для проверки:

int valArr[] = {101, 151, 333, 7}; // you can add any number of values here 
int i; 
int legal = 0; 
for(i = 0; i < (sizeof(valArr)/sizeof(valArr[0])); i++) 
{ 
    if(valArr[i] == tile) 
    { 
     legal = 1; 
     break; 
    } 
} 
if(legal) 
{ 
    printf("legal\n"); 
} 
else 
{ 
    printf("ILLEGAL\n"); 
} 
3

Хотя eyalm's answer, может быть, один вы (, как вы уже упоминали, «я новичок в программировании»), что означает «написать код, который легче понять людям».

В то время как побитовое приближение короче, как правило, кажется, что труднее понять содержание, так как оно растет.

уборщик подход будет (в то время как она требует больше усилий, чтобы написать код), придерживаться синтаксиса if (a || b || c), или осенью, хотя switch случай. Это дает лучшую читаемость.

  • В случае ваши варианты становится длиннее (, что вам может понадобиться горизонтальной прокрутки), вы можете рассмотреть вопрос о включении функции, чтобы получить требуемое значение проверено и использовать возвращаемое значение в состоянии в if заявлении.

Суть в том, что нет правильного или неправильного пути, только выберите способ, который сделает код более удобочитаемым и обслуживаемым.

Смежные вопросы