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

|
Цитата(ARV @ Mar 21 2013, 17:13)  к сожалению, не могу с вами согласиться.
если бы в Си не было сказано, что любое ненулевое численное значение эквивалентно логической истине, противоречия действительно не было бы А в C этого и не сказано. В С во всех местах, где используется логическое значение (в логических выражениях и операторах) сказано, что только они (а не все подряд) трактуют 0 как ложь и всё остальное, как истину. Пример - Цитата 6.5.13 Logical AND operator Syntax 1 logical-AND-expression: inclusive-OR-expression logical-AND-expression && inclusive-OR-expression Constraints 2 Each of the operands shall have scalar type. Semantics 3 The && operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it yields 0. The result has type int. Цитата 6.8.4.1 The if statement Constraints 1 The controlling expression of an if statement shall have scalar type. Semantics 2 In both forms, the first substatement is executed if the expression compares unequal to 0. In the else form, the second substatement is executed if the expression compares equal to 0. If the first substatement is reached via a label, the second substatement is not executed. и т.д. Цитата а так есть вопрос:
#define FALSE 0 #define TRUE !FALSE int a = 25;
почему (a == TRUE) не эквивалентно (a != 0) ???? Потому что операция '==' не является условной операцией, и она не трактует свои аргументы как логические. И отдельного типа bool в С нет (точнее там теперь есть _Bool, но это скорее недоразумение, чем полноценный bool  )
|
|
|
|
|
Mar 21 2013, 16:33
|

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

|
Цитата(XVR @ Mar 21 2013, 18:21)  Потому что операция '==' не является условной операцией, и она не трактует свои аргументы как логические. вы даже не желаете быть внимательным... разберем все по-порядку. 1. (a == TRUE) полностью эквивалентно (a == !0). читается это как "а эквивалентно не нулю" - это логическое утверждение, при а=25 оно истинно. я нигде не ошибся? однако, в Си ответ будет прямо противоположный! 2. (a != 0) читается как "а не равно нулю?" - это точно такое же логическое утверждение, и оно так же истинно при а=25. и в Си оно так же истинно. 3. с точки зрения логики оба примера абсолютно эквивалентны, так как "не равно нулю" это то же самое, что "равно чему угодно, кроме нуля"! однако, благодаря "изюминке" Си обычная математическая (и всякая другая ЛОГИКА) тут бессильна - в Си первое высказывание вопреки логике ЛОЖНО. 4. я придерживаюсь той точки зрения, что не смотря на то, что это нарушение логики возведено в стандарт, есть простой способ привести все в соответствии с логикой: надо ЗАБЫТЬ про то, что "не ноль" это 1 (т.е. !0 == 1), и понимать это именно так, как логическое высказывание понимает дисциплина "математическая логика", т.е. "не ноль" - это на самом деле любое число, кроме нуля (не Вася - это не только Петя, но и даже Лена). это соответствует всем канонам Си (пример - if(a)), и не противоречит здравому смыслу, в результате работы компилятора будет генерироваться то же самое. то есть я предлагаю не использовать конструкции типа a = !!b ^ !!c и аналогичные, а вместо них использовать записи, которые на 100% соответствуют НОРМАЛЬНОЙ ЛОГИКЕ, т.е. логике, доступной КАЖДОМУ ГРАМОТНОМУ человеку, а не только программисту-гуру. ибо даже программист-паскалист не сумеет смириться с подобным НЕЛОГИЧНЫМ поведением языка. как видите, я предлагаю не использовать часть возможностей Си, которые реально приводят к взрыву мозга у человека, который еще помнит логику здравого смысла. пусть они будут, но их следует избегать, как оператора goto - обходятся ведь без него те же самые гуру, хотя это явно требует разрастания кода... при таком добровольном самоограничение каждая запись будет выглядеть ровно так, какой смысл в ней заложен: что прочли, то и делается.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 22 2013, 05:40
|

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

|
Цитата(ARV @ Mar 21 2013, 20:33)  1. (a == TRUE) полностью эквивалентно (a == !0). читается это как "а эквивалентно не нулю" - это логическое утверждение, при а=25 оно истинно. я нигде не ошибся? однако, в Си ответ будет прямо противоположный! Вы сильно ошибаетесь, т.к. оператор == применяется не только для булевых, но и для многих других типов. Поэтому благодаря integer promotion int a; .. if (a == TRUE) - это сравнение двух целых чисел, а вот результатом этой операции является булева величина. Поэтому (25==1) ложно, а (!!25) истинно. Не надо фантазировать на пустом месте и высасывать теории из пальца. Вы можете себя самоограничивать как угодно, вплоть до полного отшельничества. Но не надо парить мозги читателям форума. Извините за прямоту.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 22 2013, 07:57
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(ARV @ Mar 21 2013, 20:33)  1. (a == TRUE) полностью эквивалентно (a == !0). читается это как "а эквивалентно не нулю" - это логическое утверждение, при а=25 оно истинно. я нигде не ошибся? однако, в Си ответ будет прямо противоположный! Вы забываете, что это все же программа на С, а не абстрактные математические выкладки. Не надо натягивать математическую логику туда, где ей не место. Цитата 4. я придерживаюсь той точки зрения, что не смотря на то, что это нарушение логики возведено в стандарт, есть простой способ привести все в соответствии с логикой Есть более простой способ - не пишите на С, если не можете провести линию между языком программирования и формальными математическими обозначениями Цитата а вместо них использовать записи, которые на 100% соответствуют НОРМАЛЬНОЙ ЛОГИКЕ, т.е. логике, доступной КАЖДОМУ ГРАМОТНОМУ человеку, а не только программисту-гуру. Пока с такими записями возникли проблемы только у вас. У остальных участников форума с ними проблем нет. Цитата ибо даже программист-паскалист не сумеет смириться с подобным НЕЛОГИЧНЫМ поведением языка. Это диагноз ? Цитата как видите, я предлагаю не использовать часть возможностей Си, которые реально приводят к взрыву мозга у человека, который еще помнит логику здравого смысла. Не используйте, или вас насильно заставляют? Цитата при таком добровольном самоограничение каждая запись будет выглядеть ровно так, какой смысл в ней заложен: что прочли, то и делается. Вынужден вас огорчить - любая запись делает ровно то, что в ней написано. Вопрос в другом - сможет это понять читатель, или нет. У всех пока получается, может вам на свое самообразование стоит посмотреть
|
|
|
|
|
Mar 22 2013, 10:21
|

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

|
у меня получается все понимать не хуже вашего. просто вы не задумываетесь над тем, каким догмам следуете, а я задумываюсь. я как раз и стараюсь писать в соответствии не только с формальными требованиями стандарта, но и в соответствии со здравым смыслом. я думал, что в понимании заинтересованы все... но видимо, я ошибался: мало кому надо, чтобы его код был более понятным, если для этого надо поступиться своим собственным мнением... все давно пришли к соглашению, что "магические числа" зло - Си разрешает это, но все стараются этого избегать. все давно пришли к соглашению, что goto зло - Си это разрешает, но все стараются этого избегать все давно пришли к соглашению, что переменная counter предпочтительнее безликой k, что глобальные переменные зло и чем их меньше, тем лучше и т.д. - целые книги пишутся на тему качественного кода... во всех де-факто устоявшихся случаях следование этим правилам приводит к увеличению писанины - все мирятся с этим, понимая плюсы. но когда предлагается сделать еще один шажок в сторону улучшения результирующего кода, сразу все воспринимают это в штыки... к сожалению, я ошибся, думая, что коллеги-программисты готовы критически воспринимать действиетльность... оказывается это не так. придется быть как все - писать круто, а не просто... Цитата(demiurg_spb @ Mar 22 2013, 09:40)  Вы сильно ошибаетесь, т.к. оператор == применяется не только для булевых, но и для многих других типов. Поэтому благодаря integer promotion int a; .. if (a == TRUE) - это сравнение двух целых чисел, а вот результатом этой операции является булева величина. Поэтому (25==1) ложно, а (!!25) истинно. Не надо фантазировать на пустом месте и высасывать теории из пальца. Вы можете себя самоограничивать как угодно, вплоть до полного отшельничества. Но не надо парить мозги читателям форума. Извините за прямоту. булевого типа в Си не предусмотрено, как вам хорошо известно, уважаемый Сергей. это из-за попытки совместить исключительно численную ориентацию Си с булевой алгеброй (т.е. ЛОГИКОЙ) и происходят всякие бесконечные integer promotions - как попытка найти компромисс между тем, что хочется и тем, что выходит. и, кстати, поскольку форум - это место высказывания СВОИХ мыслей, я не занимаюсь толкованием стандарта, таких специалистов тут и без меня полно. хотелось бы обсуждать именно мнения персон, а не то, что не подлежит обсуждению, поскольку стандарт. а у вас один ответ - ваше мнение никому не интересно, посколько не соответствует догмату. Цитата(XVR @ Mar 22 2013, 11:57)  Вы забываете, что это все же программа на С, а не абстрактные математические выкладки. Не надо натягивать математическую логику туда, где ей не место. логике место всегда и везде, человек, не способный логически мыслить, это недоумок, если мягко выразиться. а программа на любом языке в большинстве случаев служит для выражения на машинно-понятном уровне именно математических выкладок.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 22 2013, 10:51
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата все давно пришли к соглашению, что goto зло - Си это разрешает, но все стараются этого избегать Вы код кернела линукса видели? Там goto почти в каждом файле. Обычно используется как error handling Цитата все давно пришли к соглашению, что переменная counter предпочтительнее безликой k, Для переменной цикла нет ничего лучше стандартной i, j или k. Посмотрите в том-же кернеле. У меня нет под линукса под рукой, но если вы можете, посмотрите результат вывода строк grep -rw for . | grep -w i | wc -l grep -rw for . | grep -w counter | wc -l и расскажите нам, каких циклов вы нашли больше - с переменной цикла i, или counter. Вы демострируете нежелание понять, почему Си работает так как он работает. Вы не слышите, что вам говорят ТРИ человека, но при этом именно остальных обвиняете в упертости и косности. Я думаю, что язык Си просто не подходит для тех задач, которые вы решаете по ходу своей работы. И это корень ваших проблем. Цитата к сожалению, я ошибся, думая, что коллеги-программисты готовы критически воспринимать действиетльность... оказывается это не так. придется быть как все - писать круто, а не просто... Вы будете смеяться, но прекрасное "как он дышит так и пишет, не стараясь угодить" - к программистам тоже относится. Лучше пишите, как считаете правильным.
|
|
|
|
|
Mar 22 2013, 11:09
|

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

|
Цитата(ARV @ Mar 22 2013, 14:21)  булевого типа в Си не предусмотрено, как вам хорошо известно, уважаемый Сергей. Допустим что типа bool условно нет (гляньте на досуге <stdbool.h>), но при всём этом, результатом сравнения, как и любой иной логической операции, является именно булева величина, принимающая значение 0 или 1 - просто и со вкусом. А вы ну никак не хотите этого осознать! PS: меня как бы не Сергей зовут...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 22 2013, 11:13
|

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

|
Цитата(igorle @ Mar 22 2013, 14:51)  Вы демострируете нежелание понять, почему Си работает так как он работает. Вы не слышите, что вам говорят ТРИ человека, но при этом именно остальных обвиняете в упертости и косности.
Я думаю, что язык Си просто не подходит для тех задач, которые вы решаете по ходу своей работы. И это корень ваших проблем. чтобы не впадать в заблуждение, не додумывайте мои высказывания - попытайтесь их понять, а потом обдумать. я понимаю, почему Си работает вот именно так. но мне это представляется нелогичным - разве я непонятно объяснил? вы понимаете, почему Си так работает - и это для вас единственный аргумент для возражений мне. дескать, солнце всходит на востоке, потому что это в природе его (как говорил Аристотель). мне такого объяснения мало - я ведь не спорю с солнцем... но почему бы не попытаться объяснить его поведение иначе? т.е. в контексте Си - почему бы вместо допустимой хитрой и противоречивой записи не применить допустимую, простую и непротиворечивую (но на пару символов длиннее)? неужели из-за пары символов весь сыр-бор?! у меня нет проблем, кроме той, что имею наглость думать иначе. think different - это про меня
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 22 2013, 11:22
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(igorle @ Mar 20 2013, 16:59)  Теперь сравните с c = !!a ^ !!b; Прошу прощения, а почему не писать Код c = !a ^ !b; Зачем два знака ?
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 22 2013, 11:38
|

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

|
Цитата(Буратино @ Mar 22 2013, 15:22)  Прошу прощения, а почему не писать Код c = !a ^ !b; Зачем два знака ? +5 Молодец! Действительно незачем!
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 22 2013, 11:59
|

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

|
Цитата(demiurg_spb @ Mar 22 2013, 15:09)  Допустим что типа bool условно нет (гляньте на досуге <stdbool.h>), но при всём этом, результатом сравнения, как и любой иной логической операции, является именно булева величина, принимающая значение 0 или 1 - просто и со вкусом. А вы ну никак не хотите этого осознать!
PS: меня как бы не Сергей зовут... я дико извиняюсь!  видимо, в пылу полемики перепутал вас с Сергеем, который Борщ... прошу прощения. но тем не менее, поймите: я отлично знаю, что и как длается по стандарту Си. я это осознал, давно и бесповоротно. вы можете осознать, что выражения "не равно нулю" и "равно чему угодно, кроме нуля" - это ЭКВИВАЛЕНТЫ? если да, то следующий вопрос: почему при записи этих высказываний ДОСЛОВНО на Си мы имеем потерю их эквивалентности: (a != 0) и (a == !0) ?! вы говорите - так положено, я не спорю. вы говорите, что для достижения полной эквивалентности надо записать иначе - и вот тут я спрашиваю - ЗАЧЕМ? куда проще признать, что !0 означает именно НЕ НОЛЬ, т.е. ЦЕЛОЕ МНОЖЕСТВО ЗНАЧЕНИЙ, как это и принято в математике, логике и вобще жизни, и поступать соответственно. при этом стандарт остается стандартом, типа как ограничение скорости на дороге - все его знают, но никто не соблюдает, но без печальных последствий Цитата(federal @ Mar 22 2013, 15:22)  с такими в команде работать никому не пожелаю я и сам не стал бы кстати о птичках: Цитата(demiurg_spb @ Mar 21 2013, 09:41)  А я пишу иначе: Код b = (a!=0); это как раз то, о чем я и толкую  Цитата(demiurg_spb @ Mar 22 2013, 15:38)  +5 Молодец! Действительно незачем! обратите внимание: ни один из убежденных сторонников "лаконичности" Си и знатоков стандарта не заметил этого на протяжении двух дней! ни сын-профессионал, который отца учит, ни сам отец, ни кто-то еще... нужен ли еще один аргумент в пользу того, что неожиданная (но корректная!!!) запись НЕ ОБЛЕГЧАЕТ понимание НИ ДЛЯ КОГО?!
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 22 2013, 12:25
|
Участник

Группа: Участник
Сообщений: 74
Регистрация: 12-01-13
Из: Нижний Новгород
Пользователь №: 75 160

|
Цитата(ARV @ Mar 22 2013, 15:59)  ни сын-профессионал, который отца учит, ни сам отец а вот за это уверенная 5 и респект!
|
|
|
|
|
Mar 22 2013, 12:43
|

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

|
Цитата(ARV @ Mar 22 2013, 14:59)  куда проще признать, что !0 означает именно НЕ НОЛЬ, т.е. ЦЕЛОЕ МНОЖЕСТВО ЗНАЧЕНИЙ, как это и принято в математике, логике и вобще жизни Тогда нужно будет признать, что !33 - тоже всё, что угодно, кроме 33. И т.п. Вы видите здесь приближение к человеческой логике? (a == !33) ? Я не вижу.  А равно "не 33"? - вы так спрашиваете? Цитата нужен ли еще один аргумент в пользу того, что неожиданная (но корректная!!!) запись НЕ ОБЛЕГЧАЕТ понимание НИ ДЛЯ КОГО?! Теперь буду пользоваться c = !a ^ !b; Спасибо еще раз!  P.S. Во имя отца и сына... и святого Электроника! Аминь!
|
|
|
|
|
Mar 22 2013, 12:58
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(ARV @ Mar 22 2013, 15:59)  почему при записи этих высказываний ДОСЛОВНО на Си мы имеем потерю их эквивалентности: (a != 0) и (a == !0) ?! вы говорите - так положено, я не спорю. вы говорите, что для достижения полной эквивалентности надо записать иначе - и вот тут я спрашиваю - ЗАЧЕМ? куда проще признать, что !0 означает именно НЕ НОЛЬ, т.е. ЦЕЛОЕ МНОЖЕСТВО ЗНАЧЕНИЙ, как это и принято в математике, логике и вобще жизни, Язык С был придуман для упрощения жизни программисту, которому не хотелось писать на ассемблере. Поэтому он практически дословно повторяет особенности той аппаратной платформы, для которой был создан. А эта платформа умела оперировать с числами, а не с множествами. Поэтому '!0' обозначает результат применения операции 'логическое отрицание' к числу 0. Результат этой операции 1. Просто число 1, хотя бы потому, что ни машина ни язык С напрямую с множествами не работают! Если хотите что бы '!0' обозначало именно множество (как 'принято в математике, логике и вобще жизни') - вам нужен другой язык. Язык С не оперирует с абстрактными математическими понятиями. Возьмите Matlab - он умеет. Или возьмите С++ и библиотеку для работы с множествами - тогда ваше любимое выражение (a == !0) будет обозначать именно то, как 'принято в математике, логике и вобще жизни' Цитата нужен ли еще один аргумент в пользу того, что неожиданная (но корректная!!!) запись НЕ ОБЛЕГЧАЕТ понимание НИ ДЛЯ КОГО?! 'НИ ДЛЯ КОГО' - это лично вы? Все остальные вроде как на непонимание не жаловались Это вполне нормальная и кристально прозрачная запись (по крайней мере для того, кто достаточно хорошо знает язык) Цитата(Буратино @ Mar 22 2013, 15:22)  Прошу прощения, а почему не писать Код c = !a ^ !b; Зачем два знака ? Можно еще понятнее (специально для ARV) - Код c = (!a) != (!b);
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|