Скачать MetaTrader 5

Как правильно расставить скобки для компилятора?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Artyom Kuraev
971
Artyom Kuraev  

Всем привет!

Откопал один старый советник, написанный до 600-го билда. И есть там такие строки:

bool a1, a2, a3, a4, a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16;

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.

Если расставлять скобки с учетом физического смысла переменных, то при тестировании получается совершенно иной результат, чем при тестировании с этим предупреждением, поэтому  мне важно понять, как данная строка воспринимается компилятором и как нужно расставить скобки так, чтобы смысл строки не поменялся, но исчезло предупреждение.

Прошу помощи.

Alexey Viktorov
11424
Alexey Viktorov  
Artyom Kuraev:

Всем привет!

Откопал один старый советник, написанный до 600-го билда. И есть там такие строки:

bool a1, a2, a3, a4, a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16;

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

а если пойти дальше то вариантов будет увеличиваться в прогрессии.

Если ориентироваться на старый компилятор, то получается, что надо в скобки заключить пары "или" потому что приоритет || и && поменялись местами.

итого

bool a1, a2, a3, a4, a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16;

if((a1 || a2) && (a3 || a4) && (a5 || a6) && (a7 || a8) && (a9 || a10) && (a11 || a12) && (a13 || a14) && (a15 || a16))

{

// выражение

}
Dina Paches
8140
Dina Paches  
Artyom Kuraev:
Приоритеты и порядок операций в прежней и текущей версиях языка MQL4. О приоритетах и порядке операций в прежних версиях языка см.там вторую табл.
Приоритеты и порядок операций - Операции и выражения - Основы языка - Справочник MQL4
Приоритеты и порядок операций - Операции и выражения - Основы языка - Справочник MQL4
  • docs.mql4.com
Приоритеты и порядок операций - Операции и выражения - Основы языка - Справочник MQL4
Dina Paches
8140
Dina Paches  
P./S.: При переводе старых программ MQL4 на язык MQL5 эта ссылка, что привела, так же может быть полезна.
Vitalie Postolache
12429
Vitalie Postolache  
Хлам, написанный с ошибками и работающий только благодаря им, не стоит затраченного времени.
Nikolay Khrushchev
19720
Nikolay Khrushchev  
Vitalie Postolache:
Хлам, написанный с ошибками и работающий только благодаря им, не стоит затраченного времени.
абсолютно согласен! 
Dina Paches
8140
Dina Paches  

Отзывчивый народ здесь - попутно и краткий совет по тайм-менеджменту дали.

P./S.: Но  прэдмэт можно видеть с разной точки зрения. Для меня ключевая фраза в вопросе автора темы, это:

... поэтому  мне важно понять, как данная строка воспринимается компилятором ... 

То есть, бэз привязки к какому-то конкретному "коду-ветерану".

Alexey Volchanskiy
19497
Alexey Volchanskiy  
Dina Paches:

Отзывчивый народ здесь - попутно и краткий совет по тайм-менеджменту дали.

P./S.: Но  прэдмэт можно видеть с разной точки зрения. Для меня ключевая фраза в вопросе автора темы, это:

... поэтому  мне важно понять, как данная строка воспринимается компилятором ... 

То есть, бэз привязки к какому-то конкретному "коду-ветерану".

Дина, так ТС в первом посте сам себе и ответил - ...естественно, выпадает кучка предупреждений...

Вот так и воспринимается :) 

Dina Paches
8140
Dina Paches  
Alexey Volchanskiy:

Дина, так ТС в первом посте сам себе и ответил - ...естественно, выпадает кучка предупреждений...

Вот так и воспринимается :) 

Алексей..., я говорила про ключевую фразу, а не отдельно-обособленную и/или вырванную из контекста. Для меня это разные весчи.

Приводила её так:

... поэтому  мне важно понять, как данная строка воспринимается компилятором ...  

исходя из взаимоувязки с полным текстом.

Полный текст поста автора темы: 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как правильно расставить скобки для компилятора?

Artyom Kuraev, 2016.11.28 05:19

Всем привет!

Откопал один старый советник, написанный до 600-го билда. И есть там такие строки:

bool a1, a2, a3, a4, a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16;

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 несколько отличается от приоритета, принятого в языке Си."(с)

Dina Paches
8140
Dina Paches  
P./S.: То есть, по-сути, изначально (первым своим постом здесь) я привела ссылку, как дополнение документальными данными к посту Alexey Viktorov.
Alexey Viktorov
11424
Alexey Viktorov  
Dina Paches:
P./S.: То есть, по-сути, изначально (первым своим постом здесь) я привела ссылку, как дополнение документальными данными к посту Alexey Viktorov.

А у меня почему-то документация mql4 не открывается.

Да и форум тоже, видимо от того что одна падлюка удалила там мой аккаунд.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий