реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Проблема с условием, m = m+I|P == I ? m : 0;
ave!
сообщение Aug 20 2018, 12:20
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 20-05-11
Пользователь №: 65 166



Приоритет операций C++ - это я себе в тему на заметку.

Цитата(jcxz @ Aug 20 2018, 14:47) *
Эта конструкция скомпилится в большее число команд, чем простое, читаемое и аналогичное по результату: if (!(m + I) && P != I) m = 0;
И в других местах - аналогично.
Поэтому единственная цель такого поделия - сделать вычурный код.

jcxz, может вы поможете разобраться с остальными местами по списку.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 20 2018, 12:23
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ave! @ Aug 20 2018, 15:20) *
jcxz, может вы поможете разобраться с остальными местами по списку.

Мне кажется первая строчка к си не относится. Или там ошибка. Вы там где-то имя функции не забыли? Иначе компилятор должен был ругнуться.
В чём там разбираться? Компилируется? Работает? Тогда зачем разбираться?
А если не работает - отлаживать? нет уж, увольте rolleyes.gif
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 20 2018, 12:35
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Сергей Борщ @ Aug 20 2018, 14:25) *
Приоритет операций известен. Да, оно сложнее, чем a+b, но ничего неоднозначного и тем более неочевидного в нем нет. В a*x+b тоже будем скобки расставлять?


это конечно вкусовщина, но я бы расставил для всего кроме арифметических операторов. Наверное у меня такого кода очень мало и мне лень учить приоритеты, а также задумываться - разные ли они в си, питоне, яваскрипте и т.п.
Go to the top of the page
 
+Quote Post
ave!
сообщение Aug 20 2018, 13:05
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 20-05-11
Пользователь №: 65 166



Цитата(jcxz @ Aug 20 2018, 15:23) *
Мне кажется первая строчка к си не относится. Или там ошибка. Вы там где-то имя функции не забыли? Иначе компилятор должен был ругнуться.

Код рабочий, на AVR компилируется без ошибок и предупреждений. Предупреждения только при переносе на STM.
На самом деле это с моей стороны извращение пытаться понять этот код.

Стиль написания самой функции поиска следующего хода для меня не понятна:

short D(q,l,e,E,z,n)
short q,l,e;
unsigned char E,z,n;
{
//...
}

Я подозреваю, что это тоже самое что:

short D(short q, short l, short e, unsigned char E, unsigned char z, unsigned char n) {
//...
}

Под AVR компилятор пропустил и первую запись, а вот под STM не прошло.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 20 2018, 13:24
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ave! @ Aug 20 2018, 16:05) *
Стиль написания самой функции поиска следующего хода для меня не понятна:
short D(q,l,e,E,z,n)

Возможно там макросами что-то переопределено.

Цитата(ave! @ Aug 20 2018, 14:36) *
(1) while (d++<n||d<3||z&K==I&&(N<T&d<98||(K=X,L=Y&~M,d=3)))

Но такое не должно компилиться. имхо. выделенное.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 20 2018, 13:28
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (jcxz @ Aug 20 2018, 16:24) *
Возможно там макросами что-то переопределено.
Это K&R style, поддерживается компиляторами для совместимости с самыми старыми исходниками (созданными еще до принятия Стандарта языка), сейчас практически не применяется и это правильно.
QUOTE (jcxz @ Aug 20 2018, 16:24) *
Но такое не должно компилиться. имхо. выделенное.
Почему? Оператор "запятая" никто не отменял.


QUOTE (ave! @ Aug 20 2018, 16:05) *
Я подозреваю, что это тоже самое что:
Да, именно так.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 20 2018, 13:30
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Сергей Борщ @ Aug 20 2018, 16:28) *
Это K&R style, сейчас практически не применяется и это правильно.

и ну его... в сад. rolleyes.gif
Go to the top of the page
 
+Quote Post
yes
сообщение Aug 20 2018, 14:28
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



ну дык (по описанию micro-Max) задача стояла минимум символов в коде, поэтому такой код
была такая специальная олимпиада по С программированию sm.gif, помню печать кода программы в стдаут, например, но чтобы шахматы - это охренеть
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 20 2018, 16:12
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(yes @ Aug 20 2018, 17:28) *
ну дык (по описанию micro-Max) задача стояла минимум символов в коде, поэтому такой код
была такая специальная олимпиада по С программированию sm.gif, помню печать кода программы в стдаут, например, но чтобы шахматы - это охренеть

А я вот помню что когда-то умудрялись написать программу в ASCII-символах. Т.е. - файл программы состоял только из байтов печатаемого диапазона ASCII-кодов: 33...126.
Отсылаешь такую прогу как обычный текст, сохраняешь в файл, переименовываешь его в расширение .com и запускаешь rolleyes.gif
Без всякого base- или uue-кодирования. А если применительно к МК, то никакого .hex тогда не надо, .bin вполне текстовый был бы.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 22 2018, 12:33
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(jcxz @ Aug 20 2018, 15:31) *
Ибо: вместо t += p<5 простой программист использует if, а более продвинутый заменит на что-то типа: t -= (int)(p - 5) >> 31;


А еще результат выражения != 0 не обязательно есть 1. Поэтому тот, кто писал t += p<5, явно чудак biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 22 2018, 13:02
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Arlleex @ Aug 22 2018, 15:33) *
А еще результат выражения != 0 не обязательно есть 1. Поэтому тот, кто писал t += p<5, явно чудак biggrin.gif

Я об этом писал ещё в 10-м посте:
Цитата(jcxz @ Aug 20 2018, 14:17) *
Ибо приводить тип bool к численному - дурная манера, которая может вылезти боком при переходе на другой компилятор.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 22 2018, 13:55
Сообщение #27


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Arlleex @ Aug 22 2018, 15:33) *
А еще результат выражения != 0 не обязательно есть 1.
Обязательно есть.
QUOTE (Arlleex @ Aug 22 2018, 15:33) *
Поэтому тот, кто писал t += p<5, явно чудак biggrin.gif
Тот, кто писал этот код, очень хорошо знал Стандарт языка. В отличие от вас.
QUOTE
6.5.8 Relational operators
6 Each of the operators < (less than), > (greater than), <= (less than or equal to), and >=
(greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.89)
The result has type int.
6.5.9 Equality operators
The == (equal to) and != (not equal to) operators are analogous to the relational
operators except for their lower precedence.90) Each of the operators yields 1 if the
specified relation is true and 0 if it is false. The result has type int.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 25 2018, 07:08
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Сергей Борщ @ Aug 22 2018, 16:55) *
Обязательно есть.
Тот, кто писал этот код, очень хорошо знал Стандарт языка. В отличие от вас.

Вон оно как? Стандартов не читал, да, признаю.
Но вот будет ли так в дальнейшем - не совсем ясно, поэтому так писать лично я бы не стал. Ведь компиляторы все новее и новее, а оптимизация все хитрее. Никто не знает, во что это выльется в будущем.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 25 2018, 07:21
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Arlleex @ Aug 25 2018, 10:08) *
Но вот будет ли так в дальнейшем - не совсем ясно, поэтому так писать лично я бы не стал. Ведь компиляторы все новее и новее, а оптимизация все хитрее. Никто не знает, во что это выльется в будущем.

Я тоже выше об этом писал. Понятно что сейчас это работает. Но такой подход и стиль считаю плохим.
char тоже раньше всегда был знаковым, а сейчас может быть и беззнаковым, в зависимости от установок компилятора. Всё потому, что в появились некоторые CPU, в которых чтение/запись беззнаковых char короче чем знаковых, и во многих случаях, когда знаковость не важна, лучше использовать такие операции чтения/записи.
Так и с этим - если CPU позволяет более эффективно работать с типами bool со значениями 0/-1, а не 0/1, то лучше так и делать, разрешив спец.опцией компилятора. Хотя конечно это гораздо менее часто встречающаяся потребность чем char, значит не очень важная.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 25 2018, 07:39
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(jcxz @ Aug 25 2018, 10:21) *
Я тоже выше об этом писал. Понятно что сейчас это работает. Но такой подход и стиль считаю плохим.
char тоже раньше всегда был знаковым, а сейчас может быть и беззнаковым, в зависимости от установок компилятора.

Про CPU с различными подходами в копировании char не знал, спасибо. Интересно конечно, как это может так быть - ведь копируются 8 бит все равно...

А вот размышления вслух, можно сказать.
Допустим есть условие if(x != y) или просто выражение z = (x != y). Переменные целые. Я бы на месте компилятора сделал что-то наподобие z = x - y или z = x ^ y. И если z равно 0, то это значило, что x == y. А если не равно 0, то, соответственно, x != y. Вот типичный случай, когда не нужны были бы лишние телодвижения по установке значения 1 в переменную вместо прямого присваивания результата вычитания. Меньше инструкций ведь по факту. И таких примеров оптимизаций, ИМХО, можно как-то еще придумать. Опять же, просто исходя из логики рассуждаю laughing.gif

Сообщение отредактировал Arlleex - Aug 25 2018, 07:42
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 18:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01507 секунд с 7
ELECTRONIX ©2004-2016