Эта статья требует дополнительных ссылок для проверки . ( сентябрь 2014 г. ) ( Узнайте, как и когда удалить это сообщение-шаблон ) |
Операторы увеличения и уменьшения - это унарные операторы, которые добавляют или вычитают единицу к своему операнду или из него , соответственно. Обычно они реализуются в императивных языках программирования . В C- подобных языках есть две версии (до и после) каждого оператора с немного различающейся семантикой.
В языках, синтаксически производных от B (включая C и его различные производные), оператор приращения записывается как, ++
а оператор декремента - как --
. Некоторые другие языки используют функции inc (x) и dec (x).
Оператор инкремента увеличивает, а оператор декремента уменьшает значение его операнда на 1. Операнд должен иметь арифметический или указательный тип данных и должен ссылаться на изменяемый объект данных . Значения указателей увеличиваются (или уменьшаются) на величину, которая заставляет их указывать на следующий (или предыдущий) элемент, смежный в памяти.
На языках, поддерживающих обе версии операторов:
- Операторы pre -increment и pre -decrement увеличивают (или уменьшают) свой операнд на 1, а значение выражения является результирующим увеличенным (или уменьшенным) значением.
- Операторы post -increment и post -decrement увеличивают (или уменьшают) значение своего операнда на 1, но значение выражения является значением операнда до операции увеличения (или уменьшения).
В языках, где инкремент / декремент не является выражением (например, Go ), требуется только одна версия (в случае Go - только операторы post).
Поскольку оператор увеличения / уменьшения изменяет свой операнд, использование такого операнда более одного раза в одном выражении может привести к неопределенным результатам. Например, в таких выражениях, как x - ++x
, неясно, в какой последовательности должны выполняться операции вычитания и увеличения. Такие выражения обычно вызывают неопределенное поведение , и их следует избегать.
Примеры [ править ]
Следующий фрагмент кода C иллюстрирует разницу между операторами инкремента и декремента до и после :
int x ; int y ;// Операторы приращения // Предварительное приращение: x увеличивается на 1, затем y присваивается значение x x = 1 ; у = ++ х ; // x теперь 2, y тоже 2// Постинкремент: y присваивается значение x, затем x увеличивается на 1 x = 1 ; у = х ++ ; // y равно 1, x теперь равно 2// Операторы декремента // Предварительный декремент: x уменьшается на 1, затем y присваивается значение x x = 1 ; у = - х ; // x теперь 0, y тоже 0// Пост-декремент: y присваивается значение x, затем x уменьшается на 1 x = 1 ; у = х - ; // y равно 1, x теперь равно 0
На языках, в которых эти операторы отсутствуют, эквивалентные результаты требуют дополнительной строки кода:
# Предварительное приращение: y = ++ x x = 1 x = x + 1 # x теперь равно 2 (в Python может быть записано как "x + = 1") y = x # y также равно 2# Постинкремент: y = x ++ x = 1 y = x # y равно 1 x = x + 1 # x теперь равно 2
Оператор постинкремента обычно используется с индексами массива . Например:
// Суммируем элементы массива float sum_elements ( float arr [], int n ) { float sum = 0.0 ; int я = 0 ; в то время как ( я < п ) сумма + = arr [ я ++ ]; // Постинкремент i, который проходит // через n элементов массива return sum ; }
Оператор постинкремента также часто используется с указателями :
// Копируем один массив в другой void copy_array ( float * src , float * dst , int n ) { while ( n - > 0 ) // Цикл, который ведет обратный отсчет от n до нуля * dst ++ = * src ++ ; // Копирует элемент * (src) в * (dst), // затем увеличивает оба указателя на единицу }
Обратите внимание, что эти примеры также работают на других языках типа C , таких как C ++ , Java и C # .
- Оператор инкремента можно продемонстрировать на примере:
#include <stdio.h>int main () { int c = 2 ; printf ( "% d \ n " , c ++ ); // этот оператор отображает 2, затем c увеличивается с 1 до 3. printf ( "% d" , ++ c ); // этот оператор увеличивает c на 1, затем отображается c. возврат 0 ; }
- Выход:
24
- Выход:
Поддерживающие языки [ править ]
Следующий список, хотя и не полный и не исчерпывающий, перечисляет некоторые из основных языков программирования, которые поддерживают операторы ++
/ --
increment / декремент.
|
|
|
(Apple Swift когда-то поддерживала эти операторы [10], но в версии 3 поддержка была удалена).
Паскаль , Delphi , Modula-2 и Oberon предоставляют те же функции, но они называются inc (x) и dec (x).
Примечательно, что Python и Rust не поддерживают эти операторы.
История [ править ]
Эта концепция была введена в язык программирования B примерно в 1969 году Кеном Томпсоном . [11]
Томпсон пошел еще дальше, изобретя операторы ++ и -, которые увеличивают или уменьшают; их префиксная или постфиксная позиция определяет, происходит ли изменение до или после записи значения операнда. Их не было в самых ранних версиях B, но они появились в процессе. Люди часто предполагают, что они были созданы, чтобы использовать режимы автоинкремента и автоматического уменьшения адреса, предусмотренные DEC PDP-11, на которых C и Unix впервые стали популярными. Это исторически невозможно, поскольку на момент разработки B не было PDP-11. PDP-7, однако, имел несколько ячеек памяти с «автоинкрементом», со свойством, что косвенная ссылка на память через них увеличивала ячейку. Эта функция, вероятно, подсказала Томпсону такие операторы; его собственное обобщение - сделать их и префиксом, и постфиксом. Верно,ячейки с автоматическим приращением не использовались непосредственно в реализации операторов, и более сильной мотивацией для нововведения, вероятно, было его наблюдение, что перевод ++ x был меньше, чем перевод x = x + 1.
См. Также [ править ]
- Дополненная назначение - для
+=
и-=
операторов - PDP-7
- PDP-11
- Функция преемника
Ссылки [ править ]
- ^ «Руководство пользователя GNU Awk» . Фонд свободного программного обеспечения.
- ^ «8.3. Конструкция двойных скобок» . Проект документации Linux.
- ^ Ричи, Брайан В. Керниган; Деннис М .; Ричи, Деннис (1988). Язык программирования C (2-е изд., [Nachdr.] Ed.). Энглвуд Клиффс, Нью-Джерси: Prentice Hall. п. 18 . ISBN 0-13-110362-8.
- ^ «Операторы увеличения / уменьшения» . cppreference.com.
- ^ «++ Оператор (Справочник по C #)» . Сеть разработчиков Microsoft.
- ^ "Перегрузка оператора" . dlang.org.
- ^ «Операторы GP и их приоритеты» .
- ^ «Об операторах присваивания» .
- ^ "Приращение символа языка Wolfram Language" . Центр документации языка Wolfram Language.
- ^ «Основные операторы» . developer.apple.com.
- ^ Ричи, Деннис М. (март 1993). «Развитие языка Си» . Уведомления ACM SIGPLAN . 28 (3): 5. DOI : 10,1145 / 155360,155580 .CS1 maint: ref = harv ( ссылка )