 |
- сдвиг влево (<<)
- сдвиг вправо (>>)
- И (&)
- ИЛИ (|)
- исключающее ИЛИ (^)
- НЕ (~)
Они позволяют вам производить операции очень низкого уровня.
Для того, чтобы понять эффект этих операций, введите и выполните
следующую программу:
#include
main()
{
int a, b, c;
char *format1, *format2;
format1 = " %04X %s %04X = %04X\n";
format2 = " %c%04X = %04X\n";
a = 0x0FF0; b = 0xFF00;
c = a<<4; printf(format1, a, "<<", 4, c);
- 427,428 -
c = a>>4; printf(format1, a, ">>", 4, c);
c = a & b; printf(format1, a, "& ", b, c);
c = a | b; printf(format1, a, "| ", b, c);
c = a ^ b; printf(format1, a, "^ ", b, c);
c = ~a; printf(format2, `~`, a, c);
c = -a; printf(format2, `-`, a, c);
}
Опять же, попробуйте предугадать то, что будет выводить эта
программа, не запуская ее. Заметим, что спецификаторы ширины поля
выравнивают выводимые значения; спецификатор %04X указывает на
использование нулей в начале числа, на ширину поля вывода четыре
цифры и на шестнадцатиричное представление (основание 16).
Комбинированные операции
------------------------
Си позволяет использовать некоторые сокращения при написании
выражений, содержащих многочисленные операции, описанные выше
(одноместные, двуместные, приращение, уменьшение и побитовые).
Так, любое выражение вида
<переменная> = <переменная> <операция> <выражение>;
может быть заменено на
<переменная> <операция> = <выражение>;
Ниже приводятся некоторые примеры таких выражений и способы
их сокращения:
a = a + b; сокращается до a += b;
a = a - b; сокращается до a -= b;
a = a * b; сокращается до a *= b;
a = a / b; сокращается до a /= b;
a = a % b; сокращается до a %= b;
a = a << b; сокращается до a <<= b;
a = a >> b; сокращается до a >>= b;
a = a & b; сокращается до a &= b;
a = a | b; сокращается до a |= b;
a = a ^ b; сокращается до a ^= b;
- 429,430 -
Адресные операции
-----------------
Си поддерживает две специальные адресные операции: операцию
определения адреса (&) и операцию обращения по адресу(*).
Операция & возвращает адрес данной переменной; если sum яв-
ляется переменной типа int, то &sum является адресом (расположе-
ния в памяти) этой переменной. С другой стороны, если msg являет-
ся указателем на тип char, то *msg является символом, на который
указывает msg. Введите следующую программу и посмотрите, что по-
лучится.
#include
main()
{
int sum;
char *msg;
sum = 5 + 3;
msg = "Hello, thore\n";
printf(" sum = %d &sum = %p \n", sum, &sum);
printf("*msg = %c msg = %p \n", *msg, msg);
}
В первой строке печатается два значения: значение sum (8) и
адрес sum (назначаемый компилятором). Во второй строке также пе-
чатается два значения: символ, на который указывает msg (H), и
значение msg, которое является адресом этого символа (также наз-
начен компилятором).
- 431,432 -
Ввод
-----------------------------------------------------------------
В Си имеется несколько функций ввода; одни производят ввод
из файла или из входного потока, другие - с клавиатуры. Если тре-
буется детальная информация о функциях ввода Турбо Си, то читайте
о функциях ...scanf, read, а также Главу 8.
Функция scanf
-------------
Для интерактивного режима ввода, вероятно, можно использо-
вать в большинстве случаев функцию scanf. scanf это функция вво-
да, по смыслу эквивалентная printf; ее формат выглядит так:
scanf(<строка формата>,<адрес>,<адрес>,...)
В scanf используются многие из тех же спецификаторов формата
%<буква>, что и у функции printf: %d - для целых, %f - для чисел
с плавающей точкой, %s - для строк и т.д.
Однако scanf имеет одно очень важное отличие: объекты, сле-
дующие за строкой формата, должны быть адресами, а не значениями.
В программе SUM.C содержится следующий вызов:
scanf("%d %d", &a, &b);
Этот вызов сообщает программе, что она должна ожидать от вас
ввода двух десятичных (целых) чисел, разделенных пробелом; первое
будет присвоено а, а второе b. Заметим, что здесь используется
операция адреса (&) для передачи адресов а и b функции scanf.
Белое поле
----------
Промежуток между двумя командами формата %d фактически озна-
чает больше, чем просто промежуток. Он означает, что вы можете
иметь любое количество "белых полей" между значениями.
Что такое белое поле? Это любая комбинация пробелов, табуля-
ций и символов новой строки. В большинстве ситуаций компиляторы и
программы Си обычно игнорируют белое поле.
- 433,434 -
Но что же надо делать, если вы хотите разделить числа запя-
той вместо пробела? Необходимо лишь изменить строку ввода:
scanf ("%d, %d", &a, &b);
Это позволяет вам ввести значения, разделенные запятой.
Передача адреса функции scanf
-----------------------------
Что если вы хотите ввести строку? Наберите и выполните
следующую программу:
#include
main ()
{
char name[30];
printf("Как Вас зовут: ");
scanf("%s", name);
printf ("Привет, %s\n", name);
}
Поскольку name является массивом символов, значение name -
это адрес самого массива. По этой же причине перед именем name не
используется адресный оператор &, вы просто пишете scanf("%s",
name);
 |
|