Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
933 Кб
Скачать
☆

11.12. Уровень 15 (оператор ',' - запятая)

Порядок:

Формат: e1[,e2]... , где e1, e2 - выражения.

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

Пример.

for(i=0, j=N-1; i<j; i++, j--){ // Одновременное изменение в одном цикле

//переменных i и j в разных направлениях

11.13. Некоторые замечания

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

2. В языке C не задан порядок вычисления операндов. При побочных эффектах результат машинно зависим. Побочным эффектом называют изменение значений аргументов функций. В выражении x=f(x, y)+g(&x, &y); при перестановке слагаемых может измениться результат.

3. Также не фиксирован порядок вычисления аргументов функций.

Пример.

printf("%d%d\n", ++n, pow(2,n)); // Результат неоднозначен

4. Не применяйте неоднозначных выражений. Чему равно, например, выражение a[i++] = i++;? Так не писать не следует!!!

11.14. Постоянные выражения

Постоянные выражения – это выражения, состоящие из литералов и символических констант. Они используются в таких конструкциях языка, как:

- многоальтернативный выбор – инструкция switch, опция case;

- границы массивов;

- директивы препроцессора.

Пример.

#define SIZE1 500

#define SIZE2 500

#define PI 3.141593

#define PI2 2*PI

……………………….

int a[SIZE1+SIZE2];

Вопросы для самопроверки и контроля Вопросы для самопроверки

1. Чему равно значение выражения sizeof(<имя_типа>)?

2. Какой тип должен иметь левый операнд оператора ->?

3. Дано: i=4; y=i++; x=++i. Чему равны значения i, y, x ?

4. Какой тип имеет результат выполнения унарного оператора &?

5. Что означают операторы = и == в языке C? Чей приоритет выше?

6. В чем отличие унарного и бинарного операторов &?

7. Какой оператор имеет 3 операнда?

Контрольные вопросы

1. Требуется сформировать массив из отрицательных элементов другого массива. Правильно ли предложенное решение?

float x[10], y[10], s; short i, k;

for(s=k=i=0; i<10; i++){

x[++k]=y[ i ]<0 ? y[ i ] : 0;

}

2. В чем отличие постфиксной и префиксной форм оператора ++?

3. Что означают операторы & и &&?

4. В чем смысл оператора "запятая"?

5. Дано: a=3; b=4; c=5; Чему равно выражение: a<b<c ?

6. Где употребляются постоянные выражения?

12. Передача данных потоком

Этот раздел посвящен дополнительным консольным средствам ввода-вывода в языке C, используемых для ввода-вывода символьной информации.

Функции scanf и printf и некоторые другие, о которых речь пойдет ниже, называют функциями передачи данных потоком. Это означает, что все данные, вводимые последовательными инструкциями scanf, образуют единый поток ввода, в котором начало и конец элемента данных определяются параметром соответствующей спецификации w или d либо специальными символами – ограничителями, внесенными в поток. Аналогично последовательность инструкций printf образует единый поток вывода. Проще всего данные каждого потока представить в виде непрерывной символьной строки.

В языке определены 3 стандартных потока обмена данных: поток ввода stdin, поток вывода stdout и поток сообщений об ошибках stderr. По умолчанию поток stdin связан с клавиатурой, потоки stdout и stderr – с экраном монитора. На самом деле поток stdin также связан с экраном, поскольку большинство функций ввода отображают каждый вводимый с клавиатуры символ на экран. Точнее эти функции вставляют отображение вводимых символов в поток stdout. Это приводит к очереди за пользование ресурсом (экраном) и иногда к конфликтным ситуациям, описанным ранее.

Замечание. Понятие потока не связано с конкретным языком программирования. Это свойство операционной системы. Количество потоков в приложении не ограничивается приведенными стандартными потоками, однако многопоточное программирование в данном курсе не рассматривается. Отметим, что рассмотренные в разделе 6 методы консольного ввода-вывода языка Basic также используют стандартные потоки: ReadLine – входной и выходной, Write и WriteLine – выходной. Отнесение данного материала к языку C связано с введением дополнительных функций для ввода-вывода строк, тогда как в языке Basic консольный обмен данных ограничим указанными 3-мя методами.