Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2015, 17:46   #1
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию Странности и магия в логическом операторе с++

Здравствуйте!
Написал позавчера тестовое приложение, которое работало и компилилось как надо. Решил доработать его и наткнулся на МАГИЮ!
Все чудесно работает, но в этом то и проблема! Оно не должно работать!
Код из приложения пихать не буду, ибо он мудрён, но суть такова.
Логическое ИЛИ похоже работает вместо логического И. В общем, это какое то колдовство!
Суть в том, что цикл должен заканчиваться после того, как я ввожу нуль. Но он не заканчивается. А вот если вместо || написать && все работает.
Изначально в приложении стояло условие do while(a!=0 || b ==0) и оно работало, хотя условие это какой то звиздец.
Я не понимаю в чём тут проблема. Объясните, пожалуйста.
Нижеприведённый код не выходит из цикла. Хотя, должен.
Код:
using namespace std;

int main()
{
    int a = 0;
    int b = 500;
    int c = 0;
    
    do
    {
        cin >> a;
        c+=a;
        b-=a;
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        cout << "c=" << c << endl;
        
    }while(a!=0 || b!=0);
    
    system("PAUSE");
    return 0;
}
Спасибо.
MrQuestion вне форума Ответить с цитированием
Старый 14.11.2015, 18:31   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если выход по нулю, то и пишите "while(a!=0)".
"while(a!=0 || b!=0)" - означает, "выполнять цикл, пока A и B не станет равно нулю".
"while(a!=0 && b!=0)" - "выполнять цикл, пока A или B не станет равно нулю".
"while(a!=0 || b ==0)" - "выполнять цикл, пока A не станет равно нулю и B станет не нулем".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.11.2015, 20:07   #3
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию

Либо я попал в параллельную реальность , либо что то еще. Всю жизнь логическим ИЛИ был ||, а И &&. Взять хоть ту же статью со студии.
http://cppstudio.com/post/297/
MrQuestion вне форума Ответить с цитированием
Старый 14.11.2015, 20:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Либо я попал в параллельную реальность
Ты просто запутался.
while(a!=0 || b!=0) - закончить, когда и А и В будут равны 0
Так что BDA прав, а ты запутался. Составь таблицу логическую и посмотри чему будет:

Цитата:
А В (a!=0 || b!=0)
0 0 False
1 0 True
0 1 True
1 1 True
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2015, 20:39   #5
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию

Цитата:
while(a!=0 || b!=0) - закончить, когда и А и В будут равны 0
Да почему логическое И то? В условии стоит || - это ИЛИ.
Продолжать если а не равно нулю ИЛИ b не равно нулю. В условии стоит ИЛИ. Закончить, когда а == 0 ИЛИ b == 0.
Товарищи, ну как так то это может быть И, если это ИЛИ?
Таблица правильная. Только почему вы ИЛИ называете И?

Последний раз редактировалось MrQuestion; 14.11.2015 в 20:41.
MrQuestion вне форума Ответить с цитированием
Старый 14.11.2015, 20:45   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Потому что, по сути, записано условие продолжения цикла. Условие же выхода из цикла является отрицанием к условию продолжения.
"Если a!=0 || b!=0, то продолжать цикл" эквивалентно "Если a==0 && b==0, то выйти из цикла".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.11.2015 в 20:53.
BDA на форуме Ответить с цитированием
Старый 14.11.2015, 20:47   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В условии стоит || - это ИЛИ.
Ты не учитываешь !=
Читается как "Пока А не равно нулю или В не равно нулю". Т.е. "Пока и А и В не равны нулю одновременно".
Говорю же - составь таблицу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2015, 20:56   #8
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию

Вот же дела. Я и не знал о таком. О какой таблице вы говорите? Учитывая, что я сейчас узнал, я не составлю верной таблицы, потому что сижу и стекаю с кресла. Вы разрушили мой мир логических операторов. Проделали дыру. Я понял, что ничего о них не знаю. И как работать с ними теперь, тоже не знаю. В учебниках такого не было...
MrQuestion вне форума Ответить с цитированием
Старый 14.11.2015, 21:02   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

читайте "Законы де Моргана"
например, на википедии или в первой попавшейся статье про булевую алгебру - тыц
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.11.2015, 21:08   #10
MrQuestion
Пользователь
 
Регистрация: 16.08.2015
Сообщений: 40
По умолчанию

Спасибо, мистеры модераторы. Теперь придется потрахать себе мозг этими законами.
MrQuestion вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Магия с UPDATE Zhenya-Pvl PHP 3 09.01.2014 16:07
Как определить на каком логическом диске установлена ОС Windows? DeadMan1000 Общие вопросы C/C++ 8 02.06.2013 13:52
Магия вычисления постфиксного выражения дотнет Помощь студентам 0 16.10.2012 20:41
qweqwe магия вконтакте Web-Gangsta Свободное общение 10 27.02.2010 21:47
Как проверить количество свободного и занятого места на логическом диске SeRhy Общие вопросы Delphi 4 09.06.2008 15:39