Некорректное чтение условий в цикле while

202
31 декабря 2018, 02:40
while ((x > -1) && ((urav[x] != '+') || (urav[x] != '-'))) 
while ((x > -1) && !((urav[x] == '+') || (urav[x] == '-')))

В первой строчке условие после && полностью игнорируется, в при вынесении ! за скобку, как во второй строчке, оно учитывается. Кто знает, в чем причина?

Answer 1

Давайте сообразим...

(urav[x] != '+') || (urav[x] != '-')

Если urav[x] - +, мы получаем false||true == true.
Если urav[x] - -, мы получаем true||false == true.
Если urav[x] - что-то еще, получаем true||true==true.

Т.е. это всегда true. Условие &&true - это просто первая часть условия.

Вот оптимизатор и выбросил лишнее.

Надеюсь, то, что !a || !b совсем не то же, что и !(a||b), для вас очевидно? Т.е. что условие во втором цикле отличается от условия в первом цикле?

На всякий случай: !a || !b по-другому записывается как !(a&&b).
А !(a||b) - как (!a && !b)...

Answer 2

Предполагаем, что второе условие - исходное, а первое - то что у вас получилось после внесения отрицания в скобки. Но внесение отрицания в скобки вы не правильно выполнили, тут нужно применять законы де Моргана, т.е. при внесении/вынесении отрицания логическое ИЛИ (дизъюнкция) должно меняться на И (конъюнкция), и наоборот:

!(urav[x] == '+' || urav[x] == '-') <=> (эквивалентно) (urav[x] != '+' && urav[x] != '-')

(убрал лишние скобки, т.к. операции сравнения и так имеют более высокий приоритет, чем логические операции)

Если в первом выражении, наоборот, вынести отрицание за скобки, то получим:

!(urav[x] == '+' && urav[x] == '-')

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

READ ALSO
Как найти базовый адрес?

Как найти базовый адрес?

как мне найти базовый адрес указателя вида "serverdll"+0066CAA ?

234
Как в данном случае запретить изменение элементов массива в классе из программы?

Как в данном случае запретить изменение элементов массива в классе из программы?

Один из вариантов, ввести изменения в классе (заодно исправим ошибки)

205
Поиск в массиве по компоненту значения (сложный тип)

Поиск в массиве по компоненту значения (сложный тип)

На ночь глядя голова не варит ужеПодскажите как решить следующую проблему самым эффективным (быстрым) способом на C++11, C++14, в общем не на старье...

207
Ширина и высота полей ввода в зависимости от содержимого

Ширина и высота полей ввода в зависимости от содержимого

Нужно задавать высоту QTextEdit в зависимости от кол-ва строк содержимого и если строк нет, то и высота нулеваяТоже самое и для QLineEdit, но для ширины

237