ave! 0 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Добрый день! Я переношу чужую программу с AVR на STM32 (под HAL Keil). m = m+I|P == I ? m : 0; Эта строка выдает предупреждение: "| имеет более низкий приоритет, чем ==; == будет оцениваться сначала" Когда пишу m = (m+I|P) == I ? m : 0; предупреждение исчезает, но я не знаю можно ли так писать, не нарушит ли эта запись условие. Таких предупреждений много и есть более сложные выражения. if (x+r-y|u&32|p > 2&(p-4|j-7 || b[G=x+3^r>>1&7]-k-6 || b[G^1]|b[G^2])) t += p<5; else F = y; Warning: '&' within (внутри) '|' Warning: & has lower precedence than >; > will be evaluated first Warning: '&' within (внутри) '|' Подскажите ссылку где можно поучится этим условиям в контексте моей проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Подскажите ссылку где можно поучится этим условиям в контексте моей проблемы. Гуглите "c operator precedence". Надо заметить, что это - if (x+r-y|u&32|p > 2&(p-4|j-7 || b[G=x+3^r>>1&7]-k-6 || b[G^1]|b[G^2])) t += p<5; else F = y; - просто прекрасно. В жизни не видел такой красоты в реальных проектах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Segment 3 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Воу. Если не секрет, то что это за проект такой? А так, Вам необходимо просто почитать о приоритетах операторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Дык, обфускация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Segment 3 20 августа, 2018 Опубликовано 20 августа, 2018 (изменено) · Жалоба Да, да, она или дизассемблировано. Просто я однажды видел нечто подобное, написанное руками — математик пытался закодировать свои формулы, и у него получилось где-то с десяток тысяч строк подобного кода. Изменено 20 августа, 2018 пользователем segment Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба m = m+I|P == I ? m : 0; Эта строка выдает предупреждение: "| имеет более низкий приоритет, чем ==; == будет оцениваться сначала" Когда пишу m = (m+I|P) == I ? m : 0; предупреждение исчезает, но я не знаю можно ли так писать, не нарушит ли эта запись условие. Скобки вы расставили неправильно даже несмотря на подсказку компилятора. Если автор исходного кода знал приоритеты операций (а судя по всему он их знал), то скобки должны стоять так: m = ((m + I) | (P == I)) ? m : 0. P.S. В последнее время компиляторы что-то уж больно часто стали ругаться на очевидные выражения. Неужели настолько упал уровень основной массы современных программистов, что они не в состоянии запомнить приоритет операторов? Жду - не дождусь, когда компилятор начнет требовать скобки в выражении a*x+b. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Дык, обфускация. Для обычной обфускации это как-то слишком. Тут что-то болезненное просматривается. P.S. В последнее время компиляторы что-то уж больно часто стали ругаться на очевидные выражения... GCC еще и замены предлагает в гугл-стиле: "а не имели ли Вы, уважаемый, в виду A, а не B?" А ведь кто-то просто последует такой рекомендации не вникая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Скобки вы расставили неправильно даже несмотря на подсказку компилятора. Если автор исходного кода знал приоритеты операций (а судя по всему он их знал), то скобки должны стоять так: m = ((m + I) | (P == I)) ? m : 0. P.S. В последнее время компиляторы что-то уж больно часто стали ругаться на очевидные выражения. Неужели настолько упал уровень основной массы современных программистов, что они не в состоянии запомнить приоритет операторов? Жду - не дождусь, когда компилятор начнет требовать скобки в выражении a*x+b. Вот ни разу не очевидное выражение :maniac: Плюс что-то кажется мне, что тут правильней не бинарное или, а логическое. А по теме - врядли в IAR и gcc разный приоритет операторов, если проект у вас был рабочий - оставьте как есть, просто отключите эти ворнинги. Если хотите улучшить читаемость - лучше ее отдельно улучшать, после того как перенесенный проект заработает в таком виде Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ave! 0 20 августа, 2018 Опубликовано 20 августа, 2018 (изменено) · Жалоба Воу. Если не секрет, то что это за проект такой? Это не секрет, это шахматная программа micro-Max. Весь код помещается на одном листе А4, притом, что программа знает даже такое правило, как "взятие пешки на проходе". Мне этот алгоритм очень понравился, я когда-то с друзьями в турнир играл, четырех обыграл, а эта програмка меня взувает (сделал шахматный калькулятор на ATmega48). Тут верно заметили, что код писал математик. Спасибо за советы. Изменено 20 августа, 2018 пользователем ave! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба if (x+r-y|u&32|p > 2&(p-4|j-7 || b[G=x+3^r>>1&7]-k-6 || b[G^1]|b[G^2])) t += p<5; else F = y; Типичный говнокод, а не обфускация. Ибо приводить тип bool к численному - дурная манера, которая может вылезти боком при переходе на другой компилятор. И нормальный обфускатор такое делать не станет. Да и просто это ведёт к неоптимальному коду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Вот ни разу не очевидное выражениеПриоритет операций известен. Да, оно сложнее, чем a+b, но ничего неоднозначного и тем более неочевидного в нем нет. В a*x+b тоже будем скобки расставлять? Плюс что-то кажется мне, что тут правильней не бинарное или, а логическое.С этим согласен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Тут верно заметили, что код писал математик. Код писал извращенец человек, цель которого была совсем не оптимальность и не решение практической задачи, а цель - вычурность кода. Ибо: вместо t += p<5 простой программист использует if, а более продвинутый заменит на что-то типа: t -= (int)(p - 5) >> 31; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ave! 0 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Скобки вы расставили неправильно даже несмотря на подсказку компилятора. Если автор исходного кода знал приоритеты операций (а судя по всему он их знал), то скобки должны стоять так: m = ((m + I) | (P == I)) ? m : 0. Сергей Борщ, я скопировал все 7 предупреждений. Может у вас будет настроение расставить все скобки. Буду вам очень благодарен. Чувствую, что даже после изучения приоритетов я все-равно где-то, что-то не так сделаю. Программа скомпилируется и даже работать будет, но это шахматный алгоритм, там можно не понять что что-то не так работает. (1) while (d++<n||d<3||z&K==I&&(N<T&d<98||(K=X,L=Y&~M,d=3))) (2) while (r=p>2&r<0?-r:-o[++j]) (3) if (t&k|p<3&!(y-x&7)-!t) (4) v-=p-4|R>29?0:20; (5) Y=y|S&F; (6) if (x+r-y|u&32|p>2&(p-4|j-7||b[G=x+3^r>>1&7]-k-6||b[G^1]|b[G^2])) (7) m=m+I|P==I?m:0; Исправление готово: m = ((m+I)|(P==I)) ? m : 0; Мой случай как раз яркий пример для статьи на хабре: Как вы пишете условия в СИ-подобных языках? Со скобками в условиях или без? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Исправление готово: m = ((m+I)|(P==I)) ? m : 0; Эта конструкция скомпилится в большее число команд, чем простое, читаемое и аналогичное по результату: if (!(m + I) && P != I) m = 0; И в других местах - аналогично. Поэтому единственная цель такого поделия - сделать вычурный код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба Поэтому единственная цель такого поделия - сделать вычурный код. ну собственно так там и написано My original aim was to write a chess program smaller than 1024 characters Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться