Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
62
Добавлен:
02.05.2014
Размер:
543.23 Кб
Скачать

1.2 Оператор Break

Оператор

break ;

вызывает завершение выполнения наименьшего охватывающего оператора while, do, for или switch; управление передается на оператор, следующий за завершенным.

1.3 Оператор Continue

Оператор

continue ;

вызывает передачу управления на управляющую продолжением цикла часть наименьшего охватывающего оператора while, do или for; то есть на конец петли цикла. Точнее, в каждом из опера­торов

while (...) (* do (* for (...) (*

... ... ...

contin: ; contin: ; contin: ;

*) *) while (...); *)

continue эквивалентно goto contin.

2. Ввод-вывод текстового файла: getc( ), putc( )

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

char ch;

ch=getchar( );

предназначена для получения символа от стандартного ввода, а

ch=getc(in);

- для получения символа от файла, на который указывает in.

putchar(ch);

выводит символ на стандартный файл вывода.

putc(ch,t);

предназначена для записи символа ch в файл, на который ссылается указатель t типа FILE.

Билет 18

1. 1Операторы Выражения

Самый обычный вид оператора - выражение;. Он состоит из выражения, за которым следует точка с запятой. Например:

a = b*3+c;

cout << "go go go";

lseek(fd,0,2);

1.2 Пустой оператор

Простейшей формой оператора является оператор:

;

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

1.3 Блоки

Блок - это возможно пустой список операторов, заключен­ный в фигурные скобки:

(* a=b+2; b++; *)

Блок позволяет рассматривать несколько операторов как один. Область видимости имени, описанного в блоке, простира­ется до конца блока. Имя можно сделать невидимым с помощью описаний такого же имени во внутренних блоках.

2. Ссылки

К сожалению, последняя версия ostream содержит серьезную ошибку и к тому же очень неэффективна. Сложность состоит в том, что ostream копируется дважды при каждом использовании <<: один раз как параметр и один раз как возвращаемое значе­ние. Это оставляет state неизмененным после каждого вызова. Необходима возможность передачи указателя на ostream вместо передачи самого ostream.

Это можно сделать с помощью ссылок. Ссылка действует как имя для объекта. T& означает ссылку на T. Ссылка должна быть инициализирована, и она становится другим именем того объек­та, которым она инициализирована. Например:

ostream& s1 = my_out;

ostream& s2 = cout;

Теперь можно использовать ссылку s1 и my_out одинаково, и они будут иметь одинаковые значения. Например, присваивание

s1 = s2;

копирует объект, на который ссылается s2 (то есть, cout), в объект, на который ссылается s1 (то есть, my_out). Члены берутся с помощью операции точка

s1.put("не надо использовать ->");

а если применить операцию взятия адреса, то вы получите адрес объекта, на который ссылается ссылка:

&s1 == &my_out

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

ostream& operator<<(ostream& s, complex z) (*

return s << "(" << z.real << "," << z.imag << ")";

*)

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

Ссылки также существенны для определения потока ввода, поскольку операция ввода получает в качестве операнда пере­менную для считывания. Если бы ссылки не использовались, то пользователь должен был бы явно передавать указатели в функ­ции ввода.

class istream (*

//...

int state;

public:

istream& operator>>(char&);

istream& operator>>(char*);

istream& operator>>(int&);

istream& operator>>(long&);

//...

*);

Заметьте, что для чтения long и int используются разные функции, тогда как для их печати требовалась только одна. Это вполне обычно, и причина в том, что int может быть преобразо­вано в long по стандартным правилам неявного преобразования (#с.6.6), избавляя таким образом программиста от беспокойства по поводу написания обеих функций ввода.

Соседние файлы в папке Програмки на C++