Почему оператор if не работает с несколькими условиями в C ++? - PullRequest
0 голосов
/ 07 ноября 2011

Я столкнулся со странной для меня проблемой.По какой-то причине несколько ||операторы, даже разделенные запятыми и круглыми скобками, работать не будут.Последнее, что я ожидал, это оператор &, который требует выполнения обоих условий, но в моем случае он работает для одного условия, как если бы это был оператор OR.

Кто-то, пожалуйста, объясните мне, почему это происходит.Я очень запутался.

РАБОТАЕТ:

#include<iostream> 
#include<vector>
#include<string>

using namespace std;


int main()
{
string quest;

quest = "Where is my dog?";

string::iterator m;
vector<string>question;

string t;

for(m = quest.begin(); m != quest.end(); m++)
{
    if(*m != ' ' & *m != ',' & *m != '?' & *m != '.') //works with & and &&

    {
        t.push_back(*m);
    }
    else
    { 
        cout << t << endl;
        question.push_back(t);
        t.clear();
    }
}
}

Не работает:

#include<iostream> 
#include<vector>
#include<string>

using namespace std;


int main()
{
string quest;

quest = "Where is my dog?";

string::iterator m;
vector<string>question;

string t;

for(m = quest.begin(); m != quest.end(); m++)
{
    if(*m != ' ' || *m != ',' || *m != '?' || *m != '.')    // DOES NOT WORK
    {
        t.push_back(*m);
    }
    else
    { 
        cout << t << endl;
        question.push_back(t);
        t.clear();
    }
}
}

Ответы [ 4 ]

7 голосов
/ 07 ноября 2011
if(*m != ' ' || *m != ',' || *m != '?' || *m != '.')    // DOES NOT WORK

Что вы ожидаете от этого? Вы спрашиваете, является ли что-то A или нет B. Любое из этих утверждений всегда верно (если A и B не одно и то же), поэтому ваше выражение в целом всегда верно.

Похоже, вы захотите:

if(*m != ' ' && *m != ',' && *m != '?' && *m != '.')

Это условие будет истинным, если *m это что-то , отличное от пробел, запятая, вопросительный знак или точка.

3 голосов
/ 07 ноября 2011

Вы должны использовать && для логических "и".

Оператор

& предназначен для поразрядно"и", что в вашем случае выдает true, поскольку все символы в выражении имеют хотя бы один общий бит.

Что вы пытаетесь сделать?

Обратите внимание, что если намерение состоит в том, чтобы отфильтровать ",?." правильное использование символов &&, потому что || этого не сделает (поскольку каждый символ будет соответствовать как минимум одному, так что вы никогда не попадете в предложение else, всегда переходите к then ).

1 голос
/ 07 ноября 2011

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

Когда речь идет о тестах, необходимо помнить, какоператоры работают.

Использование логического ИЛИ (||) означает, что если один из условий равен true , то весь оператор верен.

Использование логических AND (&&) означает, что если все условий равны true , то весь оператор верен.

См. на этой странице для получения справки по операторам C ++.Примерно на полпути вниз находится раздел «Логические и побитовые операции».

Редактировать: Надеюсь, этот пример кода поможет устранить вашу путаницу:

int A = 0;
int B = 1;

if (A == 0 && B == 0) {
  //This code will not run, as the whole statement is false
  . . . .
}

if (A == 0 && B == 1) { 
  //This code will run, as the whole statement is true
  . . . .
}

if (A == 0 || B == 0) {
  //This code will run, as A = 0, so the whole statement is true
  . . . .
}
1 голос
/ 07 ноября 2011

Или смотрит на первое, если оно не совпадает, переходит к следующему и проверяет его, иначе выполняет код.Так что, если m - это «», первый тест не пройдёт, но второй тест пройдет как «нет», «.

Я ожидаю, что вы действительно хотите что-то вроде:

if (!(*m == ' ' || *m == ',' || *m == '?' || *m == '.'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...