чисто академический интерес?
Программу пишу. Советника вернее. Есть условие, отличить, где мы торгуем, на Валюте или Фондах. От этого, если на Форексе - то ведем учет одной переменной, а если на Фондах - то задействуем другую переменную. + есть переменная общая для обоих инструментах.
Очень надо разобраться как строить логику условий и вложенных условий.
почему приведенное вами условия не нравится?
почему приведенное вами условия не нравится?
Не работает. Это пример условие. В реальном условии по отдельности (3 блока) не выполняется, то есть ни одно из низ не выполняется - а оператор пропускает дальше.
Можно пример, как правильно сделать множественные условия, подобно моему сюжету? :).
вы неясно изьясняетесь - что вам надо, сами привели уже готовую реализацию какой-то логики.
если вы считаете показанный код неверным - напишите словами подробно что вы хотите сравнить и что проверить.
---
PS ошибка может быть банальной - вы не поставили скобки для указания приоритета операций
Приоритеты операций && и || различны, это следует учитывать.
Также вычисление сложных логических операций имеет интересную особенность: далеко не все подвыражения могут вычисляться. Подвыражения вычисляются слева направо, с группировкой операций согласно приоритетов, причём, вычисляется минимум подвыражений, которые необходимо вычислить, чтобы общее значение выражения стало ясно. Здесь это названо "короткой оценкой".
Для того, чтобы всё понять самому, нужно поэкспериментировать с "визуализирующим" кодом, например:
#property strict /******************************************************************************/ bool f(uint n, bool b) { Print("f", n, "(): ", b ? "true" : "false"); return b; } /******************************************************************************/ void OnStart() { Print("Раз:"); bool a = f(1, true) || f(2, true) && f(3, true); Print("a = ", a); Print("Два:"); bool b = f(1, true) && f(2, true) && f(3, true); Print("b = ", b); Print("Три:"); bool c = f(1, false) || f(2, false) && f(3, false); Print("c = ", c); Print("Четыре:"); bool d = f(1, false) && f(2, false) && f(3, false); Print("d = ", d); }
Функция f() - визуализирующая: если подвыражение вычислялось, то функция была вызвана, и она напишет об этом. Ей передаётся число, которое она напишет, чтобы видеть, какие вычислялись подвыражения, и логическое значение, которое она также сообщит и вернёт в качестве результата подвыражения.
Данный код даёт следующее (build 646, WinXP-32):
23:47:42 Script 1 EURUSDr,H1: loaded successfully 23:47:42 1 EURUSDr,H1: initialized 23:47:42 1 EURUSDr,H1: Раз: 23:47:42 1 EURUSDr,H1: f1(): true 23:47:42 1 EURUSDr,H1: a = true 23:47:42 1 EURUSDr,H1: Два: 23:47:42 1 EURUSDr,H1: f1(): true 23:47:42 1 EURUSDr,H1: f2(): true 23:47:42 1 EURUSDr,H1: f3(): true 23:47:42 1 EURUSDr,H1: b = true 23:47:42 1 EURUSDr,H1: Три: 23:47:42 1 EURUSDr,H1: f1(): false 23:47:42 1 EURUSDr,H1: f2(): false 23:47:42 1 EURUSDr,H1: c = false 23:47:42 1 EURUSDr,H1: Четыре: 23:47:42 1 EURUSDr,H1: f1(): false 23:47:42 1 EURUSDr,H1: d = false 23:47:42 1 EURUSDr,H1: uninit reason 0 23:47:42 Script 1 EURUSDr,H1: removed
В первом случае вычислилось только первое логическое подвыражение, потому что после этого стало ясно значение всего выражения, поскольку, в связи с приоритетами, группировка (показано с помощью скобок) происходит ТАК: "f(1, true) || (f(2, true) && f(3, true))", а НЕ так: "(f(1, true) || f(2, true)) && f(3, true)".
Во втором случае требуется вычислить все 3 подвыражения, чтобы узнать значение всего выражения, меньшим числом подвыражений не обойтись.
В третьем случае - два подвыражения, в четвёртом - одно.
Поэкспериментируйте, задавая различные возвращаемые значения подвыражениям, а также задавая различные логические операции между ними.
Для двух подвыражений, для трёх, как в этом примере, для четырёх...
Поприменяйте скобки для изменения группировки операций...
Методично пройдите все варианты, пока не окажетесь в состоянии заранее "предсказывать", как и что будет вычисляться для логических выражений любой сложности.
Ещё есть такая штука, как условное выражение (?:), оно используется в данном коде в функции f(), но оно не очень часто к месту, хотя порой - ну, очень к месту и очень удобно.
Приоритеты операций && и || различны, это следует учитывать.
Также вычисление сложных логических операций имеет интересную особенность: далеко не все подвыражения могут вычисляться. Подвыражения вычисляются слева направо, с группировкой операций согласно приоритетов, причём, вычисляется минимум подвыражений, которые необходимо вычислить, чтобы общее значение выражения стало ясно. Здесь это названо "короткой оценкой".
Для того, чтобы всё понять самому, нужно поэкспериментировать с "визуализирующим" кодом, например:
Функция f() - визуализирующая: если подвыражение вычислялось, то функция была вызвана, и она напишет об этом. Ей передаётся число, которое она напишет, чтобы видеть, какие вычислялись подвыражения, и логическое значение, которое она также сообщит и вернёт в качестве результата подвыражения.
Данный код даёт следующее (build 646, WinXP-32):
В первом случае вычислилось только первое логическое подвыражение, потому что после этого стало ясно значение всего выражения, поскольку, в связи с приоритетами, группировка (показано с помощью скобок) происходит ТАК: "f(1, true) || (f(2, true) && f(3, true))", а НЕ так: "(f(1, true) || f(2, true)) && f(3, true)".
Во втором случае требуется вычислить все 3 подвыражения, чтобы узнать значение всего выражения, меньшим числом подвыражений не обойтись.
В третьем случае - два подвыражения, в четвёртом - одно.
Поэкспериментируйте, задавая различные возвращаемые значения подвыражениям, а также задавая различные логические операции между ними.
Для двух подвыражений, для трёх, как в этом примере, для четырёх...
Поприменяйте скобки для изменения группировки операций...
Методично пройдите все варианты, пока не окажетесь в состоянии заранее "предсказывать", как и что будет вычисляться для логических выражений любой сложности.
Ещё есть такая штука, как условное выражение (?:), оно используется в данном коде в функции f(), но оно не очень часто к месту, хотя порой - ну, очень к месту и очень удобно.
Да, благодарю :). Хороший пример, сейчас буду копаться.
Благодарю всех, как всегда - все получилось :).
if (((a == b && a > b) || (a != b && b > b)) && other_ifs == true) { // ... }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как реализовать такое?
Примерно такое.
Если есть А и оно равно 1 и Б = 2 или С = 3.
Или если А = 2 и Б = 2 и С = 2.
И С = 3
Пример из воздуха, принцип сам важен. Чтобы не делать 2 проверки if`ами, нужно 2-е, 3-е условие сделать в одном операторе. Как? :)