Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
вопрос писал(а): Цитата:в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си Вот всегда ли хорошо критиковать промышленный стандарт? Может там не всё так нелогично? я не знаю, долго ли думали создатели Си о том, почему и как должны, но в отношении Форта могу предложить следующую выдержку из перевода "Thinking Forth" от Броуди: Цитата: ВЫЧИСЛЕНИЕ РЕЗУЛЬТАТОВ. ------------------------------------------------------------ СОВЕТ Не принимайте решений, но вычисляйте. ------------------------------------------------------------ 226 Во многих случаях условные операторы применяются ошибочно тогда, когда различные варианты поведения обусловливаются численными различиями. Раз задействованы числа, то мы их можем посчитать. (См. в главе 4 раздел "Расчеты или структуры данных или логика".) ------------------------------------------------------------ СОВЕТ Используйте логические значения в качестве чисел. ------------------------------------------------------------ Это высказывание замечательно венчает собой предыдущий совет "Не принимайте решений, но вычисляйте". Идея состоит в том, что булевские значения, которые в компьютере представлены числами, могут быть эффективно использованы для улучшения принятия решений. Вот один пример, встречающийся во многих Форт- системах: : S>D ( n -- d ) \ распространение знака на d DUP 0< IF -1 ELSE 0 THEN ; (Задачей этого определения является превращение числа одинарной длины в число двойной длины. Это последнее представляется как два 16-разрядных числа на стеке, старшие разряды - на вершине. Превращение положительного целого заключается просто в добавлении нуля на стек для представления этой старшей части. Но преобразование отрицательного требует "расширения знака", то есть старшая часть должна быть представлена всеми единицами.) Вышеприведенное определение проверяет одинарное число на отрицательность. Если таковая обнаружена, оно кладет на стек минус-единицу; в противном случае - ноль. Но обратите внимание, что выход получается чисто арифметическим; качественных изменений самого процесса нет. Из этого факта можно извлечь выгоду, используя само логическое значение: : S>D ( n -- d ) \ распространение знака на d DUP 0< ; Эта версия оставляет на стеке ноль или минус-единицу без принятия решений. (В системах до 83-го стандарта определение должно было бы быть таким): : S>D ( n -- d ) \ распространение знака на d DUP 0< NEGATE ; См. приложение В.) С такими "гибридными числами" можно проделывать даже больше: ------------------------------------------------------------ СОВЕТ Для повышения эффективности формирования числового выхода используйте AND. ------------------------------------------------------------ 227 Для случая структуры, принимающей решение о формировании нуля либо ненулевого числа "n", традиционная фраза ( ? ) IF n ELSE 0 THEN эквивалентна более простому выражению ( ? ) n AND Опять же секрет в том, что в системах стандарта '83 "истина" представляется -1 (всеми единичками). Делая AND числу "n" с флагом, мы оставляем либо "n" (все биты остаются), либо "0" (все биты очищаются). Для закрепления - еще пример: ( ? ) IF 200 ELSE 0 THEN то же самое, что ( ? ) 200 AND Посмотрите на следующий случай: n a b < IF 45 + THEN Фраза либо добавляет 45 к "n", либо нет, в зависимости от соотношения величин "a" и "b". Поскольку "добавить 45 или нет" - это то же, что и "добавить 45 или добавить 0", то различие в двух возможных исходах - чисто числовое. Мы можем позволить себе избежать принятия решения и просто вычислить: n a b < 45 AND + ---------------------------------------------------------------- Мур: Выражение "45 AND" работает быстрее, чем IF, и, конечно, более грациозно. Оно проще. Если Вы освоите привычку обращать внимание на точки, в которых вычисляете отличие одного значения от другого, то обычно при выполнении арифметических действий над логическими величинами Вы будете получать тот же результат более чистым образом. Я не знаю, как это называется. Здесь нет терминологии - просто выполнение арифметики со значениями "истина". Но это совершенно корректно, и когда-нибудь булева алгебра и арифметические выражения к этому приспособятся. В книгах часто встречается множество кусочно-линейных аппроксимаций, неспособных ясно изобразить положение дел. К примеру, выражение: x = 1 для t < 0 x = 0 для t >= 0 было бы эквивалентно t 0< 1 AND как единому, а не кусочному выражению. ---------------------------------------------------------------- 228 Я называю подобные флаги "гибридными величинами", поскольку они - булевские значения (значения "истина"), которые применяются в качестве данных (арифметических величин). Я тоже не знаю, как их еще назвать. Можно сократить также и многочисленные ELSEы (когда оба результата - не нулевые), вычленяя различие между результатами. К примеру, : ШАГОВИКИ 'ПРОВЕРКА? @ IF 150 ELSE 151 THEN LOAD ; может быть упрощено до : ШАГОВИКИ 150 'ПРОВЕРКА? @ 1 AND + LOAD ; Этот подход работает потому, что, по смыслу, мы хотим загрузить либо блок 150, либо, для тестирования, следующий после него блок. вопрос писал(а): Цитата:if(value=true){someting}; если внутри if() действие вместо сравнения ( = вместо ==) то компилятор проглотит, но результаты непредсказуемы - хотя GCC должен отловить как ошибку
имелось ввиду сравнение, а не присвоение (просто я забыл о дурацком == в сях, впрочем имел место псевдокод)
[quote="вопрос"]Цитата:в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си Вот всегда ли хорошо критиковать промышленный стандарт? Может там не всё так нелогично?[/quote] я не знаю, долго ли думали создатели Си о том, почему и как должны, но в отношении Форта могу предложить следующую выдержку из перевода "Thinking Forth" от Броуди: [quote]ВЫЧИСЛЕНИЕ РЕЗУЛЬТАТОВ. ------------------------------------------------------------ СОВЕТ Не принимайте решений, но вычисляйте. ------------------------------------------------------------ 226 Во многих случаях условные операторы применяются ошибочно тогда, когда различные варианты поведения обусловливаются численными различиями. Раз задействованы числа, то мы их можем посчитать. (См. в главе 4 раздел "Расчеты или структуры данных или логика".) ------------------------------------------------------------ СОВЕТ Используйте логические значения в качестве чисел. ------------------------------------------------------------ Это высказывание замечательно венчает собой предыдущий совет "Не принимайте решений, но вычисляйте". Идея состоит в том, что булевские значения, которые в компьютере представлены числами, могут быть эффективно использованы для улучшения принятия решений. Вот один пример, встречающийся во многих Форт- системах: : S>D ( n -- d ) \ распространение знака на d DUP 0< IF -1 ELSE 0 THEN ; (Задачей этого определения является превращение числа одинарной длины в число двойной длины. Это последнее представляется как два 16-разрядных числа на стеке, старшие разряды - на вершине. Превращение положительного целого заключается просто в добавлении нуля на стек для представления этой старшей части. Но преобразование отрицательного требует "расширения знака", то есть старшая часть должна быть представлена всеми единицами.) Вышеприведенное определение проверяет одинарное число на отрицательность. Если таковая обнаружена, оно кладет на стек минус-единицу; в противном случае - ноль. Но обратите внимание, что выход получается чисто арифметическим; качественных изменений самого процесса нет. Из этого факта можно извлечь выгоду, используя само логическое значение: : S>D ( n -- d ) \ распространение знака на d DUP 0< ; Эта версия оставляет на стеке ноль или минус-единицу без принятия решений. (В системах до 83-го стандарта определение должно было бы быть таким): : S>D ( n -- d ) \ распространение знака на d DUP 0< NEGATE ; См. приложение В.) С такими "гибридными числами" можно проделывать даже больше: ------------------------------------------------------------ СОВЕТ Для повышения эффективности формирования числового выхода используйте AND. ------------------------------------------------------------ 227 Для случая структуры, принимающей решение о формировании нуля либо ненулевого числа "n", традиционная фраза ( ? ) IF n ELSE 0 THEN эквивалентна более простому выражению ( ? ) n AND Опять же секрет в том, что в системах стандарта '83 "истина" представляется -1 (всеми единичками). Делая AND числу "n" с флагом, мы оставляем либо "n" (все биты остаются), либо "0" (все биты очищаются). Для закрепления - еще пример: ( ? ) IF 200 ELSE 0 THEN то же самое, что ( ? ) 200 AND Посмотрите на следующий случай: n a b < IF 45 + THEN Фраза либо добавляет 45 к "n", либо нет, в зависимости от соотношения величин "a" и "b". Поскольку "добавить 45 или нет" - это то же, что и "добавить 45 или добавить 0", то различие в двух возможных исходах - чисто числовое. Мы можем позволить себе избежать принятия решения и просто вычислить: n a b < 45 AND + ---------------------------------------------------------------- Мур: Выражение "45 AND" работает быстрее, чем IF, и, конечно, более грациозно. Оно проще. Если Вы освоите привычку обращать внимание на точки, в которых вычисляете отличие одного значения от другого, то обычно при выполнении арифметических действий над логическими величинами Вы будете получать тот же результат более чистым образом. Я не знаю, как это называется. Здесь нет терминологии - просто выполнение арифметики со значениями "истина". Но это совершенно корректно, и когда-нибудь булева алгебра и арифметические выражения к этому приспособятся. В книгах часто встречается множество кусочно-линейных аппроксимаций, неспособных ясно изобразить положение дел. К примеру, выражение: x = 1 для t < 0 x = 0 для t >= 0 было бы эквивалентно t 0< 1 AND как единому, а не кусочному выражению. ---------------------------------------------------------------- 228 Я называю подобные флаги "гибридными величинами", поскольку они - булевские значения (значения "истина"), которые применяются в качестве данных (арифметических величин). Я тоже не знаю, как их еще назвать. Можно сократить также и многочисленные ELSEы (когда оба результата - не нулевые), вычленяя различие между результатами. К примеру, : ШАГОВИКИ 'ПРОВЕРКА? @ IF 150 ELSE 151 THEN LOAD ; может быть упрощено до : ШАГОВИКИ 150 'ПРОВЕРКА? @ 1 AND + LOAD ; Этот подход работает потому, что, по смыслу, мы хотим загрузить либо блок 150, либо, для тестирования, следующий после него блок.[/quote]
[quote="вопрос"]Цитата:if(value=true){someting}; если внутри if() действие вместо сравнения ( = вместо ==) то компилятор проглотит, но результаты непредсказуемы - хотя GCC должен отловить как ошибку[/quote]
имелось ввиду сравнение, а не присвоение (просто я забыл о дурацком == в сях, впрочем имел место псевдокод)
|
|
|
|
Добавлено: Чт ноя 19, 2009 18:05 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си Вот всегда ли хорошо критиковать промышленный стандарт? Может там не всё так нелогично? Цитата: if(value=true){someting};
если внутри if() действие вместо сравнения ( = вместо ==) то компилятор проглотит, но результаты непредсказуемы -
хотя GCC должен отловить как ошибку
[quote]в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си[/quote] Вот всегда ли хорошо критиковать промышленный стандарт? Может :wink: там не всё так нелогично? [quote]if(value=true){someting}; [/quote]
если внутри if() действие вместо сравнения ( = вместо ==) то компилятор проглотит, но результаты непредсказуемы -
хотя GCC должен отловить как ошибку
|
|
|
|
Добавлено: Чт ноя 19, 2009 17:49 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си
Просто то, что называется каноническим значением истины, различается: 1 и -1.
Если каноническое значение 1, канонический способ инверсии есть операция "1 XOR"
Если каноническое значение -1, канонический способ инверсии есть операция "NOT"
У каждого выбора свои преимущества и недостатки.
В 4те, например, менее удобно прибавлять булеву величину к целому, чем в С:
sum += cond;
против
cond @ 1 AND sum +!
[quote="mOleg"] в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си 8)[/quote]
Просто то, что называется каноническим значением истины, различается: 1 и -1.
Если каноническое значение 1, канонический способ инверсии есть операция "1 XOR"
Если каноническое значение -1, канонический способ инверсии есть операция "NOT"
У каждого выбора свои преимущества и недостатки.
В 4те, например, менее удобно прибавлять булеву величину к целому, чем в С:
sum += cond;
против
cond @ 1 AND sum +!
|
|
|
|
Добавлено: Чт ноя 19, 2009 16:29 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
А вот еще чего нашел
The C99 version of C provides a built-in _Bool data type. It is large enough to store the values 0 and 1.
И вот еще....
During its standardization process, the C++ programming language introduced the bool, true and false keywords, adding a native data type to support Boolean data. Its size is implementation-defined.[3] bool was introduced in 1993[4].
Values of type bool are either true or false.[5] Implicit conversions exist between bool and other integral types, floating point types, pointer types, and pointer-to-member types.[6] In addition, user-defined types can be converted to bool via a user-defined conversion operator. In general, a zero or null-pointer value is converted to false, any other value is converted to true.
А вот еще чего нашел
[i]The C99 version of C provides a built-in _Bool data type. It is large enough to store the values 0 and 1. [/i]
И вот еще....
[i]During its standardization process, the C++ programming language introduced the bool, true and false keywords, adding a native data type to support Boolean data. Its size is implementation-defined.[3] bool was introduced in 1993[4].
Values of type bool are either true or false.[5] Implicit conversions exist between bool and other integral types, floating point types, pointer types, and pointer-to-member types.[6] In addition, user-defined types can be converted to bool via a user-defined conversion operator. In general, a zero or null-pointer value is converted to false, any other value is converted to true.[/i]
|
|
|
|
Добавлено: Пт ноя 13, 2009 18:35 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): скорее википедия глючит. Вполне может быть, но я уже не раз встречал именно такой расклад. Да и вполне известный факт что разработчики Си компиляторов не так уж жестко придерживаются стандарта. т.е. некотрые тоже поступают mOleg писал(а): вполне логично и удобно
[quote="mOleg"]скорее википедия глючит. [/quote] Вполне может быть, но я уже не раз встречал именно такой расклад. Да и вполне известный факт что разработчики Си компиляторов не так уж жестко придерживаются стандарта. т.е. некотрые тоже поступают[quote="mOleg"]вполне логично и удобно[/quote]
|
|
|
|
Добавлено: Пт ноя 13, 2009 18:21 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
скорее википедия глючит.
вообще, я так понимаю, проблема будет везде, где будет встречаться что-то подобное:
<pre>
if(value=true){someting};
</pre>
если же будет что-то вроде:
<pre>
if(value){someting};
</pre>
проблем быть вроде как не должно, хотя опять же как там будет преобразование типов в конкретном компиляторе проходить не известно.
в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си
скорее википедия глючит.
вообще, я так понимаю, проблема будет везде, где будет встречаться что-то подобное:
<pre>
if(value=true){someting};
</pre>
если же будет что-то вроде:
<pre>
if(value){someting};
</pre>
проблем быть вроде как не должно, хотя опять же как там будет преобразование типов в конкретном компиляторе проходить не известно.
в Форте флаги выбраны вполне логично и удобно, чего я не скажу про Си 8)
|
|
|
|
Добавлено: Пт ноя 13, 2009 18:11 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Ilya писал(а): Взял справочник по Сям и увидел там что TRUE = 1 (а не любое значение >0 как в Форте)!!!
А вот я в википедии нашел.
Код: typedef int bool; #define FALSE 0 #define TRUE (-1)
Похоже у сишников тоже "..... порядку нет как нет"
[quote="Ilya"]Взял справочник по Сям и увидел там что TRUE = 1 (а не любое значение >0 как в Форте)!!![/quote]
А вот я в википедии нашел.
[code] typedef int bool; #define FALSE 0 #define TRUE (-1) [/code]
Похоже у сишников тоже "..... порядку нет как нет" :dmad;
|
|
|
|
Добавлено: Пт ноя 13, 2009 18:06 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): преобразование Форт-флагов в Сишные и обратно: \ конвертировать сишный флаг в Форт-представление : >flag ( f --> flag ) 1 - INVERT ;
\ конвертировать Фот-флаг в сишный : flag> ( flag --> f ) 0 <> 1 AND ;
Можно попроще:
Код: \ конвертировать сишный флаг в Форт-представление : >flag ( f --> flag ) NEGATE ;
\ конвертировать Форт-флаг в сишный : flag> ( flag --> f ) 0<> NEGATE ;
[quote="mOleg"]преобразование Форт-флагов в Сишные и обратно: \ конвертировать сишный флаг в Форт-представление : >flag ( f --> flag ) 1 - INVERT ;
\ конвертировать Фот-флаг в сишный : flag> ( flag --> f ) 0 <> 1 AND ; [/quote]
Можно попроще:
[code]\ конвертировать сишный флаг в Форт-представление : >flag ( f --> flag ) NEGATE ;
\ конвертировать Форт-флаг в сишный : flag> ( flag --> f ) 0<> NEGATE ;[/code]
|
|
|
|
Добавлено: Пт ноя 13, 2009 12:02 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
VoidVolker писал(а): А разве не TRUE = "не ноль" ?
все операции, возвращающие флаги во всех Фортах возвращают в качестве TRUE значение -1 (все биты установлены).
однако, все операции анализирующие флаги (IF WHILE и т.п.) считают за TRUE отличное от нуля значение.
[quote="VoidVolker"]А разве не TRUE = "не ноль" ?[/quote]
все операции, возвращающие флаги во всех Фортах возвращают в качестве TRUE значение -1 (все биты установлены).
однако, все операции анализирующие флаги (IF WHILE и т.п.) считают за TRUE отличное от нуля значение.
|
|
|
|
Добавлено: Пт ноя 13, 2009 07:55 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: А разве не TRUE = "не ноль" ? так должно быть, но бывает и иначе, по крайней мере ввиду индивидуальности каждого форта
[quote]А разве не TRUE = "не ноль" ?[/quote] так должно быть, но бывает и иначе, по крайней мере ввиду индивидуальности каждого форта
|
|
|
|
Добавлено: Чт ноя 12, 2009 23:11 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): в Форте значение TRUE = -1
А разве не TRUE = "не ноль" ?
[quote="mOleg"]в Форте значение TRUE = -1[/quote]
А разве не TRUE = "не ноль" ?
|
|
|
|
Добавлено: Чт ноя 12, 2009 20:48 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
_Harry писал(а): mOleg писал(а): Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE). Хм ни разу с таким не сталкивался. Это скорее особености виндовых функций а не Си. Что скажут знатоки стандартов???
Хоть я и не знаток стандартов, но столкнулся в именно с тем, что вызов API с произвольным значением <>0 не давало требуемого эффекта. Но это скорее "частный" (либа user32.dll ф-ции связанные с DDE) случай.
Взял справочник по Сям и увидел там что TRUE = 1 (а не любое значение >0 как в Форте)!!!
[quote="_Harry"][quote="mOleg"]Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).[/quote] Хм ни разу с таким не сталкивался. Это скорее особености виндовых функций а не Си. Что скажут знатоки стандартов??? :<[/quote]
Хоть я и не знаток стандартов, но столкнулся в именно с тем, что вызов API с произвольным значением <>0 не давало требуемого эффекта. Но это скорее "частный" (либа user32.dll ф-ции связанные с DDE) случай.
Взял справочник по Сям и увидел там что TRUE = 1 (а не любое значение >0 как в Форте)!!!
|
|
|
|
Добавлено: Чт ноя 12, 2009 19:33 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).
Хм ни разу с таким не сталкивался. Это скорее особености виндовых функций а не Си.
Что скажут знатоки стандартов???
[quote="mOleg"]Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).[/quote]
Хм ни разу с таким не сталкивался. Это скорее особености виндовых функций а не Си.
Что скажут знатоки стандартов??? :<
|
|
|
|
Добавлено: Чт ноя 12, 2009 19:27 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
эм, флаги в Форте всегда были, только их значения отличаются от привычных для других ээ, языков.
в Форте значение TRUE = -1 (то есть все биты уставновлены в 1)
значение FALSE = 0 (все биты сброшены).
Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).
эм, флаги в Форте всегда были, только их значения отличаются от привычных для других ээ, языков.
в Форте значение TRUE = -1 (то есть все биты уставновлены в 1)
значение FALSE = 0 (все биты сброшены).
Отдавать, например виндошному АПИ, значение -1 бывает черевато (не опознается как TRUE).
|
|
|
|
Добавлено: Чт ноя 12, 2009 19:24 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Что в форте появились флаги???
Это имеется в виду Fаlse и True.
Только мне сдается что любое значение отличное от 0 в Си будет True.
Так что конвертировать нет необходимости.
Или я не прав?
Что в форте появились флаги???
Это имеется в виду Fаlse и True.
Только мне сдается что любое значение отличное от 0 в Си будет True.
Так что конвертировать нет необходимости.
Или я не прав? :roll:
|
|
|
|
Добавлено: Чт ноя 12, 2009 19:14 |
|
|
|
|