WikiDer > Kattalashtirish va kamaytirish operatorlari - Vikipediya
Bu maqola uchun qo'shimcha iqtiboslar kerak tekshirish. (2014 yil sentyabr) (Ushbu shablon xabarini qanday va qachon olib tashlashni bilib oling) |
O'sish va kamaytirish operatorlari bor unary operatorlar bu qo'shish yoki ayirmoq ulardan biri yoki ulardan operandnavbati bilan. Ular odatda amalga oshiriladi majburiy dasturlash tillari. Co'xshash tillarda har xil operatorning semantikasi bir-biridan farq qiladigan ikkita (oldingi va keyingi) versiyalari mavjud.
Sintaktik ravishda olingan tillarda B (C va uning turli xil hosilalarini o'z ichiga olgan holda), oshirish operatori quyidagicha yoziladi ++
va kamaytiruvchi operator quyidagicha yoziladi --
. Boshqa bir nechta tillar inc (x) va dec (x) funktsiyalaridan foydalanadilar.
O'sish operatori ko'payadi va kamayish operatori kamayadi, uning operandining qiymati 1 ga teng. Operand arifmetik yoki ko'rsatgich ma'lumotlar turiva o'zgartirilishi mumkin bo'lgan narsaga murojaat qilishi kerak ma'lumotlar ob'ekti. Ko'rsatkichlar qiymatlari xotirada yonma-yon joylashgan keyingi (yoki oldingi) elementga ishora qiladigan miqdorda ko'paytiriladi (yoki kamayadi).
Operatorlarning ikkala versiyasini qo'llab-quvvatlovchi tillarda:
- The oldindan- o'sish va oldindan-decrement operatorlari o'z operandlarini 1 ga ko'paytiradilar (yoki kamaytiradilar) va ifoda qiymati natijada ortib boradigan (yoki kamaytirilgan) qiymatdir.
- The post- o'sish va post-decrement operatorlari o'z operandlari qiymatini 1 ga oshiradi (yoki kamaytiradi), lekin ifoda qiymati operandning qiymatidir oldin o'sish (yoki kamaytirish) operatsiyasiga.
O'sish / kamayish ifoda bo'lmagan tillarda (masalan, Boring), faqat bitta versiya kerak (Go holatida, faqat pochta operatorlari).
O'sish / kamaytirish operatori o'z operandini o'zgartirganligi sababli, bir xil ifoda ichida bir necha bor bunday operanddan foydalanish aniqlanmagan natijalarga olib kelishi mumkin. Masalan, kabi iboralarda x - ++ x
, ayirish va orttirish operatsiyalari qanday ketma-ketlikda bajarilishi kerakligi aniq emas. Bunday iboralar odatda chaqiradi aniqlanmagan xatti-harakatlarva oldini olish kerak.
Misollar
Quyidagi C kod fragmenti o'rtasidagi farqni aks ettiradi oldindan va post o'sish va kamaytirish operatorlari:
int x;int y;// o'sish operatorlari// Oldindan o'sish: x 1 ga ko'paytiriladi, keyin y ga x qiymati beriladix = 1;y = ++x; // x endi 2, y ham 2 ga teng// Post-increment: y ga x qiymati beriladi, keyin x 1 ga ko'paytiriladix = 1;y = x++; // y 1 ga, x endi 2 ga teng// Kamaytirish operatorlari// Oldin pasayish: x 1 ga kamaytiriladi, keyin y ga x qiymati beriladix = 1;y = --x; // x endi 0, y ham 0 ga teng// Post-dekrment: y ga x qiymati beriladi, keyin x 1 ga kamaytiriladix = 1;y = x--; // y 1, x endi 0 ga teng
Ushbu operatorlarga ega bo'lmagan tillarda, teng natijalar qo'shimcha kod satrini talab qiladi:
# Oldindan oshirish: y = ++ xx = 1x = x + 1 # x endi 2 ga teng (Python-da "x + = 1" deb yozish mumkin)y = x # y ham 2 ga teng# Post-increment: y = x ++x = 1y = x # y - 1x = x + 1 # x endi 2 ga teng
Post-increment operatori odatda bilan ishlatiladi qator obunalar. Masalan:
// Massiv elementlarini jamlangsuzmoq sum_elements(suzmoq arr[], int n){ suzmoq sum = 0.0; int men = 0; esa (men < n) sum += arr[men++]; // i-ning keyingi o'sishi, qaysi qadamlar // massivning n elementi orqali qaytish sum;}
Post-increment operatori odatda bilan ishlatiladi ko'rsatgichlar:
// Bir massivni boshqasiga nusxalashbekor nusxa_array(suzmoq *src, suzmoq *dst, int n){ esa (n-- > 0) // n dan nolgacha hisoblanadigan tsikl *dst++ = *src++; // elementni * (src) dan * (dst) gacha nusxa ko'chiradi, // keyin ikkala ko'rsatkichni oshiradi}
E'tibor bering, ushbu misollar C kabi boshqa tillarda ham ishlaydi, masalan C ++, Javava C #.
- Kattalashtirish operatorini misol bilan ko'rsatish mumkin:
# shu jumladan <stdio.h>int asosiy(){ int v=2, d=2; printf("% d n", v++); // bu ibora 2 ni aks ettiradi, keyin c 1 dan 3 gacha ko'paytiriladi. printf("% d", ++v); // bu ibora c ni 1 ga oshiradi, keyin c ko'rsatiladi. qaytish 0;}
- Chiqish:
24
- Chiqish:
Qo'llab-quvvatlovchi tillar
Quyidagi ro'yxat to'liq bo'lmasa ham, hamma narsani qamrab oladigan bo'lsa-da, ba'zi bir asosiy dasturlash tillarini keltiradi ++
/--
o'sish / kamaytirish operatorlari.
|
|
|
(Olmalar Tez bir marta ushbu operatorlarni qo'llab-quvvatlagan,[10] ammo qo'llab-quvvatlash 3-versiyadan o'chirildi.)
Paskal, Delphi, Modula-2va Oberon bir xil funktsiyalarni ta'minlaydi, ammo ular inc (x) va dec (x) deb nomlanadi.
Ta'kidlash joizki Python va Zang ushbu operatorlarni qo'llab-quvvatlamaydi.
Tarix
Ushbu kontseptsiya B dasturlash tili taxminan 1969 yil Ken Tompson.[11]
Tompson o'sib boradigan yoki kamayadigan ++ va - operatorlarini ixtiro qilish bilan bir qadam oldinga bordi; ularning prefiksi yoki postfiksi holati o'zgarish operand qiymatini qayd etishdan oldin yoki keyin sodir bo'ladimi-yo'qligini aniqlaydi. Ular B ning dastlabki versiyalarida bo'lmagan, ammo yo'l davomida paydo bo'lgan. Odamlar tez-tez C va Unix birinchi marta ommalashgan DEC PDP-11 tomonidan taqdim etilgan avtomatik o'sish va avtomatik kamayish manzil rejimlaridan foydalanish uchun yaratilgan deb taxmin qilishadi. Bu tarixiy jihatdan imkonsizdir, chunki B ishlab chiqilganda PDP-11 yo'q edi. PDP-7-da bir nechta "avtomatik oshirish" xotira katakchalari mavjud bo'lib, ular orqali bilvosita xotira havolasi katakchani ko'paytirdi. Bu xususiyat, ehtimol, bunday operatorlarni Tompsonga taklif qilgan; ularni ikkala prefiks va postfiks qilish uchun umumlashtirish uning o'zi edi. Darhaqiqat, avtomatik o'sish katakchalari to'g'ridan-to'g'ri operatorlarni amalga oshirishda ishlatilmadi va yangilik uchun kuchli turtki, ehtimol uning kuzatuvidir: ++ x tarjimasi x = x + 1 dan kichikroq.
Shuningdek qarang
- Kattalashtirilgan topshiriq - uchun
+=
va-=
operatorlar - PDP-7
- PDP-11
- Voris vazifasi
Adabiyotlar
- ^ "GNU Awk foydalanuvchi qo'llanmasi". Bepul dasturiy ta'minot fondi.
- ^ "8.3. Ikkita qavslar quriladi". Linux hujjatlari loyihasi.
- ^ Ritchi, Brayan V. Kernigan; Dennis M.; Ritchi, Dennis (1988). C dasturlash tili (2. tahr., [Nachdr.] Tahr.). Englewood Cliffs, NJ: Prentice Hall. p.18. ISBN 0-13-110362-8.
- ^ "O'sish / kamaytirish operatorlari". cppreference.com.
- ^ "++ Operator (C # ma'lumotnomasi)". Microsoft Developer Network.
- ^ "Operatorning haddan tashqari yuklanishi". dlang.org.
- ^ "GP operatorlari va ularning ustuvor yo'nalishlari".
- ^ "Operatorlarni tayinlash to'g'risida".
- ^ "Wolfram tilining ramzini oshirish". Wolfram tilini hujjatlashtirish markazi.
- ^ "Asosiy operatorlar". developer.apple.com.
- ^ Ritchi, Dennis M. (Mart 1993). "C tilini rivojlantirish". ACM SIGPLAN xabarnomalari. 28 (3): 5. doi:10.1145/155360.155580.CS1 maint: ref = harv (havola)