|
|
  |
Си |
|
|
|
Mar 20 2013, 13:37
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Код в студию. Мы же программисты, и Си - наш язык. Цитата(ARV @ Mar 20 2013, 17:26)  возможно, я ваш код пойму с третьей минуты размышлений, а вы мой - с первой секунды, так чей же код будет лучше по критерию понимания? неужели ваша цель в том и состоит, чтобы таким, как я, осложнить жизнь? уверен, что после компиляции у нас обоих получится одно и то же в машинных кодах  Компактный код - легче понять. Но этому надо научиться. Не зазорно не знать. Зазорно не желать знать. Цель не усложнить жизнь, и уж тем более не унизить Вас. Цель - заинтересовать Вас и тех, кто следит за этой веткой, узнать Си чуть поглубже. Прочуствовать его. Это как на машине. Сначала по прямой ехать трудно, а потом ты начинаешь чуствовать ее, и иногда можешь даже использовать занос с пользой. И начинаешь ездить свободно, и все внимание - только на дорожную ситуацию. Если после нашей дискуссии вы перестаните писать слово профессионал в кавычках - значит мы не зря потратили время
|
|
|
|
|
Mar 20 2013, 13:44
|

Профессионал
    
Группа: Свой
Сообщений: 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)  профессионал в кавычках я, как и вы, отлично понимаю контекст употребления слов профессионал и "профессионал" - если я написал слово в кавычках, я сделал это умышленно  смогу ли я назвать себя профессионалом, если перестану писать a = b ? 1 : 0, но стану a = !!b? или все-таки останусть "профессионалом"?  как по-вашему? кстати, о вашем вопросе про ксор. с моей точки зрения мы снова попадаем в "лаконичность" Си: нет логических переменных, но есть логика отношений. соответственно, постоянно возникает проблма с пониманием, где переменная-число, а где переменная-логический_результат. на этом дуализме и построен ваш вопрос. в вашем кратком стиле получится что-то типа Код a =(!b && c) || (!c && b) .
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 20 2013, 13:59
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 20 2013, 14:20
|

Профессионал
    
Группа: Свой
Сообщений: 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) - другой! в чем подвох? долгое время я был уверен, что в Си логическая ИСТИНА, как значение выражения, соответствует ЛЮБОМУ НЕНУЛЕВОМУ значению. соответственно двойное отрицание приводит к неопределенности - очевидно это и послужило основанием сделать ИСТИНОЙ единицу, но оставить для совместимости и "иное ненулевое значение", что породило другую неопределенность... но ее назвали стандартом... назвать стандартом нелогичность - это разве плюс?
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 21 2013, 04:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

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

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

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

неотягощённый злом
     
Группа: Свой
Сообщений: 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. Что-то вас понесло...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 21 2013, 07:16
|

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

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

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

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

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

|
Цитата(ARV @ Mar 21 2013, 10:16)  мне идея сделать утверждение !0 равным 1 (напомню, читается это "НЕ НОЛЬ") не кажется идеальной, она противоречит логике, математике и вообще здравому смыслу Ну, почему же. Логике не противоречит. Ведь оператор ! - логический, выражение !0 дает логический результат, который представлен одним битом: Да/Нет, Правда/Ложь, 1/0.
|
|
|
|
|
Mar 21 2013, 08:34
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 21 2013, 08:36
|
Профессионал
    
Группа: Свой
Сообщений: 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).
|
|
|
|
|
Mar 21 2013, 13:13
|

Профессионал
    
Группа: Свой
Сообщений: 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) ????
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|