Уровень 14 (операторы присваивания) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Уровень 14 (операторы присваивания)



Порядок: ß

Правило записи: e 1[< op >]= e 2

Здесь e 1 - переменная (простая или с индексами), которой задается значение e 2. e 2 - выражение. e 2 преобразуется к типу e 1 (если возможно). Запись < op > является необязательной и означает выполнение указанной операции над "старым" значением e 1 (в качестве второго операнда выступает e 2), а затем присваивание полученного "нового" значения переменной e 1. Допустимыми операциями являются: + - сложение, - – вычитание, * – умножение, / – деление, % – остаток, >>, << – сдвиг вправо или влево, &, ^, | – поразрядные операторы.

Пример.

a*=5; // Это эквивалентно a=a*5;

Замечание. Выражение x*=y+1 означает x=x*(y+1), а не x=x*y+1, поскольку уровень оператора *= ниже уровня оператора +.

В комбинированных операциях значение e 1 вычисляется 1 раз, т.е. выражение a[i++]*=n; эквивалентно a[i]=a[i]*n; i=i+1; (постфиксный оператор ++), а выражение a[++i]*=n; - выражению i=i+1; a[i]=a[i]*n; (префиксный оператор ++).

Оператор = может входить в состав выражения.

Пример.

while ((c= getchar ())!= EOF){// Это означает посимвольное чтение текстового

// файла до его окончания

EOF ( End Of File ) – символическая константа, означающая конец файла и определенная в файле stdio.h.

Переменная e 1 может быть указателем.

Пример.

int *x;

.......

x+=2; // Изменяет значение x на 4 байта.

Замечание. Не увлекайтесь сложными выражениями, пишите проще!

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

Порядок:à

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

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

Пример.

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

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

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

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

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

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

Пример.

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

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

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

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

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

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

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

Пример.

int a[SIZE1+SIZE2];

# define PI 3.141593

# define PI2 2*PI

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

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

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. Где употребляются постоянные выражения?

 

ПЕРЕДАЧА ДАННЫХ ПОТОКОМ

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

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

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

12.1. Спецификация "s" управляющей строки функций scanf и printf

Предназначена для ввода-вывода символьных строк. Напомним, что в языке C определены только строковые литералы, которые представляют собой последовательность символов, завершающуюся нулевым символом. В качестве переменных применяются массивы типа char. Все функции ввода строк добавляют конечный нулевой символ.

Ввод. Формат спецификации: % [w]s.

Поле ввода ограничивается параметром спецификации w либо символами пробел или перевод строки (клавиша Enter).

Пример.

%5s [Ивано]в // Будет введен текст, заключенный в [ ]

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

Вывод. Формат спецификации %[w][.d]s.

Ограничителем является конечный нулевой символ либо параметр d спецификации.

Пример. Выводимая строка имеет значение: "Привет, Коля!". На экране получим:

%s Привет, Коля!

%.6s Привет

Функции getchar и putchar

Прототип: int getchar (void); - чтение одного символа с клавиатуры.

Файл прототипа: stdio.h.

Возвращаемое значение: символ (при успешном вводе)или EOF (ошибка ввода или конец файла). Признак конца файла при вводе: символы Ctrl + z.

Прототип: int putchar (int); - вывод одного символа на экран.

Файл прототипа: stdio.h

Возвращаемое значение: символ (успех)| EOF (ошибка).

Пример.

/* Чтение строки с терминала. */

/* Возвращает указатель на строку и ее длину */

int getline(char *s, // Введенная строка

int lim){ // Ее максимальная длина

int c, // Вводимый символ

i;

fo r(i=0; i<lim && (c= getchar ())!= EOF && c!='\n'; i++){

s[ i ]=c;

}

s[ i ]='\0';

return i;

} // End getline

Функции gets и puts

Прототип: char * gets (char *); - чтение строки символов.

Файл прототипа: stdio.h.

Возвращаемое значение: указатель на введенную строку (успех) | NULL - "пустой" указатель.

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

Пример.

char string[20];

................

gets (string);

Замечание. Можно включать в строку пробелы в отличие от спецификации s функции scanf.

Прототип: int puts (char *); - вывод на экран строки символов.

Файл прототипа: stdio.h.

Возвращаемое значение: последний выведенный символ (успех) | EOF (конец файла).

Замечание. Конечный 0 не выводится. В конец строки добавляется символ перевод строки.



Поделиться:


Последнее изменение этой страницы: 2017-02-08; просмотров: 319; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.253.221 (0.028 с.)