Как написать "если х равен 5 или 4 или 78 или ..." в C - PullRequest
3 голосов
/ 16 марта 2011

У меня быстрый вопрос об использовании логических операторов в операторе if.

В настоящее время у меня есть оператор if, который проверяет, равен ли x 5 или 4 или 78:

if ((x == 5) || (x == 4) || (x == 78)) {
blah
}

И мне было интересно, смогу ли я просто сжать все это до:

if (x == 5 || 4 || 78) {
blah
}

Извините за такой простой вопрос, я только начал изучать C.

Ответы [ 11 ]

9 голосов
/ 16 марта 2011

Ярлыка нет, но вам нужно исправить оператор равенства.

if ((x == 5) || (x == 4) || (x == 78)) {
6 голосов
/ 16 марта 2011

Во-первых, вы используете задания, а не тесты на равенство в своих ifs.Первый метод (с подходящими заменами для равенства) - лучший способ выполнить тест, хотя, если у вас есть много возможных вариантов, могут быть и лучшие способы.Второй способ может скомпилироваться, но он не будет выполнять то, что вы хотите, он всегда будет возвращать true, так как и 4, и 78 оценивают как true, и то, что вы делаете, оценивает: 5 (результат присвоения 5 x) или 478 являются правдой.Оператор switch может быть одной из возможных альтернатив.

switch (x) {
    case 4:
    case 5:
    case 78:
       blah...
       break;
    default:
}
2 голосов
/ 16 марта 2011

Для оператора if нет ярлыка, но я предлагаю рассмотреть:

switch (x)
{
    case 4: 
    case 5:
    case 78:
        /* do stuff */
        break;

    default:
        /* not any of the above... do something different */
}
2 голосов
/ 16 марта 2011

Нет, вы не можете, и тест на равенство ==, а не =

1 голос
/ 16 марта 2011

@ дядя Брэд на месте, но позже вы, вероятно, узнаете о чем-то, что называется оператором switch. Это выглядит странно, но часто используется в подобных ситуациях (когда несколько возможных значений переменной имеют одинаковый эффект):

switch (x) {
case 4:
case 5:
case 78:
    // ...
    break;
}

Хотя вы бы хотели использовать оператор switch только тогда, когда значение оператора if менее понятно - большинство компиляторов в наши дни достаточно умны, чтобы генерировать оптимальный машинный код в любом случае.

0 голосов
/ 16 марта 2011

Вы можете сделать цикл for, если это длинный список, однако он не обрабатывает логические операторы: -...

#include <stdio.h>

int forbiddenList[13] = {5, 4, 78, 34, 23, 56, 4, 7, 6, 4, 33, 2333, 0};
int length = 13;

int main() {

  int mysteryNum;

  printf("type a number: ");
  scanf("%d",&mysteryNum);

  int i;
  for (i = 0; i <= length; i ++)
    {

      int target = forbiddenList[i];

      if (mysteryNum == target)
        {
          printf("You have chosen of the forbidden list!\n");
          printf("YOU SHALL NOT PASS!!\n");
        }
    }
  return 0;
}

э-э ... не выполнил c.... когда-нибудь ... вы должны взять C ++ ...

0 голосов
/ 16 марта 2011
int preconditions[] = { 4,5,78 }; // it should be in most likely order
int i = 0;
for(;i<3;++i) {
   if( x == preconditions[i] ) {
      // code here.
   }
}
0 голосов
/ 16 марта 2011

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

Тем не менее, для 3 чисел вы должны сделать это «длинным» способом.

0 голосов
/ 16 марта 2011

Ответ был получен за то время, которое потребовалось мне, чтобы войти в систему, но вы можете использовать переключатель и разбить его на функцию

int isValid(int toCheck) {
   switch(toCheck) {
      case 4:
      case 5:
      case 78: 
         return 1;
      default:
         return 0;
   }
}

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

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

0 голосов
/ 16 марта 2011

Нет, вы не можете сделать это в C. Ваш первый пример кода также неверен. Существует важное различие между присваиванием (=) и эквивалентностью (==) в C. Когда вы написали x = 5 в своем выражении, это на самом деле скомпилируется и оценивается в 0 или 1 (false или true) перед логически ИЛИ со следующей частью выражения!

Ваш второй пример кода также является допустимым C, но он не выполняет то, что вы хотите, чтобы он делал. Вы читаете утверждение как «(х назначено 5) или истина или истина». Это потому, что любое ненулевое значение в C логически верно. Таким образом, x будет содержать значение 5 и будет принимать значение true, делая ваше условие if истинным. Остальная часть выражения не имеет значения, поскольку оператор || замыкает накоротко.

...