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

 
 
19 страниц V  « < 9 10 11 12 13 > »   
Reply to this topicStart new topic
> Си
igorle
сообщение Mar 20 2013, 13:37
Сообщение #151


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Код в студию. Мы же программисты, и Си - наш язык.


Цитата(ARV @ Mar 20 2013, 17:26) *
возможно, я ваш код пойму с третьей минуты размышлений, а вы мой - с первой секунды, так чей же код будет лучше по критерию понимания? неужели ваша цель в том и состоит, чтобы таким, как я, осложнить жизнь? wink.gif

уверен, что после компиляции у нас обоих получится одно и то же в машинных кодах sm.gif

Компактный код - легче понять. Но этому надо научиться. Не зазорно не знать. Зазорно не желать знать.
Цель не усложнить жизнь, и уж тем более не унизить Вас.

Цель - заинтересовать Вас и тех, кто следит за этой веткой, узнать Си чуть поглубже. Прочуствовать его. Это как на машине. Сначала по прямой ехать трудно, а потом ты начинаешь чуствовать ее, и иногда можешь даже использовать занос с пользой. И начинаешь ездить свободно, и все внимание - только на дорожную ситуацию.

Если после нашей дискуссии вы перестаните писать слово профессионал в кавычках - значит мы не зря потратили время sm.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 20 2013, 13:44
Сообщение #152


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Сергей Борщ @ Mar 20 2013, 17:26) *
Он уменьшил свое время на разбор этого куска кода в дальнейшем, в процессе сопровождения проекта. Эта конструкция охватывается взглядом целиком и моментально анализируется.
Сергей, при всем уважении: если бы он написал "проще" - время сопровождения ничуть не изменилось бы. в крайнем слчае на 1-2 секунды, что не может быть существенным. а вот вопрос-просьбу об указателях на функции вы пропустили... а ведь записанное в одну строку такое определение тоже охватывается взглядом сразу...
Цитата(Сергей Борщ @ Mar 20 2013, 17:26) *
Простите, это вы о чем
когда я писал ответ, в уме держал пример с & 0x3 - уже и без меня было показано, как эта константа связана с количеством символов в другой константе. это я и имел ввиду.

маловероятно, что symbols[byte & 0x0F] чем-то принципиально хуже того, что вы привели в качестве примера

Цитата(igorle @ Mar 20 2013, 17:37) *
профессионал в кавычках

я, как и вы, отлично понимаю контекст употребления слов профессионал и "профессионал" - если я написал слово в кавычках, я сделал это умышленно sm.gif смогу ли я назвать себя профессионалом, если перестану писать a = b ? 1 : 0, но стану a = !!b? или все-таки останусть "профессионалом"? wink.gif как по-вашему?

кстати, о вашем вопросе про ксор. с моей точки зрения мы снова попадаем в "лаконичность" Си: нет логических переменных, но есть логика отношений. соответственно, постоянно возникает проблма с пониманием, где переменная-число, а где переменная-логический_результат. на этом дуализме и построен ваш вопрос.

в вашем кратком стиле получится что-то типа
Код
a =(!b && c) || (!c && b)
.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 20 2013, 13:45
Сообщение #153


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(igorle @ Mar 20 2013, 16:37) *
Код в студию. Мы же программисты, и Си - наш язык.

c = a && !b || !a && b;
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 20 2013, 13:59
Сообщение #154


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(ViKo @ Mar 20 2013, 16:45) *
c = a && !b || !a && b;
Спасибо.

Теперь сравните с

c = !!a ^ !!b;

Допустим, мы разбираем чужой код. Понятно что ксор - не самоцель, а промежуточный результат. Может быть даже - аргумент функции. Какой вариант выберете теперь?
Кстати, это меня сын недавно научил, когда я вслух посетовал на то, что нету логического ксора. Сыну восемнадцать, но он уже профессионал. И такие конструкции для него - кирпичики. Он над ними не думает.
Повторюсь - это сродни английскому. Если ты его знаешь - ты думаешь "что написать". А если "со словарем" - то все силы уходят на "как правильно выразить мою, такую умную мысль"

Сообщение отредактировал igorle - Mar 20 2013, 14:02
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 20 2013, 14:06
Сообщение #155


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(igorle @ Mar 20 2013, 16:59) *
Теперь сравните с
c = !!a ^ !!b;
Какой вариант выберете теперь?

Я выберу ваш вариант! Спасибо. sm.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 20 2013, 14:20
Сообщение #156


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(igorle @ Mar 20 2013, 17:59) *
Теперь сравните с

c = !!a ^ !!b;
видите ли, если думать чуть дольше, чем достаточно, прийти к этому выражению не трудно. просто обычно нужды в этом не возникает - раз до цели дошли, и не устали, то дальше думать нет смысла. то есть либо кто-то (гуру) должен научить этому варианту, либо до него просторуки не дойдут. в первом случае я уже говорил о психологии, а во втором - выигрыш невелик.


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


более того, с моей точки зрения этот выигрыш основан на еще одной "тонкости" Си, т.е. это просто какой-то хак в стандарте. если 25 == TRUE и !0 == TRUE, то математически вытекает, что 25 == !0. но тут мы попадаем на "нюансик": в Си оказывается, что !0 это 1, то есть 25 == 1!!!! то есть if(25 == 1) даст один эффект, но по этой логике эквивалентный if(25) - другой! в чем подвох?
долгое время я был уверен, что в Си логическая ИСТИНА, как значение выражения, соответствует ЛЮБОМУ НЕНУЛЕВОМУ значению. соответственно двойное отрицание приводит к неопределенности - очевидно это и послужило основанием сделать ИСТИНОЙ единицу, но оставить для совместимости и "иное ненулевое значение", что породило другую неопределенность... но ее назвали стандартом... назвать стандартом нелогичность - это разве плюс?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 21 2013, 04:25
Сообщение #157


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(ARV @ Mar 20 2013, 16:53) *
в Си есть ряд вещей, на которые никогда нельзя положиться, например, размерность int или знаковость char... я дословно стандарт не помню - написано там про это?
Си -- язык, близкий к платформе. некоторые называют его макроассемблером. Естественно, стандарт не может гарантировать размер char, если он разный на разных платформах. То, о чём вы пишете, в стандарте Си, естественно, написано. Но написано как implementation defined.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 21 2013, 05:06
Сообщение #158


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(andrew_b @ Mar 21 2013, 08:25) *
Си -- язык, близкий к платформе. некоторые называют его макроассемблером. Естественно, стандарт не может гарантировать размер char, если он разный на разных платформах. То, о чём вы пишете, в стандарте Си, естественно, написано. Но написано как implementation defined.
вообще-то вопрос был про то, написано ли в стандарте, что !0 == 1.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 21 2013, 05:41
Сообщение #159


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(igorle @ Mar 20 2013, 16:31) *
Все мы консервативны и держимся за свои привычки. Интересно наблюдать за человеком, который первый раз видит двойной восклицательный знак:
Код
int a, b;
a = 27;
b = !!a;
Многие сначала офигевают, и спорят, что это невозможно понять. А через время смотришь - сами так писать начинают. Привыкли.

Кстати, я проверял скомпилированный код для трех случаев:
Код
b = !!a;
b = a ? 1 : 0;
if (a)
    b = 1;
else
    b = 0;
Во всех трех случаях gcc дает одинаковый результат.

А я пишу иначе:
Код
b = (a!=0);


Цитата(ARV @ Mar 21 2013, 09:06) *
вообще-то вопрос был про то, написано ли в стандарте, что !0 == 1.
Что-то вас понесло...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 21 2013, 07:16
Сообщение #160


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(demiurg_spb @ Mar 21 2013, 09:41) *
Что-то вас понесло...

почему вы так считаете? мне идея сделать утверждение !0 равным 1 (напомню, читается это "НЕ НОЛЬ") не кажется идеальной, она противоречит логике, математике и вообще здравому смыслу: делать частный случай единственным решением - в корне неверно. более того, противоречит другому основополагающему принципу Си, а именно тому, что любое ненулевое число принимается за логическое значение ИСТИНА. и выражения !!а и т.п. по сути своей основаны на логическом противоречии. я со своей колокольни отношу это в раздел хаков, т.е. возможностей, которые вполне могли появиться в результате непреднамеренных действий. допустим, Керниган с Ритчи сначала не обратили внимание на эту несуразицу, а потом пришлось выдать это за "элегатную возможность", что и было стандартизировано. подобная ситуация уже давно практикуется в Windows: ошибки и баги майкрософт просто вводит в документированные возможности, делая их "официальными" sm.gif

или вы считаете, что противоречия тут нет?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 21 2013, 07:23
Сообщение #161


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ARV @ Mar 21 2013, 11:16) *
Мне вам сказать нечего. Ваши фантазии не знают границ.
Не нравится !0 пишите ~0.
Я никаких противоречий в си стандарте не вижу.
Жалею лишь о том, что не реализован оператор сравнения (== !=) для структур, хотя присвоение допустимо...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 21 2013, 08:15
Сообщение #162


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(ARV @ Mar 21 2013, 10:16) *
мне идея сделать утверждение !0 равным 1 (напомню, читается это "НЕ НОЛЬ") не кажется идеальной, она противоречит логике, математике и вообще здравому смыслу

Ну, почему же. Логике не противоречит. Ведь оператор ! - логический, выражение !0 дает логический результат, который представлен одним битом: Да/Нет, Правда/Ложь, 1/0.
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 21 2013, 08:34
Сообщение #163


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ARV @ Mar 21 2013, 09:06) *
вообще-то вопрос был про то, написано ли в стандарте, что !0 == 1.

А взять и посмотреть в стандарт религия не позволяет?

Цитата
6.5.3.3 Unary arithmetic operators
...
5 The result of the logical negation operator ! is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
The expression !E is equivalent to (0==E).
Так что !0 == 1
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 21 2013, 08:36
Сообщение #164


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(ARV @ Mar 21 2013, 09:06) *
вообще-то вопрос был про то, написано ли в стандарте, что !0 == 1.
Написано.
ISO/IEC 9899:1999 (E), более нового под рукой нет:
Цитата
6.5.3.3 Unary arithmetic operators

5 The result of the logical negation operator ! is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
The expression !E is equivalent to (0==E).
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 21 2013, 13:13
Сообщение #165


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(ViKo @ Mar 21 2013, 12:15) *
Ну, почему же. Логике не противоречит. Ведь оператор ! - логический, выражение !0 дает логический результат, который представлен одним битом: Да/Нет, Правда/Ложь, 1/0.
к сожалению, не могу с вами согласиться.

если бы в Си не было сказано, что любое ненулевое численное значение эквивалентно логической истине, противоречия действительно не было бы, а так есть вопрос:

Код
#define FALSE 0

#define TRUE !FALSE

int a = 25;


почему (a == TRUE) не эквивалентно (a != 0) ????



--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:27
Рейтинг@Mail.ru


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