Мобильное программирование в среде ОС UNIX

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

ot;горизонтальная табуляция", а активная позиция находится "на" или "за" последней определенной позицией горизонтальной табуляции.

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

    • Представление плавающих типов.

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

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

    За исключением тех случаев, когда порядок вычисления выражения зафиксирован синтаксическими правилами или указан в стандарте каким-либо другим образом (для операции вызова функции (), операций логического умножения, логического сложения, условной операции и операции перечисления выражений), порядок вычисления подвыражений и порядок возникновения побочных эффектов не уточняется. Выражение, содержащее более, чем одно вхождение одной и той же коммутативной и ассоциативной бинарной операции (*, +, &, ^, |), может свободно перегруппировываться, независимо от наличия скобок, при условии, что типы операндов или результаты от такой перегруппировки не изменятся. В переносимой программе следует избегать выражений, порядок вычисления которых существенно влияет на их значения или вырабатываемые побочные эффекты. Если же такое выражение возникает, то содержащий его оператор всегда можно разбить на эквивалентную последовательность из нескольких операторов, не содержащих подобных выражений. Например, оператор

    x=f()+g();

    можно заменить на последовательность операторов

    y=f();

    x=y+g();

    или

    y=g();

    x=f()+y;

    в зависимости от нужного порядка вызова функций f() и g().

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

    • Отведение памяти под формальные параметры.

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

    • Значение индикатора позиции файла после успешного выполнения функции ungetc для текстового потока до тех пор, пока не будут введены или уничтожены все запомненные символы.
    • Подробности о значении, запоминаемом в случае успешной работы функции fgetpos.
    • Подробности о значении, вырабатываемом для текстового потока в случае успешной работы функции ftell.
    • Порядок и взаимное расположение областей памяти, захватываемых функциями calloc, malloc и realloc.
    • Какой из двух элементов, оказавшихся равными при сравнении, возвращается функцией bsearch.
    • Порядок расстановки в отсортированном функцией qsort массиве двух элементов, оказавшихся равными при сравнении.
    • Структура календарного времени, возвращаемого функцией time.

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

    Неопределенное поведение

    Поведение не определяется для следующих ситуаций:

    • В исходной программе обнаружен символ, не входящий в требуемый набор. Исключение делается для препроцессорных лексем, символьных и строковых констант, а также примечаний.
    • Делается попытка модифицировать строковую константу.
    • Идентификаторы, которые должны обозначать одну и ту же сущность, различаются хотя бы одним символом.
    • В символьной или строковой константе обнаружена неизвестная управляющая последовательность.
    • Лексически первое описание функции или объекта данных с внешней связью не имеет файловой области видимости, а последующее описание лексически идентичного идентификатора имеет либо внутреннюю, либо внешнюю связь, что противоречит первому описанию.
    • Арифметическое преобразование дает результат, который не может быть представлен в отведенном пространстве.
    • Арифметическая операция неверна (например, деление на 0) или выдает результат, который нельзя представить в отведенном пространстве (например, переполнение или потеря значимости).
    • Число фактических параметров вызова не согласуется с числом формальных параметров функции, которая не имеет действующего в данной области видимости прототипа.
    • Типы фактических параметров вызова после расширения не согласуются с расширенными типами формальных параметров функции, которая не имеет действующего в данной области видимости прототипа и не имеет прототипа, действующего в области видимости, соответствующей области определения функции.
    • Прототип функции имеется в области видимости, соответствующей области определения функции, формальный параметр описан с типом, который изменяется в результате действия расширений типа, проводимых по умол