Как разделить if () на &&, а не || - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь сделать что-то подобное в c ++

If x is equal to either a or b or c
and y is equal to either d or e or f
and z is equal to either g or h or i, it would turn true and execute the code

Я немного потерян в этом

if(x==a||x==b||x==c && y==d||y==e||y==f && z==g||z==h||z==i){
 // Do x
}

Ответы [ 6 ]

0 голосов

Из предыдущих ответов важно отметить, что в C ++ вы пропустили, что оператор AND && имеет более высокий приоритет оператора , чем оператор OR ||.

Это можно сравнить с тем, как мультипликативные операторы *, /, % чисел имеют более высокий приоритет, чем аддитивные операторы + и - в алгебре.

Перегруппируйте паратезы, чтобы у вас были эти три требования о том, какими должны быть x, y и z, и утверждение верно, когда все три верны.(Технически это называется произведением формы суммы, поскольку утверждение if требует истинности всех трех меньших утверждений (AND), где каждое из меньших утверждений использует только операторы OR.).

if((x==a||x==b||x==c) && (y==d||y==e||y==f) && (z==g||z==h||z==i)){
 // Do x
}

Ваш исходный код будет эквивалентен

if(x==a || x==b || (x==c && y==d) || y==e || (y==f && z==g) || z==h || z==i){
 // Do x
}

Для больших операторов if вы также можете использовать новые строки, но, конечно, это займет больше строк.

if((x==a||x==b||x==c) 
&& (y==d||y==e||y==f) 
&& (z==g||z==h||z==i)
&& ... other conditions)){
 // Do x
}

Если вы это сделаетеЕсли вам не нужны такие громоздкие и длинные нотации оператора if, вы можете рассмотреть возможность разбиения на логические тесты (условие if является «продуктом» логических тестов), а именно

bool a1 = (x==a||x==b||x==c);
bool a2 = (y==d||y==e||y==f);
bool a3 = (z==g||z==h||z==i);
bool a4 ...
if (a1 && a2 && a3 && a4 && ..) {
  // Do x
}
0 голосов
/ 26 мая 2018

Если вы посмотрите на приоритет оператора C ++ , вы обнаружите, что && имеет более высокий приоритет, чем ||.

Это означает, что ваш оператор if

if(x==a||x==b||x==c && y==d||y==e||y==f && z==g||z==h||z==i)

совпадает с

if (x == a || x == b || (x == c && y == d) || 
    y == e || (y == f && z == g) || 
    z == h || z == i)

Используя скобки, вы можете изменить его так, чтобы он работал так, как вы хотите:

if ((x == a || x == b || x == c) && 
    (y == d || y == e || y == f) && 
    (z == g || z == h || z == i))
0 голосов
/ 26 мая 2018

Здесь немного за борт (но чуть-чуть):

if (element_of(x, {a, b, c}
    && element_of(y, {d, e, f})
    && element_of(z, {g, h, i}))
{
    foo();
}

с element_of определяется как:

template <class T>
auto element_of(const T& element, std::initializer_list<T> list) -> bool
{
    return std::find(list.begin(), list.end(), element) != list.end();
}

Или даже немного большеза бортом (это просто для удовольствия, я не рекомендую его):

if (Elem{x}.element_of({a, b, c})
    && Elem{y}.element_of({d, e, f})
    && Elem{z}.element_of({g, h, i}))
{
    foo();
}

с Elem:

template <class T> struct Elem
{
    T element;

    auto element_of(std::initializer_list<T> list) -> bool
    {
        return std::find(list.begin(), list.end(), element) != list.end();
    }
};

template <class T> Elem(T) -> Elem<T>;
0 голосов
/ 26 мая 2018

Попробуйте использовать скобки для разделения ваших вопросов:

if( (condA || condB || condC) && (condD || condE || condF) && (...)) and so on.
(condA = condition A)
0 голосов
/ 26 мая 2018

Это прямой перевод того, что вы сказали коду C ++:

if ((x == a || x == b || x == c) &&
    (y == d || y == e || y == f) &&
    (z == g || z == h || z == i))
{
}

Большинство реальных программ не имеют таких сложных условных выражений.Разбейте свою логику на логические тесты.

0 голосов
/ 26 мая 2018

Просто используйте && и || с круглыми скобками для упрощения группировки.

if ((x == 'a' || x == 'b' || x == 'c') 
    && (y == 'd' || y == 'e' || y == 'f')
    && (z == 'g' || z == 'h' || z == 'i')) {
    // execute code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...