|
Проблема с условием, m = m+I|P == I ? m : 0; |
|
|
|
Aug 20 2018, 08:45
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(ave! @ Aug 20 2018, 11:18) Подскажите ссылку где можно поучится этим условиям в контексте моей проблемы. Гуглите "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; - просто прекрасно. В жизни не видел такой красоты в реальных проектах.
|
|
|
|
|
Aug 20 2018, 09:01
|
Гуру
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095
|
QUOTE (ave! @ Aug 20 2018, 11:18) 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.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 20 2018, 09:05
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(ViKo @ Aug 20 2018, 11:57) Дык, обфускация. Для обычной обфускации это как-то слишком. Тут что-то болезненное просматривается. Цитата(Сергей Борщ @ Aug 20 2018, 12:01) P.S. В последнее время компиляторы что-то уж больно часто стали ругаться на очевидные выражения... GCC еще и замены предлагает в гугл-стиле: "а не имели ли Вы, уважаемый, в виду A, а не B?" А ведь кто-то просто последует такой рекомендации не вникая.
|
|
|
|
|
Aug 20 2018, 10:18
|
Знающий
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153
|
Цитата(Сергей Борщ @ Aug 20 2018, 12:01) Скобки вы расставили неправильно даже несмотря на подсказку компилятора. Если автор исходного кода знал приоритеты операций (а судя по всему он их знал), то скобки должны стоять так: m = ((m + I) | (P == I)) ? m : 0.
P.S. В последнее время компиляторы что-то уж больно часто стали ругаться на очевидные выражения. Неужели настолько упал уровень основной массы современных программистов, что они не в состоянии запомнить приоритет операторов? Жду - не дождусь, когда компилятор начнет требовать скобки в выражении a*x+b. Вот ни разу не очевидное выражение Плюс что-то кажется мне, что тут правильней не бинарное или, а логическое. А по теме - врядли в IAR и gcc разный приоритет операторов, если проект у вас был рабочий - оставьте как есть, просто отключите эти ворнинги. Если хотите улучшить читаемость - лучше ее отдельно улучшать, после того как перенесенный проект заработает в таком виде
|
|
|
|
|
Aug 20 2018, 10:29
|
Участник
Группа: Участник
Сообщений: 23
Регистрация: 20-05-11
Пользователь №: 65 166
|
Цитата(segment @ Aug 20 2018, 11:55) Воу. Если не секрет, то что это за проект такой? Это не секрет, это шахматная программа micro-Max. Весь код помещается на одном листе А4, притом, что программа знает даже такое правило, как "взятие пешки на проходе". Мне этот алгоритм очень понравился, я когда-то с друзьями в турнир играл, четырех обыграл, а эта програмка меня взувает (сделал шахматный калькулятор на ATmega48). Тут верно заметили, что код писал математик. Спасибо за советы.
Сообщение отредактировал ave! - Aug 20 2018, 10:42
|
|
|
|
|
Aug 20 2018, 11:25
|
Гуру
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095
|
QUOTE (Непомнящий Евгений @ Aug 20 2018, 13:18) Вот ни разу не очевидное выражение Приоритет операций известен. Да, оно сложнее, чем a+b, но ничего неоднозначного и тем более неочевидного в нем нет. В a*x+b тоже будем скобки расставлять? QUOTE (Непомнящий Евгений @ Aug 20 2018, 13:18) Плюс что-то кажется мне, что тут правильней не бинарное или, а логическое. С этим согласен.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 20 2018, 11:31
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(ave! @ Aug 20 2018, 13:29) Тут верно заметили, что код писал математик. Код писал извращенец человек, цель которого была совсем не оптимальность и не решение практической задачи, а цель - вычурность кода. Ибо: вместо t += p<5 простой программист использует if, а более продвинутый заменит на что-то типа: t -= (int)(p - 5) >> 31;
|
|
|
|
|
Aug 20 2018, 11:36
|
Участник
Группа: Участник
Сообщений: 23
Регистрация: 20-05-11
Пользователь №: 65 166
|
Цитата(Сергей Борщ @ Aug 20 2018, 12:01) Скобки вы расставили неправильно даже несмотря на подсказку компилятора. Если автор исходного кода знал приоритеты операций (а судя по всему он их знал), то скобки должны стоять так: 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; Мой случай как раз яркий пример для статьи на хабре: Как вы пишете условия в СИ-подобных языках? Со скобками в условиях или без?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|