Из Википедии, свободной энциклопедии
  (Перенаправлено из оператора Decrement )
Перейти к навигации Перейти к поиску

Операторы увеличения и уменьшения - это унарные операторы, которые добавляют или вычитают единицу к своему операнду или из него , соответственно. Обычно они реализуются в императивных языках программирования . В 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
  • Функция преемника

Ссылки [ править ]

  1. ^ «Руководство пользователя GNU Awk» . Фонд свободного программного обеспечения.
  2. ^ «8.3. Конструкция двойных скобок» . Проект документации Linux.
  3. ^ Ричи, Брайан В. Керниган; Деннис М .; Ричи, Деннис (1988). Язык программирования C (2-е изд., [Nachdr.] Ed.). Энглвуд Клиффс, Нью-Джерси: Prentice Hall. п. 18 . ISBN 0-13-110362-8.
  4. ^ «Операторы увеличения / уменьшения» . cppreference.com.
  5. ^ «++ Оператор (Справочник по C #)» . Сеть разработчиков Microsoft.
  6. ^ "Перегрузка оператора" . dlang.org.
  7. ^ «Операторы GP и их приоритеты» .
  8. ^ «Об операторах присваивания» .
  9. ^ "Приращение символа языка Wolfram Language" . Центр документации языка Wolfram Language.
  10. ^ «Основные операторы» . developer.apple.com.
  11. ^ Ричи, Деннис М. (март 1993). «Развитие языка Си» . Уведомления ACM SIGPLAN . 28 (3): 5. DOI : 10,1145 / 155360,155580 .CS1 maint: ref = harv ( ссылка )