Перейти к содержанию
    

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

 

 

возможно, я ваш код пойму с третьей минуты размышлений, а вы мой - с первой секунды, так чей же код будет лучше по критерию понимания? неужели ваша цель в том и состоит, чтобы таким, как я, осложнить жизнь? ;)

 

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

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

Цель не усложнить жизнь, и уж тем более не унизить Вас.

 

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

 

Если после нашей дискуссии вы перестаните писать слово профессионал в кавычках - значит мы не зря потратили время :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

профессионал в кавычках

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

 

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

 

в вашем кратком стиле получится что-то типа

a =(!b && c) || (!c && b)

.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

c = a && !b || !a && b;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

c = a && !b || !a && b;
Спасибо.

 

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

 

c = !!a ^ !!b;

 

Допустим, мы разбираем чужой код. Понятно что ксор - не самоцель, а промежуточный результат. Может быть даже - аргумент функции. Какой вариант выберете теперь?

Кстати, это меня сын недавно научил, когда я вслух посетовал на то, что нету логического ксора. Сыну восемнадцать, но он уже профессионал. И такие конструкции для него - кирпичики. Он над ними не думает.

Повторюсь - это сродни английскому. Если ты его знаешь - ты думаешь "что написать". А если "со словарем" - то все силы уходят на "как правильно выразить мою, такую умную мысль"

Изменено пользователем igorle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

c = !!a ^ !!b;

Какой вариант выберете теперь?

Я выберу ваш вариант! Спасибо. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

c = !!a ^ !!b;

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

 

 

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

 

 

более того, с моей точки зрения этот выигрыш основан на еще одной "тонкости" Си, т.е. это просто какой-то хак в стандарте. если 25 == TRUE и !0 == TRUE, то математически вытекает, что 25 == !0. но тут мы попадаем на "нюансик": в Си оказывается, что !0 это 1, то есть 25 == 1!!!! то есть if(25 == 1) даст один эффект, но по этой логике эквивалентный if(25) - другой! в чем подвох?

долгое время я был уверен, что в Си логическая ИСТИНА, как значение выражения, соответствует ЛЮБОМУ НЕНУЛЕВОМУ значению. соответственно двойное отрицание приводит к неопределенности - очевидно это и послужило основанием сделать ИСТИНОЙ единицу, но оставить для совместимости и "иное ненулевое значение", что породило другую неопределенность... но ее назвали стандартом... назвать стандартом нелогичность - это разве плюс?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в Си есть ряд вещей, на которые никогда нельзя положиться, например, размерность int или знаковость char... я дословно стандарт не помню - написано там про это?
Си -- язык, близкий к платформе. некоторые называют его макроассемблером. Естественно, стандарт не может гарантировать размер char, если он разный на разных платформах. То, о чём вы пишете, в стандарте Си, естественно, написано. Но написано как implementation defined.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Си -- язык, близкий к платформе. некоторые называют его макроассемблером. Естественно, стандарт не может гарантировать размер char, если он разный на разных платформах. То, о чём вы пишете, в стандарте Си, естественно, написано. Но написано как implementation defined.
вообще-то вопрос был про то, написано ли в стандарте, что !0 == 1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все мы консервативны и держимся за свои привычки. Интересно наблюдать за человеком, который первый раз видит двойной восклицательный знак:

int a, b;
a = 27;
b = !!a;

Многие сначала офигевают, и спорят, что это невозможно понять. А через время смотришь - сами так писать начинают. Привыкли.

 

Кстати, я проверял скомпилированный код для трех случаев:

b = !!a;
b = a ? 1 : 0;
if (a)
    b = 1;
else
    b = 0;

Во всех трех случаях gcc дает одинаковый результат.

А я пишу иначе:

b = (a!=0);

 

вообще-то вопрос был про то, написано ли в стандарте, что !0 == 1.
Что-то вас понесло...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то вас понесло...

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне вам сказать нечего. Ваши фантазии не знают границ.

Не нравится !0 пишите ~0.

Я никаких противоречий в си стандарте не вижу.

Жалею лишь о том, что не реализован оператор сравнения (== !=) для структур, хотя присвоение допустимо...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне идея сделать утверждение !0 равным 1 (напомню, читается это "НЕ НОЛЬ") не кажется идеальной, она противоречит логике, математике и вообще здравому смыслу

Ну, почему же. Логике не противоречит. Ведь оператор ! - логический, выражение !0 дает логический результат, который представлен одним битом: Да/Нет, Правда/Ложь, 1/0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вообще-то вопрос был про то, написано ли в стандарте, что !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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вообще-то вопрос был про то, написано ли в стандарте, что !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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, почему же. Логике не противоречит. Ведь оператор ! - логический, выражение !0 дает логический результат, который представлен одним битом: Да/Нет, Правда/Ложь, 1/0.
к сожалению, не могу с вами согласиться.

 

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

 

#define FALSE 0

#define TRUE !FALSE

int a = 25;

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...