Всем привет!
Откопал один старый советник, написанный до 600-го билда. И есть там такие строки:
if(a1 || a2 && a3 || a4 && a5 || a6 && a7 || a8 && a9 || a10 && a11 || a12 && a13 || a14 && a15 || a16)
{
// выражение
}
При компиляции, естественно, выпадает кучка предупреждений: check operator precedence for possible error; use parentheses to clarify precedence.
Если расставлять скобки с учетом физического смысла переменных, то при тестировании получается совершенно иной результат, чем при тестировании с этим предупреждением, поэтому мне важно понять, как данная строка воспринимается компилятором и как нужно расставить скобки так, чтобы смысл строки не поменялся, но исчезло предупреждение.
Прошу помощи.
Надо сначала разобраться с логикой. Например если взять первые 3 переменных, то получается 2 разных смысла
1. а1 или (а2 и а3)
2. (а1 или а2) и а3
а если пойти дальше то вариантов будет увеличиваться в прогрессии.
Если ориентироваться на старый компилятор, то получается, что надо в скобки заключить пары "или" потому что приоритет || и && поменялись местами.
итого
if((a1 || a2) && (a3 || a4) && (a5 || a6) && (a7 || a8) && (a9 || a10) && (a11 || a12) && (a13 || a14) && (a15 || a16))
{
// выражение
}
- docs.mql4.com
Хлам, написанный с ошибками и работающий только благодаря им, не стоит затраченного времени.
Отзывчивый народ здесь - попутно и краткий совет по тайм-менеджменту дали.
P./S.: Но прэдмэт можно видеть с разной точки зрения. Для меня ключевая фраза в вопросе автора темы, это:
... поэтому мне важно понять, как данная строка воспринимается компилятором ...
То есть, бэз привязки к какому-то конкретному "коду-ветерану".
Отзывчивый народ здесь - попутно и краткий совет по тайм-менеджменту дали.
P./S.: Но прэдмэт можно видеть с разной точки зрения. Для меня ключевая фраза в вопросе автора темы, это:
... поэтому мне важно понять, как данная строка воспринимается компилятором ...
То есть, бэз привязки к какому-то конкретному "коду-ветерану".
Дина, так ТС в первом посте сам себе и ответил - ...естественно, выпадает кучка предупреждений...
Вот так и воспринимается :)
Дина, так ТС в первом посте сам себе и ответил - ...естественно, выпадает кучка предупреждений...
Вот так и воспринимается :)
Алексей..., я говорила про ключевую фразу, а не отдельно-обособленную и/или вырванную из контекста. Для меня это разные весчи.
Приводила её так:
... поэтому мне важно понять, как данная строка воспринимается компилятором ...
исходя из взаимоувязки с полным текстом.
Полный текст поста автора темы:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Как правильно расставить скобки для компилятора?
Artyom Kuraev, 2016.11.28 05:19
Всем привет!
Откопал один старый советник, написанный до 600-го билда. И есть там такие строки:
if(a1 || a2 && a3 || a4 && a5 || a6 && a7 || a8 && a9 || a10 && a11 || a12 && a13 || a14 && a15 || a16)
{
// выражение
}
При компиляции, естественно, выпадает кучка предупреждений: check operator precedence for possible error; use parentheses to clarify precedence.
Если расставлять скобки с учетом физического смысла переменных, то при тестировании получается совершенно иной результат, чем при тестировании с этим предупреждением, поэтому мне важно понять, как данная строка воспринимается компилятором и как нужно расставить скобки так, чтобы смысл строки не поменялся, но исчезло предупреждение.
Прошу помощи.
Исходя из изложенного им, я и привела ссылку на Документацию. На страницу приоритетов и порядка в прежнем и текущих языках.
Кроме того, в приводимой мной там странице Документации есть ссылка перехода и на другие отличия.
А так... В контексте вопроса автора темы, частичные выкопировки:
- в рамках текущего MQL4 (но полное смысловое значение естественно нужно смотреть на странице Документации):
"Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.
Внимание: Приоритет выполнения операций в языке MQL4 соответствует приоритету, принятому в языке С++.
...
&&
Логическая операция И
Слева направо
||
Логическая операция ИЛИ
Слева направо
...
Для изменения порядка выполнения операций применяются круглые скобки, которые имеют высший приоритет."(с)
- в прежнем языке, до 600-го билда (полное смысловое значение естественно нужно смотреть на странице Документации):
"...
Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.
...
||
Логическая операция ИЛИ
Слева направо
&&
Логическая операция И
Слева направо
...
Для изменения порядка выполнения операций применяются круглые скобки, которые имеют высший приоритет.
Внимание: Приоритет выполнения операций в старой версии языка MQL4 несколько отличается от приоритета, принятого в языке Си."(с)
P./S.: То есть, по-сути, изначально (первым своим постом здесь) я привела ссылку, как дополнение документальными данными к посту Alexey Viktorov.
А у меня почему-то документация mql4 не открывается.
Да и форум тоже, видимо от того что одна падлюка удалила там мой аккаунд.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет!
Откопал один старый советник, написанный до 600-го билда. И есть там такие строки:
if(a1 || a2 && a3 || a4 && a5 || a6 && a7 || a8 && a9 || a10 && a11 || a12 && a13 || a14 && a15 || a16)
{
// выражение
}
При компиляции, естественно, выпадает кучка предупреждений: check operator precedence for possible error; use parentheses to clarify precedence.
Если расставлять скобки с учетом физического смысла переменных, то при тестировании получается совершенно иной результат, чем при тестировании с этим предупреждением, поэтому мне важно понять, как данная строка воспринимается компилятором и как нужно расставить скобки так, чтобы смысл строки не поменялся, но исчезло предупреждение.
Прошу помощи.