bc - справочное руководство, опции, примеры команд


ИМЯ

bc - Язык калькулятора произвольной точности

СИНТАКСИС

bc [ -hlwsqv ] [long-options] [ файл ... ]

ОПИСАНИЕ

bc — это язык, поддерживающий числа произвольной точности с интерактивным выполнением операторов. В синтаксисе есть некоторое сходство с языком программирования C. Стандартная математическая библиотека доступна в командной строке. По запросу математическая библиотека определяется перед обработкой любых файлов. bc начинает с обработки кода из всех файлов, перечисленных в командной строке, в указанном порядке. После обработки всех файлов bc читает со стандартного ввода. Весь код выполняется по мере его чтения. (Если файл содержит команду для остановки процессора, bc никогда не будет читать стандартный ввод.)

Эта версия bc содержит несколько расширений помимо традиционных реализаций bc и проекта стандарта POSIX. Параметры командной строки могут привести к тому, что эти расширения выведут предупреждение или будут отклонены. Этот документ описывает язык, принятый этим процессором. Расширения будут идентифицированы как таковые.

ПАРАМЕТРЫ

-h, --help

Распечатайте использование и выйдите.

-i, --interactive

Активировать интерактивный режим.

-l, --mathlib

Определите стандартную математическую библиотеку.

-w, --warn

Предупреждать о расширениях POSIX bc.

-s, --standard

Обработка точно для языка POSIX bc.

-q, --quiet

Не печатайте обычное приветствие GNU bc.

-v, --version

Распечатайте номер версии и авторские права и выйдите.

НОМЕРА

Самым основным элементом bc является число. Числа - это числа произвольной точности. Эта точность относится как к целой, так и к дробной части. Все числа представлены внутренне в десятичном виде, и все вычисления выполняются в десятичном формате. (Эта версия усекает результаты операций деления и умножения.) У чисел есть два атрибута: длина и масштаб. Длина — это общее количество десятичных цифр, используемых bc для представления числа, а масштаб — это общее количество десятичных цифр после запятой. Например:

 .000001 has a length of 6 and scale of 6.
 1935.000 has a length of 7 and a scale of 3.

ПЕРЕМЕННЫЕ

Числа хранятся в двух типах переменных, простых переменных и массивах. Имеются как простые переменные, так и переменные массива. Имена начинаются с буквы, за которой следует любое количество букв, цифр и знаков подчеркивания. Все буквы должны быть строчными. (Полные буквенно-цифровые имена являются расширением. В POSIX bc все имена представляют собой одну строчную букву.) Тип переменной ясен из контекста, поскольку все имена переменных массива будут сопровождаться квадратными скобками ( []).

Есть четыре специальные переменные: scale, ibase, obase и last. масштаб определяет, как некоторые операции используют цифры после запятой. Значение по умолчанию scale равно 0. ibase и obase определяют базу преобразования для входных и выходных чисел. По умолчанию для ввода и вывода используется основание 10. last (расширение) — это переменная, которая имеет значение последнего напечатанного числа. Они будут обсуждаться более подробно, где это уместно. Все эти переменные могут иметь присвоенные им значения, а также использоваться в выражениях.

КОММЕНТАРИИ

Комментарии в bc начинаются с символов /* и заканчиваются символами */. Комментарии могут начинаться где угодно и отображаться в виде одного пробела во входных данных. (Это приводит к тому, что комментарии разграничивают другие входные элементы. Например, комментарий не может быть найден в середине имени переменной.) Комментарии включают любые символы новой строки (конец строки) между началом и концом комментария.

Для поддержки использования скриптов для bc в качестве расширения был добавлен однострочный комментарий. Однострочный комментарий начинается с символа # и продолжается до следующего конца строки. Символ конца строки не является частью комментария и обрабатывается нормально.

ВЫРАЖЕНИЯ

Числа управляются выражениями и утверждениями. Поскольку язык был разработан как интерактивный, операторы и выражения выполняются как можно быстрее. Нет никакой "основной" программы. Вместо этого код выполняется по мере его обнаружения. (Функции, подробно рассмотренные ниже, определяются при встрече.)

Простое выражение — это просто константа. bc преобразует константы во внутренние десятичные числа, используя текущую базу ввода, заданную переменной ibase. (Есть исключение в функциях.) Допустимые значения ibase: от 2 до 36. (Основания больше 16 являются расширением.) Присвоение значения вне этого диапазона ibase приведет к значению 2 или 36. Вводимые числа могут содержать символы 0-9 и A-Z. (Примечание: они должны быть заглавными. Строчные буквы — это имена переменных.) Одноразрядные числа всегда имеют значение цифры независимо от значения ibase. (т. е. A=10.) Для многозначных чисел bc изменяет все входные цифры, большие или равные ibase, на значение ibase-1. Это делает число ZZZ всегда самым большим трехзначным числом входной базы.

Полные выражения похожи на многие другие языки высокого уровня. Поскольку существует только один тип числа, правил смешивания типов не существует. Вместо этого существуют правила шкалы выражений. Каждое выражение имеет масштаб. Это получено из масштаба исходных чисел, выполненной операции и, во многих случаях, значения переменной scale. Допустимые значения переменной scale — от 0 до максимального числа, которое может быть представлено целым числом C.

В следующих описаниях допустимых выражений «expr» относится к полному выражению, а «var» — к простой переменной или переменной массива. Простая переменная — это просто

name

и переменная массива указана как

name[expr]

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

- expr

Результатом является отрицание выражения.

++ var

Переменная увеличивается на единицу, и новое значение является результатом выражения.

-- var

Переменная уменьшается на единицу, и новое значение является результатом выражения.

var ++

Результатом выражения является значение переменной, а затем переменная увеличивается на единицу.

var --

Результатом выражения является значение переменной, а затем переменная уменьшается на единицу.

expr + expr

Результатом выражения является сумма двух выражений.

expr - expr

Результатом выражения является разность двух выражений.

expr * expr

Результатом выражения является произведение двух выражений.

expr / expr

Результатом выражения является частное двух выражений. Масштаб результата — это значение переменной scale.

expr % expr

Результатом выражения является «остаток», и он вычисляется следующим образом. Чтобы вычислить%b, сначала вычисляется a/b для масштабирования цифр. Этот результат используется для вычисления a-(a/b)*b в максимальном масштабе из масштаба+масштаба(b) и масштаба(а). Если масштаб установлен равным нулю и оба выражения являются целыми числами, это выражение является функцией целочисленного остатка.

expr ^ expr

Результатом выражения является значение первого, возведенное во второе. Второе выражение должно быть целым числом. (Если второе выражение не является целым числом, генерируется предупреждение, и выражение усекается для получения целочисленного значения.) Масштаб результата равен масштабу, если показатель степени отрицательный. Если показатель степени положительный, масштаб результата равен минимуму масштаба первого выражения, умноженному на значение показателя степени, и максимуму масштаба и масштаба первого выражения. (например, масштаб(a^b)=min(масштаб(a)*b, max( масштаб, масштаб(a))).) Следует отметить, что expr^0 всегда будет возвращать значение из 1.

( expr )

Это изменяет стандартный приоритет, чтобы принудительно вычислить выражение.

var = expr

Переменной присваивается значение выражения.

var <op>= expr

Это эквивалентно «var=var expr», за исключением того, что часть «var» оценивается только один раз. Это может иметь значение, если "var" является массивом.

Реляционные выражения — это особый вид выражений, которые всегда оцениваются как 0 или 1, 0, если отношение ложно, и 1, если отношение истинно. Они могут появляться в любом юридическом выражении. (POSIX bc требует, чтобы реляционные выражения использовались только в операторах if, while и for и чтобы в них можно было выполнить только одну реляционную проверку.) Реляционные операторы

expr1 < expr2

Результат равен 1, если expr1 строго меньше, чем expr2.

expr1 <= expr2

Результат равен 1, если expr1 меньше или равно expr2.

expr1 > expr2

Результат равен 1, если expr1 строго больше, чем expr2.

expr1 >= expr2

Результат равен 1, если expr1 больше или равно expr2.

expr1 == expr2

Результат равен 1, если expr1 равно expr2.

expr1 != expr2

Результат равен 1, если expr1 не равно expr2.

Логические операции также допустимы. (POSIX bc НЕ имеет логических операций). Результатом всех логических операций являются 0 и 1 (для ложных и истинных), как и в выражениях отношения. Булевы операторы:

!expr

Результат равен 1, если выражение равно 0.

expr && expr

Результат равен 1, если оба выражения отличны от нуля.

expr || expr

Результат равен 1, если любое из выражений не равно нулю.

Приоритет выражения следующий: (от низшего к высшему)

|| operator, left associative
&& operator, left associative
! operator, nonassociative
Relational operators, left associative
Assignment operator, right associative
+ and - operators, left associative
*, / and % operators, left associative
^ operator, right associative
unary - operator, nonassociative
++ and -- operators, nonassociative

Этот приоритет был выбран для правильной работы программ bc, совместимых с POSIX. Это приведет к тому, что использование реляционных и логических операторов будет иметь необычное поведение при использовании с выражениями присваивания. Рассмотрим выражение:

a = 3 < 5

Большинство программистов на C предположили бы, что это присвоит результат «3 < 5» (значение 1) переменной «a». Что это делает в bc, так это присваивает значение 3 переменной "a" и затем сравнивает 3 с 5. Лучше всего использовать круглые скобки при использовании реляционных и логических операторов с операторами присваивания.

В bc есть еще несколько специальных выражений. Они связаны с определяемыми пользователем функциями и стандартными функциями. Все они отображаются как "имя(параметры)". См. раздел о функциях для пользовательских функций. Стандартные функции:

length ( expression )

Значением функции длины является количество значащих цифр в выражении.

read ( )

Функция чтения (расширение) будет считывать число из стандартного ввода, независимо от того, где эта функция встречается. Остерегайтесь, это может вызвать проблемы с смешиванием данных и программы в стандартном вводе. Лучше всего использовать эту функцию в ранее написанной программе, которая требует ввода от пользователя, но никогда не позволяет пользователю вводить программный код. Значение функции чтения — это число, считанное из стандартного ввода с использованием текущего значения переменной ibase для базы преобразования.

scale ( expression )

Значение функции масштабирования — это количество цифр после запятой в выражении.

sqrt ( expression )

Значением функции sqrt является квадратный корень выражения. Если выражение отрицательное, генерируется ошибка времени выполнения.

ЗАЯВЛЕНИЯ

Операторы (как и в большинстве алгебраических языков) обеспечивают последовательность вычисления выражений. В bc операторы выполняются "как можно скорее". Выполнение происходит, когда встречается новая строка и есть один или несколько полных операторов. Из-за такого немедленного выполнения символы новой строки очень важны в bc. На самом деле, как точка с запятой, так и новая строка используются в качестве разделителей операторов. Неправильно размещенная новая строка вызовет синтаксическую ошибку. Поскольку новые строки являются разделителями операторов, можно скрыть новую строку, используя символ обратной косой черты. Последовательность «\», где — новая строка, отображается как bc как пробел вместо новой строки. Список операторов — это последовательность операторов, разделенных точкой с запятой и символом новой строки. Ниже приведен список операторов bc и того, что они делают: (То, что заключено в квадратные скобки ([]), является необязательными частями оператора.)

expression

Это утверждение делает одну из двух вещей. Если выражение начинается с <переменная> <присваивание>..., оно считается оператором присваивания. Если выражение не является оператором присваивания, выражение оценивается и выводится на выходе. После того, как число напечатано, печатается новая строка. Например, «a=1» — это оператор присваивания, а «(a=1)» — это выражение со встроенным присваиванием. Все печатаемые числа печатаются в базе, заданной переменной obase. Допустимые значения obase: от 2 до BC_BASE_MAX. (См. раздел ПРЕДЕЛЫ.) Для оснований от 2 до 16 используется обычный метод записи чисел. Для оснований больше 16 bc использует многосимвольный метод печати чисел, при котором каждая старшая цифра основания печатается как число с основанием 10. Многосимвольные цифры разделяются пробелами. Каждая цифра содержит количество символов, необходимое для представления десятичного значения «obase-1». Поскольку числа имеют произвольную точность, некоторые числа не могут быть напечатаны в одной строке вывода. Эти длинные числа будут разделены по строкам, используя «\» в качестве последнего символа в строке. Максимальное количество символов, печатаемых в строке, равно 70. Из-за интерактивного характера bc печать числа вызывает побочный эффект присваивания напечатанного значения специальной переменной last. . Это позволяет пользователю восстановить последнее напечатанное значение без повторного ввода выражения, которое напечатало число. Присвоение last допустимо и заменит последнее напечатанное значение присвоенным значением. Вновь присвоенное значение будет сохраняться до тех пор, пока не будет напечатано следующее число или не будет присвоено другое значение последнему. (В некоторых установках может быть разрешено использование одной точки (.), которая не является частью числа, в качестве сокращенного обозначения для последнего.)

string

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

print list

Оператор печати (расширение) предоставляет другой метод вывода. «Список» — это список строк и выражений, разделенных запятыми. Каждая строка или выражение печатается в порядке списка. Завершающая новая строка не печатается. Выражения оцениваются, их значение выводится и присваивается переменной last. Строки в операторе печати печатаются на выходе и могут содержать специальные символы. Специальные символы начинаются с обратной косой черты (\). Специальные символы, распознаваемые bc: "a" (предупреждение или звонок), "b" (возврат), "f" (перевод страницы), "n" (новая строка), "r" (перевод строки). return), «q» (двойная кавычка), «t» (табуляция) и «\» (обратная косая черта). Любой другой символ после обратной косой черты будет игнорироваться.

{ statement_list }

Это составное утверждение. Это позволяет сгруппировать несколько операторов для выполнения.

if ( expression ) statement1 [else statement2]

Оператор if оценивает выражение и выполняет оператор1 или оператор2 в зависимости от значения выражения. Если выражение не равно нулю, выполняется оператор1. Если присутствует оператор2 и значение выражения равно 0, то выполняется оператор2. (Предложение else является расширением.)

while ( expression ) statement

Оператор while выполнит оператор, пока выражение не равно нулю. Он оценивает выражение перед каждым выполнением оператора. Завершение цикла вызвано нулевым значением выражения или выполнением оператора break.

for ( [expression1] ; [expression2] ; [expression3] ) statement

Оператор for управляет повторным выполнением оператора. Выражение1 вычисляется перед циклом. Выражение2 оценивается перед каждым выполнением оператора. Если он не равен нулю, оператор оценивается. Если он равен нулю, цикл завершается. После каждого выполнения оператора выражение3 оценивается перед повторным вычислением выражения2. Если выражение1 или выражение3 отсутствуют, ничего не оценивается в той точке, в которой они должны быть оценены. Если выражение2 отсутствует, это равносильно подстановке значения 1 вместо выражения2. (Необязательные выражения являются расширением. POSIX bc требует наличия всех трех выражений.) Ниже приведен эквивалентный код для оператора for:

expression1;
while (expression2) {
   statement;
   expression3;
}
break

Этот оператор вызывает принудительный выход из самого последнего включающего оператора while или for.

continue

Оператор continue (расширение) заставляет самый последний заключающий оператор for начать следующую итерацию.

halt

Оператор halt (расширение) — это исполняемый оператор, который заставляет процессор bc завершить работу только при его выполнении. Например, "if (0 == 1) halt" не приведет к завершению bc, поскольку halt не выполняется.

return

Возвращает значение 0 из функции. (См. раздел о функциях.)

return ( expression )

Возвращает значение выражения из функции. (См. раздел о функциях.) В качестве расширения круглые скобки не требуются.

ПСЕВДОЗАЯВЛЕНИЯ

Эти утверждения не являются утверждениями в традиционном смысле. Они не являются исполняемыми операторами. Их функция выполняется во время "компиляции".

limits

Распечатайте локальные ограничения, установленные локальной версией bc. Это расширение.

quit

Когда инструкция quit читается, процессор bc завершает работу, независимо от того, где находится инструкция quit. Например, "if (0 == 1) quit" приведет к завершению bc.

warranty

Распечатайте более длинное гарантийное уведомление. Это расширение.

ФУНКЦИИ

Функции предоставляют метод определения вычисления, которое может быть выполнено позже. Функции в bc всегда вычисляют значение и возвращают его вызывающей стороне. Определения функций являются «динамическими» в том смысле, что функция не определена до тех пор, пока определение не встретится на входе. Затем это определение используется до тех пор, пока не встретится другая функция определения для того же имени. Затем новое определение заменяет старое определение. Функция определяется следующим образом:

define name ( parameters ) { newline
    auto_list   statement_list }

Вызов функции — это просто выражение вида "имя(параметры)".

Параметры — это числа или массивы (расширение). В определении функции ноль или более параметров определяются путем перечисления их имен через запятую. Все параметры вызываются параметрами значения. Массивы указываются в определении параметра с помощью нотации "name[]". В вызове функции фактические параметры являются полными выражениями для числовых параметров. Для передачи массивов используются те же обозначения, что и для определения параметров массива. Именованный массив передается в функцию по значению. Поскольку определения функций являются динамическими, номера и типы параметров проверяются при вызове функции. Любое несоответствие количества или типов параметров вызовет ошибку времени выполнения. Ошибка выполнения также возникает при вызове неопределенной функции.

auto_list – это необязательный список переменных, предназначенных для "локального" использования. Синтаксис автоматического списка (если он есть) следующий: "auto имя, ... ;". (Точка с запятой необязательна.) Каждое имя является именем автоматической переменной. Массивы могут быть указаны с использованием тех же обозначений, которые используются в параметрах. Эти переменные помещают свои значения в стек в начале функции. Затем переменные инициализируются нулем и используются во время выполнения функции. При выходе из функции эти переменные извлекаются, чтобы восстановить исходное значение (на момент вызова функции) этих переменных. Параметры на самом деле являются автоматическими переменными, которые инициализируются значением, предоставленным в вызове функции. Автопеременные отличаются от традиционных локальных переменных, потому что, если функция A вызывает функцию B, B может получить доступ к auto-переменным функции A, просто используя то же имя, если только функция B не назвала их auto-переменными. Поскольку автоматические переменные и параметры помещаются в стек, bc поддерживает рекурсивные функции.

Тело функции представляет собой список операторов bc. Опять же, операторы разделяются точкой с запятой или новой строкой. Операторы возврата вызывают завершение функции и возврат значения. Есть две версии оператора return. Первая форма, "return", возвращает значение 0 вызывающему выражению. Вторая форма, "return ( expression )", вычисляет значение выражения и возвращает это значение вызывающему выражению. В конце каждой функции подразумевается "return (0)". Это позволяет функции завершаться и возвращать 0 без явного оператора возврата.

Функции также изменяют использование переменной ibase. Все константы в теле функции будут преобразованы с использованием значения ibase во время вызова функции. Изменения ibase будут игнорироваться во время выполнения функции, за исключением стандартной функции read, которая всегда будет использовать текущее значение ibase для преобразование чисел.

К функциям добавлено несколько расширений. Во-первых, формат определения был несколько смягчен. Стандарт требует, чтобы открывающая фигурная скобка находилась на той же строке, что и ключевое слово define, а все остальные части должны располагаться на следующих строках. Эта версия bc допускает любое количество новых строк до и после открывающей скобки функции. Например, следующие определения являются законными.

define d (n) { return (2*n); }
define d (n)
  { return (2*n); }

Функции могут быть определены как void. Функция void не возвращает значения и поэтому не может использоваться в любом месте, где требуется значение. Функция void не производит никакого вывода, когда вызывается сама по себе в строке ввода. Ключевое слово void помещается между ключевым словом define и именем функции. Например, рассмотрим следующий сеанс.

define py (y) { print "--->", y, "<---", "\n"; }
define void px (x) { print "--->", x, "<---", "\n"; }
py(1)
--->1<---
0
px(1)
--->1<---

Поскольку py не является пустой функцией, вызов py(1) выводит желаемый вывод, а затем выводит вторую строку, которая является значением функции. Поскольку значение функции, которой не задан явный оператор return, равно нулю, выводится ноль. Для px(1) ноль не печатается, потому что функция является пустой функцией.

Также добавлен вызов по переменной для массивов. Чтобы объявить вызов массивом переменных, объявление параметра массива в определении функции выглядит как "*name[]". Вызов функции остается таким же, как вызов по массивам значений.

МАТЕМАТИЧЕСКАЯ БИБЛИОТЕКА

Если bc вызывается с параметром -l, предварительно загружается математическая библиотека, а масштаб по умолчанию устанавливается равным 20. Математические функции вычисляют свои результаты в масштабе, установленном в время их звонка. Математическая библиотека определяет следующие функции:

s (x)

Синус x, x в радианах.

c (x)

Косинус x, x в радианах.

a (x)

Арктангенс x, арктангенс возвращает радианы.

l (x)

Натуральный логарифм x.

e (x)

Экспоненциальная функция возведения e в значение x.

j (n,x)

Функция Бесселя целого порядка n от x.

ПРИМЕРЫ

В /bin/sh следующее присвоит значение «pi» переменной оболочки pi.

pi=$(echo "scale=10; 4*a(1)" | bc -l)

Ниже приводится определение экспоненциальной функции, используемой в математической библиотеке. Эта функция написана в POSIX bc.

scale = 20

/* Uses the fact that e^x = (e^(x/2))^2
   When x is small enough, we use the series:
     e^x = 1 + x + x^2/2! + x^3/3! + ...
*/

define e(x) {
  auto  a, d, e, f, i, m, v, z

  /* Check the sign of x. */
  if (x<0) {
    m = 1
    x = -x
  } 

  /* Precondition x. */
  z = scale;
  scale = 4 + z + .44*x;
  while (x > 1) {
    f += 1;
    x /= 2;
  }

  /* Initialize the variables. */
  v = 1+x
  a = x
  d = 1

  for (i=2; 1; i++) {
    e = (a *= x) / (d *= i)
    if (e == 0) {
      if (f>0) while (f--)  v = v*v;
      scale = z
      if (m) return (1/v);
      return (v/1);
    }
    v += e
  }
}

Ниже приведен код, использующий расширенные функции bc для реализации простой программы для расчета баланса чековой книжки. Эту программу лучше всего хранить в файле, чтобы ее можно было использовать много раз без необходимости перепечатывать ее при каждом использовании.

scale=2
print "\nCheck book program!\n"
print "  Remember, deposits are negative transactions.\n"
print "  Exit by a 0 transaction.\n\n"

print "Initial balance? "; bal = read()
bal /= 1
print "\n"
while (1) {
  "current balance = "; bal
  "transaction? "; trans = read()
  if (trans == 0) break;
  bal -= trans
  bal /= 1
}
quit

Ниже приводится определение рекурсивной факториальной функции.

define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}

ВАРИАНТЫ READLINE И LIBEDIT

GNU bc может быть скомпилирован (с помощью опции configure) для использования библиотеки редактора ввода GNU readline или библиотеки BSD libedit. Это позволяет пользователю редактировать строки перед их отправкой в bc. Это также позволяет просматривать историю предыдущих набранных строк. Когда выбран этот параметр, bc имеет еще одну специальную переменную. Эта специальная переменная history представляет собой количество сохраненных строк истории. Для readline значение -1 означает, что сохраняется неограниченное количество строк истории. Установка значения history в положительное число ограничивает количество строк истории заданным числом. Значение 0 отключает функцию истории. Значение по умолчанию — 100. Для получения дополнительной информации прочитайте руководства пользователя для библиотек GNU readline, history и BSD libedit. Нельзя одновременно включить readline и libedit.

ОТЛИЧИЯ

Эта версия bc была реализована на основе черновика POSIX P1003.2/D11 и содержит несколько отличий и дополнений по сравнению с черновиком и традиционными реализациями. Он не реализован традиционным способом с использованием dc(1). Эта версия представляет собой отдельный процесс, который анализирует и выполняет преобразование байт-кода программы. Существует «недокументированная» опция (-c), которая заставляет программу выводить байт-код на стандартный вывод вместо его запуска. В основном он использовался для отладки парсера и подготовки математической библиотеки.

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

LANG environment

Эта версия не соответствует стандарту POSIX при обработке переменной среды LANG и всех переменных среды, начинающихся с LC_.

names

Традиционный и POSIX bc имеют однобуквенные имена для функций, переменных и массивов. Они были расширены до многосимвольных имен, которые начинаются с буквы и могут содержать буквы, цифры и символ подчеркивания.

Strings

Строки не могут содержать символы NUL. POSIX говорит, что все символы должны быть включены в строки.

last

POSIX bc не имеет переменной last. В некоторых реализациях bc точка (.) используется аналогичным образом.

comparisons

POSIX bc допускает сравнения только в операторе if, операторе while и втором выражении оператора for. Кроме того, в каждом из этих операторов разрешена только одна реляционная операция.

if statement, else clause

POSIX bc не имеет условия else.

for statement

POSIX bc требует, чтобы все выражения присутствовали в операторе for.

&&, ||, !

POSIX bc не имеет логических операторов.

read function

POSIX bc не имеет функции чтения.

print statement

POSIX bc не имеет оператора печати.

continue statement

POSIX bc не имеет оператора continue.

return statement

POSIX bc требует круглых скобок вокруг возвращаемого выражения.

array parameters

POSIX bc (в настоящее время) не полностью поддерживает параметры массива. Грамматика POSIX позволяет использовать массивы в определениях функций, но не предоставляет метод для указания массива в качестве фактического параметра. (Скорее всего, это оплошность в грамматике.) Традиционные реализации bc вызывают только параметры массива значений.

function format

POSIX bc требует наличия открывающей скобки в той же строке, что и ключевое слово define, и оператора auto в следующей строке.

=+, =-, =*, =/, =%, =^

POSIX bc не требует определения этих "старых" операторов присваивания. Эта версия может разрешать эти "старые" назначения. Используйте оператор ограничений, чтобы узнать, поддерживает ли их установленная версия. Если он поддерживает операторы присваивания «старого стиля», оператор «a =- 1» будет уменьшать a на 1 вместо установки a в значение -1.

spaces in numbers

Другие реализации bc допускают использование пробелов в числах. Например, «x=1 3» присвоит переменной x значение 13. Тот же оператор вызовет синтаксическую ошибку в этой версии bc.

errors and execution

Эта реализация отличается от других реализаций тем, какой код будет выполняться при обнаружении синтаксических и других ошибок в программе. Если в определении функции обнаружена синтаксическая ошибка, восстановление после ошибки пытается найти начало оператора и продолжить анализ функции. Как только в функции будет обнаружена синтаксическая ошибка, функция не будет вызываться и станет неопределенной. Синтаксические ошибки в коде интерактивного выполнения сделают текущий блок выполнения недействительным. Блок выполнения завершается концом строки, который появляется после полной последовательности операторов. Например,

a = 1
b = 2

имеет два исполнительных блока и

{ a = 1
  b = 2 }

имеет один исполнительный блок. Любая ошибка времени выполнения приведет к прекращению выполнения текущего исполняемого блока. Предупреждение времени выполнения не остановит текущий блок выполнения.

Interrupts

Во время интерактивного сеанса сигнал SIGINT (обычно генерируемый символом control-C с терминала) вызывает прерывание выполнения текущего исполняемого блока. Он отобразит ошибку «времени выполнения», указывающую, какая функция была прервана. После того, как все структуры среды выполнения будут очищены, будет напечатано сообщение, уведомляющее пользователя о том, что bc готов к дальнейшему вводу. Все ранее определенные функции остаются определенными, а значения всех неавтоматических переменных являются значениями в момент прерывания. Все автоматические переменные и параметры функций удаляются в процессе очистки. Во время неинтерактивного сеанса сигнал SIGINT завершит весь запуск bc.

ОГРАНИЧЕНИЯ

Ниже приведены ограничения, действующие в настоящее время для этого процессора bc. Некоторые из них могли быть изменены при установке. Используйте оператор limit, чтобы увидеть фактические значения.

BC_BASE_MAX

Максимальная база вывода в настоящее время установлена на уровне 999. Максимальная база ввода равна 16.

BC_DIM_MAX

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

BC_SCALE_MAX

Количество цифр после запятой ограничено цифрами INT_MAX. Кроме того, количество цифр до десятичной точки ограничено цифрами INT_MAX.

BC_STRING_MAX

Ограничение на количество символов в строке составляет INT_MAX символов.

exponent

Значение показателя степени в операции повышения (^) ограничено значением LONG_MAX.

variable names

Текущее ограничение на количество уникальных имен составляет 32767 для каждой из простых переменных, массивов и функций.

ПЕРЕМЕННЫЕ СРЕДЫ

Следующие переменные среды обрабатываются bc:

POSIXLY_CORRECT

Это то же самое, что и опция -s.

BC_ENV_ARGS

Это еще один механизм получения аргументов для bc. Формат такой же, как аргументы командной строки. Эти аргументы обрабатываются первыми, поэтому любые файлы, перечисленные в аргументах среды, обрабатываются перед любыми файлами аргументов командной строки. Это позволяет пользователю настроить «стандартные» параметры и файлы, которые будут обрабатываться при каждом вызове bc. Файлы в переменных среды обычно содержат определения функций, которые пользователь хочет определять при каждом запуске bc.

BC_LINE_LENGTH

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

ДИАГНОСТИКА

Если какой-либо файл в командной строке не может быть открыт, bc сообщит, что файл недоступен, и завершит работу. Кроме того, существуют средства диагностики времени компиляции и выполнения, которые не требуют пояснений.

ОШИБКИ

Исправление ошибок пока не очень хорошо.

Отправляйте отчеты об ошибках по адресу bug-bc@gnu.org. Не забудьте включить слово «bc» где-нибудь в поле «Тема:».

АВТОР

Philip A. Nelson
philnelson@acm.org

БЛАГОДАРНОСТИ

Автор хотел бы поблагодарить Стива Соммарса (Steve.Sommars@att.com) за его обширную помощь в тестировании реализации. Было дано много замечательных предложений. Это гораздо лучший продукт из-за его участия.