M. УЭИТ - Язык Си - руководство для начинающих
- Название:Язык Си - руководство для начинающих
- Автор:
- Жанр:
- Издательство:Мир
- Год:1988
- Город:Москва
- ISBN:5-03-001309-1 /русск./
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
M. УЭИТ - Язык Си - руководство для начинающих краткое содержание
Язык Си - руководство для начинающих - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Переходы в программе
Ключевые слова: break, continue, goto
Общие замечания:
Эти три команды вызывают переход от одного оператора программы к другому, расположенному в ином месте (в теле программы).
break
Команду breakможно использовать с любой из трех форм цикла и с оператором switch. Она приводит к тому, что управление программой "игнорирует" остаток цикла или оператор switch, содержащий этот остаток, и возобновляет выполнение с оператора, следующего за циклом или switch.
Пример:
switch(number) {
case 4: printf(" Хороший выбор!\n");
break;
case 5: printf("Этo неплохой выбор. \n");
break;
default: printf("Этo плохой выбор.\n");
continue
Команда continueможет использоваться с любыми тремя формами цикла, но не со switch. Она приводит к тому, что управление программой игнорирует оставшиеся операторы цикла. Для цикла whileили forначинается следующий шаг цикла. Для цикла do whileпроверяется условие выхода, а затем, если нужно, начинается следующий шаг цикла:
Пример:
while((ch = getchar( )) != EOF) {
if(ch == ' ') continue;
putchar(ch);
chcount ++; }
Этот фрагмент программы выполняет эхо-копирование и подсчет символов, не являющихся пробелами.
goto
Оператор gotoвызывает передачу управления в программе оператору, помеченному указанной меткой. Для отделения помеченного оператора от его метки используется двоеточие. Метке присваивается имя по правилам, принятым для имени переменной. Помеченный оператор может находиться до или после оператора goto.
Форма записи:goto label;
...
label : statement
Пример:
top : ch = getchar( );
if(ch != 'y') goto top;
ПРИЛОЖЕНИЕ Е. МАНИПУЛЯЦИИ РАЗРЯДАМИ: ОПЕРАЦИИ И ПОЛЯ
Для некоторых программ необходима (илн по крайней мере полезна) возможность манипулировать отдельными разрядами в байте или слове. Например, часто варианты режимов устройств ввода-вывода устанавливаются байтом, в котором каждый разряд действует как признак "включено-выключено". В языке Си есть ДВА средства, помогающие манипулировать разрядами. Во-первых, набор из шести "поразрядных" операций, выполняющихся над разрядами. Во-вторых, форма данных, называемая field(поле), дающая доступ к разрядам переменной типа int. Теперь мы кратко опишем эти характерные черты языка Си.
Операции
В языке Си предусматриваются поразрядные логические операции и операции сдвига. Далее мы будем записывать значения в двоичном коде, чтобы вы могли видеть, как выполняются операции. В реальных программах используются целые переменные или константы, записанные в обычной форме. Например, вместо (00011001) можно использовать 25 или 031, либо даже 0х19. В наших примерах будут применяться 8-разрядные числа, в которых разряды пронумерованы от 7 до 0 слева направо.
Поразрядные логические операции
Четыре операции производят действия над данными, относящимися к классу целых, включая char. Они называются "поразрядными", потому что выполняются отдельно над каждым разрядом независимо от разряда, находящегося слепа или справа.
~ : Дополнение до единицы, или поразрядное отрицание
Эта унарная операция изменяет каждую 1 на 0, а 0 на 1. Поэтому
~(10011010) == (01100101)
&: Поразрядное И
Эта бинарная операция сравнивает последовательно разряд за разрядом два операнда. Для каждого разряда результат равен 1, если только оба соответствующих разряда операндов равны 1. (В терминах "истинно-ложно" результат получается истинным, если только каждый из двух одноразрядных операндов является истинным.) Так,
(10010011) & (00111101) == (00010001)
потому что только четвертый и первый разряды обоих операндов содержат 1.
| : Поразрядное ИЛИ
Эта бинарная операция сравнивает последовательно разряд за разрядом два операнда. Для каждого разряда результат равен 1, если любой из соответствующих разрядов операндов равен 1. [В терминах "истинно-ложно" результат получается истинным, если один из двух (или оба) одноразрядных операндов является истинным.] Так,
(10010011) | (00111101) == (10111111)
потому что все разряды, кроме шестого, в одном из двух операндов имеют значение 1.
^: Поразрядное исключающее ИЛИ
Эта бинарная операция сравнивает последовательно разряд за разрядом два операнда. Для каждого разряда результат равен 1, если один нз двух (но не оба) соответствующих разрядов операндов равен 1. [В терминах "истинно-ложно" результат получается истинным, если один из двух (но не оба) одноразрядных операндов является истинным.] Поэтому
(10010011) ^ (00111101) == (10101110)
Заметим, что, поскольку нулевой разряд в обоих операндах имеет значение 1, нулевой разряд результата имеет значение 0.
Применение
Описанные выше операции часто используются для установки некоторых разрядов, причем другие разряды остаются неизменными. Например, предположим, что мы определили MASKв директиве #define MASK, равным 2, т. е. двоичному значению 00000010, имеющему ненулевое значение только в первом разряде. Тогда оператор
flags = flags & MASK;
установит все разряды flags(кроме первого) в 0, потому что любое значение разряда при выполнении операции. & дает 0, если разряд второго операнда равен 0. Однако первый разряд останется неизменным. (Если первый разряд операнда содержит 1, то результат операции 1 & 1 равен 1, а если первый разряд имеет значение 0, то 0 & 1 будет равно 0.) Аналогично оператор
flags = flags | MASK;
установит первый разряд в 1 и оставит все остальные разряды неизменными. Это происходит потому, что любое значение разряда при выполнении операции 1, если разряд второго операнда равен нулю, остается без изменения, а если разряд второго операнда равен 1, то первый разряд результата будет иметь значение 1.
Поразрядные операции сдвига
Эти операции сдвигают разряды влево или вправо. Мы снова запишем двоичные числа в явной форме, чтобы подробно показать механизм сдвига.
&& : Сдвиг влево
Эта операция сдвигает разряды левого операнда влево на число позиций, указанное правым операндом. Освобождающиеся позиции заполняются нулями, а разряды, сдвигаемые за левый предел левого операнда, теряются. Поэтому
(10001010) << 2 == 00101000
где каждый разряд сдвинулся на две позиции влево.
>> : Сдвиг вправо
Эта операция сдвигает разряды левого операнда вправо на число позиций, указанное правым операндом. Разряды, сдвигаемые за правый предел левого операнда, теряются. Для чисел типа unsigned позиции, освобождающиеся слева, заполняются нулями. Для чисел со знаком результат зависит от типа ЭВМ. Освобождающиеся позиции могут заполняться нулями или значением знакового разряда (самого левого). Для значений без знака имеем
Читать дальшеИнтервал:
Закладка: