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

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

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


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

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

С точностью до наоборот. Более простой язык имеет более простую (т.е компактную, короткую) БНФ. Как известно, БНФ Паскаля в разы меньше БНФ С. А БНФ Форта в разы меньше БНФ Паскаля, вот он и впрямь простой язык.

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


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

об одном я всех умоляю: не надо холивара C vs PASCAL!

 

Поэтому запись на С

int a=b==c;

вызывает у Pascal'иста взрыв мозга - как так, тут же сравнение, значит должен быть if!

И не надо аппелировать к логике и здравому смыслу - у програмистов на С и Pascal'е они будут разными. Более того, они и должны быть разными - языки же разные!

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

 

 

взрыва мозга вызывает не присваиваивание результата сравнения переменной, а тот факт, что этот результат присваивается переменной целочисленного типа! вот в чем коренная проблема, показанная на этом простом примере. в паскале абсолютно допустимо написать bool_var := a = b; - с учетом синтаксиса это совершенно полный эквивалент вашего примера, но переменная bool_var должна быть описана как boolean, то есть булева переменная. и для этой переменной выражения not bool_var не имеет никаких противоречий со здравым смыслом, т.к. ни при каких условиях не может подменять множество вариантов одним, как в случае семантически идентичной записи Си !var

 

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

 

но главное не это: ведь есть же способ исключить любые парадоксы в тексте программ на Си! для этого надо пользоваться принципом бритвы Оккама: не плоди сущности без нужды. если нужны логические действия, делаем их при помощи имеющихся в Си ЛОГИЧЕСКИХ манипуляций над логическими же данными. если уж а=25 признается стандартом за эквивалент логической истины, то для приведения этого в соответствии с настоящей логикой следовало бы применять не !!a, но a != 0 - только и всего! на 1 значащий символ длиннее запись, но на стопицот процентов ЛОГИЧНЕЕ!!!

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


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

Все очень просто.

Си изначально разрабатывался как структурированный макроассемблер, соответственно и методики сходные.

Как в ассемблере оценивается результат логических операций? Обычно через флаг Z.

Собственно, вот и оно.

Всего два состояния - ноль и неноль.

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


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

Все очень просто.

Си изначально разрабатывался как структурированный макроассемблер, соответственно и методики сходные.

Как в ассемблере оценивается результат логических операций? Обычно через флаг Z.

Собственно, вот и оно.

Всего два состояния - ноль и неноль.

да-да-да, все в кусре. а зачем тогда вообще Си? давайте все на ассемблере, или лучше в машинных кодах, к чему полумеры?

 

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

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


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

взрыва мозга вызывает не присваиваивание результата сравнения переменной, а тот факт, что этот результат присваивается переменной целочисленного типа!
Тут как раз все просто. Ну не было в С логического (boolean) типа, не было! Когда поняли, что он все же нужен, было уже поздно. Кстати, в С99 он все же появился, но какой то недоделанный, увы.

В С++ тип bool есть от рождения, и там он ведет себя именно так, как вы и хотите.

 

но главное не это: ведь есть же способ исключить любые парадоксы в тексте программ на Си! для этого надо пользоваться принципом бритвы Оккама: не плоди сущности без нужды. если нужны логические действия, делаем их при помощи имеющихся в Си ЛОГИЧЕСКИХ манипуляций над логическими же данными.
Я уже устал вам объяснять - нет в С логических данных, а есть только числа. И логические операции - это всего лишь специальные псевдо-арифметические операции над целыми числами. И это не какие то тайные знания, которые доступны только ценителям и знатокам стандарта, а то, что было в этом языке всегда с самого его рождения.

Вместо того, что бы осознать базовые концепции языка С вы пытаетесь навязать всем свои собственные концепции, и заявляете, что все, что в С с ними не совпадает является ошибкой!

 

В общем вы когда переходили от Pascal'я к С видимо не вылезли из песочницы, а прихватили ее с собой, и теперь пытаетесь всех проходящих мимо в нее затянуть. :1111493779:

 

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


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

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

Это его сильная и одновременно слабая сторона.

Для тех, кто привык к порядку, вояки изобрели MISRA C

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


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

Тут как раз все просто. Ну не было в С логического (boolean) типа, не было! Когда поняли, что он все же нужен, было уже поздно. Кстати, в С99 он все же появился, но какой то недоделанный, увы.

И очень странно, что не было. И очень глупо, что нормального нет до сих пор.

Хотя... а в чем недоделанность _Bool ? Кроме ужасного названия?

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


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

Хотя... а в чем недоделанность _Bool ? Кроме ужасного названия?
В том, что все логические операции в С до сих пор работают не с ним, а с int. Т.е. тип есть, но его никто не использует :rolleyes:

 

 

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


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

Я использую битовые поля. В них помещается сразу много битов. :)

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


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

Я использую битовые поля. В них помещается сразу много битов. :)
И это правильно. А еще лучше использовать битовые шкалы :rolleyes: Хотя нет, сейчас налетят поборники 'логичности' и заклюют за использование битовой операции '&' в условных выражениях ;)

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


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

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

Вместо того, что бы осознать базовые концепции языка С вы пытаетесь навязать всем свои собственные концепции, и заявляете, что все, что в С с ними не совпадает является ошибкой!

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

 

может 48 шрифтом это написать?

 

я просто поражаюсь: вы спорите не с моими утверждениями, а с приписываемыми вами мне... остановитесь, пожалуйста, это абсолютно бесплодно.

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


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

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

А я люблю писать компактно, без лишних скобок, с минимальным количеством операторов. Считаю, что и компилируется более компактно, и работает чуть быстрее. Наверное, может оказаться и наоборот, в исключительных случаях. Если потребуется, можно проверить конкретно, что лучше.

Логика !a ^ !b мне понятна. Ради скорейшего понимания выражения кем-то посторонним или самим собой, когда-нибудь, "красотой" я жертвовать не буду.

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


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

в соответствии с настоящей логикой следовало бы применять не !!a, но a != 0 - только и всего! на 1 значащий символ длиннее запись, но на стопицот процентов ЛОГИЧНЕЕ!!!

 

вы зря тратите нервы, тут контингент несколько специфичный, мозг на ассемблер заточен и на чем бы они ни писали и какой процессор не программировали - один фиг это будет ассемблер и ногодрыг, короче говоря искробезопасный код :)

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

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


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

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

Это его сильная и одновременно слабая сторона.

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

 

1. возможность для автоматических переменных задавать одинаковые идентификаторы во вложенных блоках.

 

 

2. упомянутое назначение для обозначения логических значений 1 и !1 или 0 и !0

 

3. использование "для оптимальности" вариаций 5[a] и аналогичных "трюков".

 

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

 

 

 

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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