Операторы в C
Операторы C являются подмножеством встроенных операторов C++.
Существуют три типа операторов. Унарное выражение состоит либо из унарного оператора, за которым следует операнд, либо из ключевого слова sizeof или _Alignof , за которым следует выражение. Выражением может быть либо имя переменной, либо выражение приведения типа. В последнем случае выражение должно быть заключено в круглые скобки. Бинарное выражение состоит из 2 операндов, соединенных бинарным оператором. Троичное выражение состоит из 3 операндов, соединенных оператором условного выражения.
В языке C имеются следующие унарные операторы:
| Символ | name |
|---|---|
| — ~ ! | Операторы отрицания и дополнения |
| * & | Операторы косвенного обращения и взятия адреса |
| _Alignof | Оператор выравнивания (начиная с выпуска C11) |
| sizeof | Оператор определения размера |
| + | Оператор унарного сложения |
| ++ — | Унарные операторы инкремента и декремента |
Бинарные операторы имеют левую ассоциативность, т. е. выполняются слева направо. В языке C имеются следующие бинарные операторы:
| Символ | name |
|---|---|
| * / % | Мультипликативные операторы |
| + — | Аддитивные операторы |
| >> | Операторы сдвига |
| > >= == != | Реляционные операторы |
| & | ^ | битовые операторы; |
| && || | Логические операторы |
| , | Оператор последовательного вычисления |
Базовый оператор ( :> ), который поддерживается в предыдущих версиях компилятора Microsoft C для 16-разрядных систем, описывается в кратком обзоре синтаксиса языка C.
Оператор условного выражения имеет более низкий приоритет, чем бинарные выражения, и отличается от них тем, что имеет правую ассоциативность.
К выражениям с операторами также относятся выражения присваивания, в которых используются унарные или бинарные операторы присваивания. Унарные операторы присваивания — это операторы инкремента и декремента ( ++ и — соответственно). Бинарные операторы присваивания — это оператор простого присваивания ( = ) и составные операторы присваивания. Все составные операторы присваивания состоят из другого бинарного оператора и оператора простого присваивания.
См. также
Оператор for (C)
Оператор for позволяет повторить выполнение того или иного оператора или составного оператора заданное число раз. Тело оператора for выполняется ноль или более раз, пока необязательное условие не примет значение false. Внутри оператора for можно использовать необязательные выражения для инициализации и изменения значений во время выполнения этого оператора ( for ).
Синтаксис
iteration-statement :
for ( init-expression Выбрать ; cond-expression Выбрать ; loop-expression Выбрать ) statement
Оператор for выполняется следующим образом.
- Вычисляется выражение init-expression (при его наличии). Он задает инициализацию для цикла. Нет ограничений на тип init-expression .
- Вычисляется выражение cond-expression (при его наличии). Это выражение должно иметь арифметический тип или тип указателя. Он вычисляется перед каждой итерацией. Возможны три результата.
- Если cond-expression имеет значение true (ненулевое), statement выполняется; затем loop-expression вычисляется , если имеется. После каждой итерации вычисляется выражение loop-expression . Нет ограничений на его тип. Побочные эффекты выполняются по порядку. Затем процесс начинается снова с вычисления выражения cond-expression .
- Если выражение cond-expression опущено, оно ( cond-expression ) считается истинным, и выполнение продолжается согласно описанию в предыдущем абзаце. Выполнение оператора for без аргумента cond-expression завершается только при выполнении в его теле оператора break или return либо при выполнении оператора перехода goto к оператору с меткой вне тела оператора for .
- Если выражение cond-expression имеет значение false (0), выполнение оператора for завершается и управление передается следующему оператору программы.
Выполнение оператора for также завершается при выполнении в его теле оператора break , goto или return . Оператор continue в цикле for приводит к вычислению выражения loop-expression . При выполнении инструкции break внутри for цикла loop-expression не вычисляется и не выполняется. Оператор
— это обычный способ создания бесконечного цикла, выход из которого можно выполнить только с помощью break оператора , goto или return .
Пример
В следующем примере показано использование оператора for :
// c_for.c int main() < char* line = "H e \tl\tlo World\0"; int space = 0; int tab = 0; int i; int max = strlen(line); for (i = 0; i < max; i++ ) < if ( line[i] == ' ' ) < space++; >if ( line[i] == '\t' ) < tab++; >> printf("Number of spaces: %i\n", space); printf("Number of tabs: %i\n", tab); return 0; >
Вывод
Number of spaces: 4 Number of tabs: 2
Оператор ?
Оператор ? может использоваться для замены стандартной конструкции if/else:
if (условие) выражение;
Ограничением в данном случае является использование единственного выражения как после if, так и после else.
Оператор ? называется триадным оператором, поскольку ему требуется три операнда и он имеет следующий вид:
выражение1 ? выражение2 : выражение3
где выражение1, выражение2 и выражение3 — это выражения.
Оператор ? работает следующим образом. Вычисляется выражение1. Если оно истинно, вычисляется выражение2 и вся конструкция получает вычисленное выражение. Если выражение1 ложно, вычисляется выражение3 и вся конструкция получает вычисленное выражение. Например:
у = х > 9 ? 100 : 200;
В данном примере у получает значение 100. Если бы х было меньше, чем 9, то у получило бы значение 200. Ниже приведен фрагмент программы, выполняющий такие же действия, но с использованием операторов if/else:
Использование оператора ? для замены if/else не ограничивается присваиванием. Надо помнить, что все функции (кроме объявленных как void) могут возвращать значение. Следовательно, допустимо использование одного или нескольких вызовов функции в выражениях. Когда встречается имя функции, функция соответственно выполняется для определения возвращаемого значения. Поэтому возможно выполнить одну или несколько функций, используя оператор ?, поместив их в выражения, образующие операнды. Например:
int f1 (int n) , f2(void);
/* print proper message */
t ? f1(t)+f2 () : printf («Zero Entered»);
return 0;
>
int f1 (int n)
printf(«%d «,n);
return 0;
>
int f2(void)
printf(«entered»);
return 0;
>
В данном примере, если ввести 0, вызовется функция printf() и появится сообщение «Zero Entered». Если ввести любое другое число, то выполняются функции f1() и f2(). Следует заметить, что в данном примере значение, возвращаемое оператором ?, отбрасывается. Даже если ни f1(), ни f2() не возвращают информативного значения, они не могут быть определены как возвращающие тип void, поскольку это не позволит применять их в выражении. Поэтому функции просто возвращают 0.
Используя оператор ?, возможно переписать нашу программу следующим образом:
/* программа «угадай число 5» */
int main(void)
int magic = 123; /* искомое число */
int guess;
printf(«Enter your guess: «);
scanf(«%d», &guess);
if(guess == magic)
printf(«** Right ** «);
printf(«%d is the magic number», magic);
>
else
guess > magic ? printf(«High») : printf(«Low») ;
return 0;
>
Здесь оператор ? приводит к выводу сообщения, основываясь на сравнении guess > magic.
Operator c что это
Оператор — это отдельное предложение на языке программирования, имеющее законченный смысл. На языке C++ любой оператор заканчивается символом ; (точка с запятой). При этом надо учитывать один нюанс: если в языках типа Паскаль точка с запятой — разделитель между операторами, то в C++ и других C-подобных языках — это обязательная часть оператора.
Операторы условно можно подразделить на две категории: исполняемые — с их помощью реализуется алгоритм решаемой задачи, и описательные , необходимые для определения типов пользователя и объявления объектов программы, например, переменных.
Рассмотрим подробнее исполняемые операторы.
Классификация исполняемых операторов
Исполняемые операторы также можно разбить на две группы: простые и структурированные . Как не сложно понять из названий, в структурированных операторах можно выделить части, которые сами могут выступать в качестве отдельных операторов, а простые операторы на более элементарные разложить не удастся.
К простым операторам относятся: оператор присваивания, оператор-выражение, пустой оператор, операторы перехода ( goto , continue , break , return ), вызов функции как отдельного оператора.
Структурированные операторы — это операторы ветвление ( if ), выбора ( switch ), цикла ( for , while , do ).
Теперь перейдём к рассмотрению отдельных операторов.
Оператор присваивания
Оператор присваивания — это самый употребительный оператор. Его назначение — присвоить новое значение какой-либо переменной. В C++ имеется три формы этого оператора.
1) Простой оператор присваивания записывается так:
Данный оператор работает следующим образом: вначале вычисляется выражение, записанное справа от символа операции = (равно), затем полученный результат присваивается переменной, стоящей слева от знака = . Тип результата должен совпадать с типом переменной, записанной слева, или быть к нему приводимым.
Слева от знака = может быть только переменная, справа же можно записать и константу, и переменную и вообще выражение любой сложности.
2) Множественное присваивание — в таком операторе последовательно справа налево нескольким переменным присваивается одно и то же значение, например:
Так можно сразу определить, к примеру, что в равностороннем треугольнике все стороны равны одному и тому же числу 1. Приведенный выше оператор эквивалентен последовательному выполнению трёх операторов:
Естественно, нам проще записать один оператор, а не три. Программа получается короче, более естественно смотрится текст, и работает такая конструкция немного быстрее.
3) Присваивание с одновременным выполнением какой-либо операции в общем виде записывается так:
переменная знак_операции = выражение;
и равносильно записи
переменная = переменная знак_операции выражение ;
s += 5; // 1-й вариант
делает то же самое, что и оператор
s = s + 5; // 2-й вариант
а именно: взять старое значение из переменной s , прибавить к нему число 5 и полученное значение снова записать в переменную s .
Как видим, запись 1-го варианта короче записи 2-го варианта, да и выполняется быстрее, так как в 1-м варианте адрес переменной s вычисляется 1 раз, а во 2-м варианте — дважды.
Оператор-выражение
В языке C++ любое выражение (арифметическое, логическое, и т.д.), которое заканчивается символом ; (точка с запятой), считается законченным предложением, т.е. оператором. Примеры:
1)Выполняется префиксная операция автоуменьшения:
2)Выполняется постфиксная операция автоувеличения:
3)Выполняется перегруженная операция вывода
4)Вызывается функция вывода данных на дисплей монитора (выводится текст «Test»):
5)Вычисляется сумма двух чисел, но её значение не присваивается ни какой переменной. Оператор бессмысленный, но возможный:
Пустой оператор
Пустой оператор — это оператор, который ничего не выполняет. Зачем нужен «бесполезный» оператор?
Пустой оператор используется в тех случаях, когда по синтаксису языка требуется записать какой-либо оператор, а по логике программы мы не собираемся что-либо делать. Так, пустой оператор может потребоваться в операторе ветвления, когда по какой-либо ветви ничего не требуется выполнять, так же для того, чтобы определить метку для перехода в тексте программы, а иногда — для пустого тела цикла.
Пустой оператор — это одиночный символ ; (точка с запятой), например:
Здесь первый символ ; (точка с запятой) завершает оператор присваивания, а второй символ как раз и даёт нам пустой оператор. В данной ситуации пустой оператор совсем не нужен (но и не является синтаксической ошибкой!), приведен только для пояснения. Более «разумные» примеры использования пустого оператора будут приведены позже в соответствующих темах.
Операторы перехода
Для изменения последовательного выполнения операторов используются операторы перехода. Это операторы goto , continue , break , return. Рассмотрим их подробнее.
Этот оператор позволяет сделать переход в пределах текущей функции. Переход возможен как по ходу выполнения программы, так и в обратном направлении. Пример:
Здесь Metka — это идентификатор (метка), обозначающий то место в тексте программы, куда делается переход. Такая метка не требует описания (её и нельзя описывать!), задается по общим правилам и не может совпадать ни с ключевыми словами, ни с именами объектов программы.
В языке C++ этот оператор используется редко. Необдуманное применение goto приводит к затруднению понимания текста программы. Как правило, если в тексте программы требуется использование этого оператора, то это означает слабую логику в проектировании алгоритма программы.
На мой взгляд, оператор goto есть смысл использовать только для принудительного выхода из вложенных циклов.
Данный оператор применяется для выхода из операторов циклов ( for , while , do ) или оператора выбора switch . При использовании этого оператора метки не нужны, как как управление передаётся на оператор, следующий за оператором цикла или выбора.
Вот этот оператор в программах на C++ применяется очень часто! А оператор switch вообще без break не используют. Примеры применения оператора break рассмотрим в соответствующих темах.
Позволяет передать управление в конец цикла. Применяется гораздо реже, чем оператор break . Как правило, всегда можно построить алгоритм решаемой задачи без использования оператора continue . Пример применения оператора continue рассмотрим в теме «Циклы».
Обеспечивает выход из функции. Управление передаётся оператору, следующему за вызовом функции. Примеры применения оператора return рассмотрим в темах, связанных с использованием функций.