Операции в Си.
Операции выполняются в порядке увеличения их приоритета. Основные операции перечислены в таблице.
|
Приоритет |
Операция |
Название |
Порядок выполнения |
1 |
() |
Скобки, вызов функции |
Слева направо |
|
[] |
Индекс элемента массива |
Слева направо |
||
. |
Выделение элемента структуры или Объединения |
Слева направо |
||
-> |
Выделение элемента структуры (объединения), адресуемой (го) указателем |
Слева направо |
||
2 |
! |
Логическое отрицание |
Справа налево |
|
- |
Изменение знака |
Справа налево |
||
++ |
Увеличение на единицу |
Справа налево |
||
-- |
Уменьшение на единицу |
Справа налево |
||
& |
Адрес значения переменной |
Справа налево |
||
* |
Значение по указанному адресу |
Справа налево |
||
3 |
* |
Умножение |
Слева направо |
|
/ |
Деление |
Слева направо |
||
% |
Остаток от деления |
Слева направо |
||
4 |
+ |
Сложение |
Слева направо |
|
- |
Вычитание |
Слева направо |
||
5 |
< |
Меньше |
Слева направо |
|
<= |
Меньше или равно |
Слева направо |
||
> |
Больше |
Слева направо |
||
>= |
Больше или равно |
Слева направо |
||
6 |
== |
Равно |
Слева направо |
|
!= |
Не равно |
Слева направо |
||
7 |
&& |
Логическое И |
Слева направо |
|
8 |
|| |
Логическое ИЛИ |
Слева направо |
|
9 |
?: |
Условная операция |
Слева направо |
|
14 |
= |
Присваивание |
Справа налево |
|
*= |
Умножение и присваивание |
Справа налево |
||
/= |
Деление и присваивание |
Справа налево |
||
%= |
Остаток и присваивание |
Справа налево |
||
+= |
Сложение и присваивание |
Справа налево |
||
-= |
Вычитание и присваивание |
Справа налево |
Следует подчеркнуть особенность операции деления. Эта операция дает целый результат, если оба операнда целые. Например, выражение 9/5 даст результат, равный единице. Чтобы получить действительный результат, необходимо иметь хотя бы один действительный операнд. Так, 9./5 будет равно 1.8.
Операции увеличения на единицу (инкремента) «++» и операция уменьшения на единицу (декремента) «--» имеют префиксную (++n или --n) и постфиксную (n++ или n--) формы записи. В первом случае значение операнда n сначала изменяется, а затем используется для дальнейших вычислений, во втором же случае n сначала используется, а затем изменяется. Так, например, выражение а + b++ означает «сложить а и b и увеличить значение b на единицу», а а + ++b – «увеличить значение b на единицу и сложить а и b».
Операция & применяется к идентификатору переменной, а операция * к выражению, имеющему значение адреса (указателя), так, например, a и *&a эквивалентны.
Логический тип данных в Си.
В языке Си специального логического типа нет, вместо него используются переменные целого типа. Значению "истина" соответствует любое ненулевое целое число, значению "ложь" - ноль. Например, в Си допустим такой фрагмент программы:
int b;
float s;
. . .
if (b != 0)
{
s = 1;
}
Здесь целочисленная переменная b используется в качестве условного выражения в операторе if ("если"). Если значение b отлично от нуля, то выполняется тело оператора if, т.е. переменной s присваивается значение 1; если значение b равно нулю, то тело оператора if не выполняется.
В языке С используется обычный набор операций отношений: < (меньше), <= (меньше или равно), > (больше), >= (больше или равно), == (равно) и != (не равно).
К логическим операциям относятся логическое И или логическое умножение (&&), логическое ИЛИ или логическое сложение (две вертикальные палки), исключающее ИЛИ (^) и логическое отрицание (!).
Если операнд операции отрицания равен нулю, то результат операции будет равен единице; если же значение операнда отлично от нуля, результат операции будет равен нулю.
Операция логического умножения дает значение «истинно», если оба операнда истинны, т.е. отличны от нуля; в противном случае результат операции будет равен нулю, т.е. ложен.
Логическое сложение вырабатывает значение истинно, если хотя бы один из операндов истинен и ложно в противном случае.
Операция исключающего ИЛИ дает истинное значение, если операнды имеют противоположные значения (истинно и ложно), и ложное значение, когда оба операнда одновременно ложны или истинны.
По сравнению с операциями отношения они имеют меньший приоритет. В качестве операндов могут использоваться данные любого типа.
Условный оператор.
Условный оператор позволяет выбрать и выполнить один из двух входящих в него операторов в зависимости от значения некоторого выражения.
Синтаксис условного оператора:
If (<выражение>)
<опер 1 или выраж 1>;
[else
<опер 2 или выраж 2>;]
<выражение> является любым выражением, которое приводится или может быть приведено к целочисленному значению. Если <выражение> принимает значение «истинна», т.е. отлично от нуля, то выполняется <опер 1 или выраж 1>, если же оно принимает значение «ложь», т.е. равно нулю, то выполняется <опер 2 или выраж 2>
Пример, оператор вычисляющий модуль y=|x|:
if (x<0)
y = -x;
else
y = x;
Запись без блока else называется сокращенным условным оператором. В нем, если проверяемое выражение принимает значение «ложь», то выполняется выражение следующее сразу за условным оператором.
В отличие от уже известного нам языка Паскаль, язык Си имеет следующие особенности:
Begin и end в Паскале заменяется {} в си;
Равно = в паскале и равно == в си (но не операция присваивания);
Не равно <> в Паскале и не равно != в си;
Операции and и or в паскале заменяются && и || соответствующими операциями в Си.
Тернарный условный оператор в Си.
Операция условия.
Операция условия «?» применяется для записи условного оператора выражения:
(<выражение 1>) ? <выражение 2> : <выражение 3>
Если <выражение 1> истинно (отлично от нуля), то значением всего условного выражения будет <выражение 2>. Если же <выражение 1> ложно (равно нулю), то за значение условного выражения принимается величина, вычисляемая в <выражение 3> .
Пример, оператор вычисляющий модуль y=|x|:
y = (x<0) ? –x : x;
Оператор выбора.
Если в программе необходимо выбрать один из нескольких многочисленных вариантов, то вместо вложенной конструкции if более целесообразно применять оператор-переключатель switch, имеющий следующий синтаксис:
<переключатель>=switch (<выражение>)
{
{case<const>:
{(<оператор>|<выраж>);}
[break;]}
[default:
{(<оператор>|<выраж>);}]
}
Здесь для выполнения выбирается тот оператор или выражение, константа которого совпадает со значением выражения. Как выражение, так и константы должны иметь значения целого или символьного типа.
Вариант default не обязательно должен быть последним и вообще может отсутствовать. Во втором случае, если значении выражение не соответствует ни одной из констант, то управление передается оператору, следующему за оператором switch.
Пример на случай записи одного оператора для нескольких констант (альтернатива записи через запятую для ТП):
switch (n)
case 3:;
case 4:;
case 5:
{
….
break;
}
Оператор break является своего рода остановкой выполнения условия, т.е. с помощью него мы сразу же завершаем выполнение нашего оператора выбора и дальше продолжаем выполнение программы. Но вы можете недоумевать; зачем пользоваться оператором break, когда оператор выбора и без него сам завершит свою работу. Это же даже не цикл, здесь необязательно, как бы принудительно, завершать процесс, но есть одно но. И это Но давайте рассмотрим на примере:
Int znachenie=1;
switsh(znachenie) {
case 1:
printf(“Значение 1”);
case 2:
printf(“Значение 2”);
default:
printf(“Другое значение!”);
}
По логике, да и по выше описанному материалу, на экране должно появиться сообщение: Значение 1. Но так как мы взяли и опустили оператор break, то на экране появится: Значение 1 Значение 2 Другое значение! Т.е. из-за того, что нет оператора прерывания, оператор ( функция ) выбора switch, найдя нужное значение в операторах case, далее будет выполняться все подряд. Поэтому не забывайте вставлять в противовес каждому оператору case оператор break
Циклы.
Вычислительные процессы с многократным повторением однотипных вычислений/действий для различных значений входящих величин/данных называются циклическими, повторяющиеся участки вычислений – циклами, изменяющиеся в цикле величины – переменными цикла. В зависимости от того, где происходит проверка условия продолжения или окончания цикла, циклы разделяют на: цикл с предусловием и цикл с постусловием.
Цикл с пред условием:
<цикл с пред условием>=while(<выражение>)
(|<оператор>|<выражение>|)
Цикл будет выполняться, пока <выражение> истинно. Если значение выражения равно 0(ложь), то цикл свою работу завершает.
Цикл с пост условием:
<цикл с пост условием>=do
(|<оператор>|<выражение>|);
While (<выражение>);
Отличия от ТР состоят в следующем:
ТР ТС
Как избежать зацикливания?
Тело цикла должно содержать хотя бы один оператор, влияющий на условие окончания или продолжения, иначе цикл будет продолжаться бесконечно. Условие окончание цикла должно быть в конце концов удовлетворено
Цикл с параметром:
<цикл for>=for( [<выр1>]; [<выр2>]; [<выр3>])
(|<опер>|<выр>|)
<выр1> служит для инициализации параметра цикла и вычисляется только 1 раз перед началом выполнения цикла. <выр2> определяет условие продолжение цикла. Оно выполняется перед каждым шагом цикла. Когда выражение становится ложным, цикл завершается. Если же оно истинно, то выполняется оператор тела цикла, который может быть простым или составным. <выр3> вычисляется в конце каждого выполнения тела цикла. Обычно оно применяется для коррекции значения параметра цикла.
В операторе for можно опустить одно, два или даже все выражения, однако «;» должны оставаться на месте. Это будет равносильно тому, что значение этих выражений будет всегда истинна и цикл никогда не завершится, если в теле цикла нет прерывания.
Семантика данного оператора реализуется через цикл с предусловием и представляется следующим образом:
нет
Операция запятая.
Операция «запятая» увеличивает гибкость использования оператора цикла for, позволяя включать в его спецификацию несколько инициализирующих или корректирующих выражений. Операция «запятая» объединяет два выражения в одно и гарантирует их вычисление слева на право. Например:
for (a=1,b=5; a<=6; a++,b--)
…
В этом примере первое и последнее выражения состоят из двух выражений. Эти выражения могут быть сколь угодно сложными. Применение операции «запятая» возможно и во втором логическом выражении, но за значение всего выражения будет принято только значение последнего из объединяемых выражений.
Как избежать зацикливания?
Тело цикла должно содержать хотя бы один оператор, влияющий на условие окончания или продолжения, иначе цикл будет продолжаться бесконечно. Условие окончание цикла должно быть в конце концов удовлетворено.
Потоки данных в Си.
Поток данных в программировании — абстракция, представляет собой источник ввода и/или вывода данных, обычно байтов, связанный с файлом, устройством, либо другим процессом. Потоковый ввод/вывод в C++ осуществляется с помощью потоков библиотеки C++, доступных при подключении заголовочного файла iostream.h . Поток представляет собой объект какого-либо потокового класса.
Извлечением называют операцию «>>»:
<файл-источник> >> <идентификатор>
Для ввода информации с клавиатуры (файла-источника) используется объект cin. Формат записи cin имеет следующий вид:
cin [>> <идентификатор>];
Объект cin имеет некоторые недостатки. Необходимо, чтобы данные вводились в соответствии с форматом переменных, что не всегда может быть гарантировано.
Вставкой называют операцию «<<»:
<файл-приемник> << <выражение>
Эта операция обладает свойством ассоциативности, т.е. возможно объединение в цепочку операций вставки.
Вывод информации на стандартное устройство вывода – экран (файл-приемник). Формат записи cout имеет следующий вид:
сout << <выр> [ << <выр>];
выр - это выражение, которое может быть представлено переменной, константой, выражением или комбинации всех трех типов. Простейший пример применения cout - это вывод, например, символьной строки. Надо помнить, что cout не выполняет автоматический переход на новую строку после вывода информации. Для перевода курсора на новую строку надо вставлять символ ’\n’ или манипулятор endl.
cout << ”строка \n”;
Манипуляторы. Для управления выводом информации используются манипуляторы. Манипуляторы изменяют значение некоторых переменных в объекте cout. Эти переменные называются флагами состояния. Когда объект посылает данные на экран, он проверяет эти флаги. Например манипулятор endl:
cout << ”строка”<<endl;
Манипулятор представляет собой адрес функции. Манипуляторы можно выбрать из набора стандартных(endl), либо создавать самому.
