igorle 0 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Код в студию. Мы же программисты, и Си - наш язык. возможно, я ваш код пойму с третьей минуты размышлений, а вы мой - с первой секунды, так чей же код будет лучше по критерию понимания? неужели ваша цель в том и состоит, чтобы таким, как я, осложнить жизнь? ;) уверен, что после компиляции у нас обоих получится одно и то же в машинных кодах :) Компактный код - легче понять. Но этому надо научиться. Не зазорно не знать. Зазорно не желать знать. Цель не усложнить жизнь, и уж тем более не унизить Вас. Цель - заинтересовать Вас и тех, кто следит за этой веткой, узнать Си чуть поглубже. Прочуствовать его. Это как на машине. Сначала по прямой ехать трудно, а потом ты начинаешь чуствовать ее, и иногда можешь даже использовать занос с пользой. И начинаешь ездить свободно, и все внимание - только на дорожную ситуацию. Если после нашей дискуссии вы перестаните писать слово профессионал в кавычках - значит мы не зря потратили время :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Он уменьшил свое время на разбор этого куска кода в дальнейшем, в процессе сопровождения проекта. Эта конструкция охватывается взглядом целиком и моментально анализируется. Сергей, при всем уважении: если бы он написал "проще" - время сопровождения ничуть не изменилось бы. в крайнем слчае на 1-2 секунды, что не может быть существенным. а вот вопрос-просьбу об указателях на функции вы пропустили... а ведь записанное в одну строку такое определение тоже охватывается взглядом сразу...Простите, это вы о чемкогда я писал ответ, в уме держал пример с & 0x3 - уже и без меня было показано, как эта константа связана с количеством символов в другой константе. это я и имел ввиду. маловероятно, что symbols[byte & 0x0F] чем-то принципиально хуже того, что вы привели в качестве примера профессионал в кавычках я, как и вы, отлично понимаю контекст употребления слов профессионал и "профессионал" - если я написал слово в кавычках, я сделал это умышленно :) смогу ли я назвать себя профессионалом, если перестану писать a = b ? 1 : 0, но стану a = !!b? или все-таки останусть "профессионалом"? ;) как по-вашему? кстати, о вашем вопросе про ксор. с моей точки зрения мы снова попадаем в "лаконичность" Си: нет логических переменных, но есть логика отношений. соответственно, постоянно возникает проблма с пониманием, где переменная-число, а где переменная-логический_результат. на этом дуализме и построен ваш вопрос. в вашем кратком стиле получится что-то типа a =(!b && c) || (!c && b) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Код в студию. Мы же программисты, и Си - наш язык. c = a && !b || !a && b; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 20 марта, 2013 Опубликовано 20 марта, 2013 (изменено) · Жалоба c = a && !b || !a && b;Спасибо. Теперь сравните с c = !!a ^ !!b; Допустим, мы разбираем чужой код. Понятно что ксор - не самоцель, а промежуточный результат. Может быть даже - аргумент функции. Какой вариант выберете теперь? Кстати, это меня сын недавно научил, когда я вслух посетовал на то, что нету логического ксора. Сыну восемнадцать, но он уже профессионал. И такие конструкции для него - кирпичики. Он над ними не думает. Повторюсь - это сродни английскому. Если ты его знаешь - ты думаешь "что написать". А если "со словарем" - то все силы уходят на "как правильно выразить мою, такую умную мысль" Изменено 20 марта, 2013 пользователем igorle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Теперь сравните с c = !!a ^ !!b; Какой вариант выберете теперь? Я выберу ваш вариант! Спасибо. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Теперь сравните с c = !!a ^ !!b; видите ли, если думать чуть дольше, чем достаточно, прийти к этому выражению не трудно. просто обычно нужды в этом не возникает - раз до цели дошли, и не устали, то дальше думать нет смысла. то есть либо кто-то (гуру) должен научить этому варианту, либо до него просторуки не дойдут. в первом случае я уже говорил о психологии, а во втором - выигрыш невелик. почему мне больше нравится мой, неоптимальный, вариант? потому что его прочтение абсолютно непротивречиво: результат равен истине, если операнды логически разные - это видно по записи. а этот лаконичный вариант не так нагляден. более того, с моей точки зрения этот выигрыш основан на еще одной "тонкости" Си, т.е. это просто какой-то хак в стандарте. если 25 == TRUE и !0 == TRUE, то математически вытекает, что 25 == !0. но тут мы попадаем на "нюансик": в Си оказывается, что !0 это 1, то есть 25 == 1!!!! то есть if(25 == 1) даст один эффект, но по этой логике эквивалентный if(25) - другой! в чем подвох? долгое время я был уверен, что в Си логическая ИСТИНА, как значение выражения, соответствует ЛЮБОМУ НЕНУЛЕВОМУ значению. соответственно двойное отрицание приводит к неопределенности - очевидно это и послужило основанием сделать ИСТИНОЙ единицу, но оставить для совместимости и "иное ненулевое значение", что породило другую неопределенность... но ее назвали стандартом... назвать стандартом нелогичность - это разве плюс? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба в Си есть ряд вещей, на которые никогда нельзя положиться, например, размерность int или знаковость char... я дословно стандарт не помню - написано там про это?Си -- язык, близкий к платформе. некоторые называют его макроассемблером. Естественно, стандарт не может гарантировать размер char, если он разный на разных платформах. То, о чём вы пишете, в стандарте Си, естественно, написано. Но написано как implementation defined. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Си -- язык, близкий к платформе. некоторые называют его макроассемблером. Естественно, стандарт не может гарантировать размер char, если он разный на разных платформах. То, о чём вы пишете, в стандарте Си, естественно, написано. Но написано как implementation defined.вообще-то вопрос был про то, написано ли в стандарте, что !0 == 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Все мы консервативны и держимся за свои привычки. Интересно наблюдать за человеком, который первый раз видит двойной восклицательный знак: 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.Что-то вас понесло... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Что-то вас понесло... почему вы так считаете? мне идея сделать утверждение !0 равным 1 (напомню, читается это "НЕ НОЛЬ") не кажется идеальной, она противоречит логике, математике и вообще здравому смыслу: делать частный случай единственным решением - в корне неверно. более того, противоречит другому основополагающему принципу Си, а именно тому, что любое ненулевое число принимается за логическое значение ИСТИНА. и выражения !!а и т.п. по сути своей основаны на логическом противоречии. я со своей колокольни отношу это в раздел хаков, т.е. возможностей, которые вполне могли появиться в результате непреднамеренных действий. допустим, Керниган с Ритчи сначала не обратили внимание на эту несуразицу, а потом пришлось выдать это за "элегатную возможность", что и было стандартизировано. подобная ситуация уже давно практикуется в Windows: ошибки и баги майкрософт просто вводит в документированные возможности, делая их "официальными" :) или вы считаете, что противоречия тут нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Мне вам сказать нечего. Ваши фантазии не знают границ. Не нравится !0 пишите ~0. Я никаких противоречий в си стандарте не вижу. Жалею лишь о том, что не реализован оператор сравнения (== !=) для структур, хотя присвоение допустимо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба мне идея сделать утверждение !0 равным 1 (напомню, читается это "НЕ НОЛЬ") не кажется идеальной, она противоречит логике, математике и вообще здравому смыслу Ну, почему же. Логике не противоречит. Ведь оператор ! - логический, выражение !0 дает логический результат, который представлен одним битом: Да/Нет, Правда/Ложь, 1/0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба вообще-то вопрос был про то, написано ли в стандарте, что !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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба вообще-то вопрос был про то, написано ли в стандарте, что !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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Ну, почему же. Логике не противоречит. Ведь оператор ! - логический, выражение !0 дает логический результат, который представлен одним битом: Да/Нет, Правда/Ложь, 1/0.к сожалению, не могу с вами согласиться. если бы в Си не было сказано, что любое ненулевое численное значение эквивалентно логической истине, противоречия действительно не было бы, а так есть вопрос: #define FALSE 0 #define TRUE !FALSE int a = 25; почему (a == TRUE) не эквивалентно (a != 0) ???? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться