عوامل الزيادة والنقصان

عوامل الزيادة والنقصان هي عوامل أحادية تزيد أو تنقص معاملها بمقدار واحد.

توجد هذه المعاملات عادةً في لغات البرمجة الإجرائية . تتميز اللغات الشبيهة بلغة C بنسختين (قبل وبعد) لكل معامل، ولكل منهما دلالات مختلفة قليلاً.

في اللغات المشتقة نحويًا من B (بما في ذلك C ومشتقاتها المختلفة)، يُكتب عامل الزيادة على النحو التالي ++: وعامل النقصان على النحو التالي --: . وتستخدم العديد من اللغات الأخرى دالتي inc(x) و dec(x).

يزيد عامل الزيادة قيمة المعامل بمقدار 1، بينما ينقصها عامل النقصان. يجب أن يكون نوع بيانات المعامل حسابيًا أو مؤشرًا ، وأن يشير إلى كائن بيانات قابل للتعديل . تُزاد (أو تُنقص) قيم المؤشرات بمقدار يجعلها تشير إلى العنصر التالي (أو السابق) المجاور في الذاكرة.

في اللغات التي تدعم كلا إصداري المعاملات:

  • تقوم عوامل الزيادة المسبقة والنقصان المسبق بزيادة (أو إنقاص) المعامل الخاص بها بمقدار 1، وقيمة التعبير هي القيمة الناتجة بعد الزيادة (أو الإنقاص).
  • تزيد عوامل الزيادة اللاحقة والنقصان اللاحق ( أو تنقص) قيمة المعامل بمقدار 1، ولكن قيمة التعبير هي قيمة المعامل قبل عملية الزيادة (أو النقصان).

في اللغات التي لا يكون فيها الزيادة/النقصان تعبيرًا (مثل Go )، هناك حاجة إلى إصدار واحد فقط (في حالة Go، عوامل التشغيل اللاحقة فقط).

بما أن عامل الزيادة/النقصان يُعدّل مُعامله، فإن استخدام هذا المُعامل أكثر من مرة في نفس التعبير قد يُنتج نتائج غير مُحددة، وذلك بحسب لغة البرمجة. في لغة C على سبيل المثال [ 1 ] ، في تعبيرات مثل x - ++x، ليس من الواضح ما هو الترتيب الصحيح لعمليتي الطرح والزيادة. في هذه الحالة، تُؤدي هذه التعبيرات إلى سلوك غير مُحدد ، ويجب تجنبها.

في اللغات التي تستخدم المؤشرات المكتوبة، مثل لغة C، يقوم عامل الزيادة بتحريك المؤشر إلى العنصر التالي من ذلك النوع، أي بزيادة قيمة المؤشر بمقدار حجم ذلك النوع. عندما يشير مؤشر (من النوع الصحيح) إلى أي عنصر في مصفوفة، فإن الزيادة (أو النقصان) تجعل المؤشر يشير إلى العنصر "التالي" (أو "السابق") في تلك المصفوفة. وبالتالي، فإن زيادة مؤشر إلى عدد صحيح تجعله يشير إلى العدد الصحيح التالي (عادةً بزيادة قيمة المؤشر بمقدار 4)؛ [ 2 ] وزيادة مؤشر إلى بنية بحجم 106 بايت تجعله يشير إلى البنية التالية بزيادة قيمة المؤشر بمقدار 106. [ 3 ]

أمثلة

يوضح جزء الكود التالي بلغة C الفرق بين عاملي الزيادة والنقصان قبل وبعد العملية :

int x ; int y ;// عوامل الزيادة // الزيادة المسبقة: يتم زيادة x بمقدار 1، ثم يتم إسناد قيمة x إلى y. x = 1 ; y = ++ x ; // x الآن تساوي 2، وy أيضًا تساوي 2// بعد الزيادة: يتم إسناد قيمة x إلى y، ثم يتم زيادة x بمقدار 1 x = 1 ; y = x ++ ; // y = 1، x = 2// عوامل الإنقاص // الإنقاص المسبق: يتم إنقاص x بمقدار 1، ثم يتم إسناد قيمة x إلى y، x = 1 ; y = -- x ; // x الآن 0، و y أيضًا 0// بعد الإنقاص: تُسند قيمة x إلى y، ثم تُنقص قيمة x بمقدار 1 x = 1 ; y = x -- ; // y = 1، x = 0

في اللغات التي تفتقر إلى هذه المعاملات، تتطلب النتائج المكافئة سطرًا إضافيًا من التعليمات البرمجية:

الزيادة المسبقة: y = ++x x = 1 x = x + 1 x الآن تساوي 2 (يمكن كتابتها كـ "x += 1" في بايثون) y = x y تساوي 2 أيضًاالزيادة اللاحقة: ص = س++ س = 1 ص = س ص = 1 س = س + 1 س = 2

يُستخدم عامل الزيادة اللاحقة عادةً مع فهارس المصفوفات. على سبيل المثال:

// جمع عناصر مصفوفة float sum_elements ( float arr [], int n ) { float sum = 0.0 ; int i = 0 ;بينما ( i ​​< n ) sum += arr [ i ++ ]; // زيادة لاحقة لـ 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. return 0 ; }
    • الناتج:
      2 4

اللغات المدعومة

القائمة التالية، على الرغم من أنها ليست كاملة أو شاملة، إلا أنها تسرد بعض لغات البرمجة الرئيسية التي تدعم عوامل الزيادة والنقصان.

كانت لغة Swift من Apple تدعم هذه العوامل في السابق، ولكن تم إيقاف دعمها منذ الإصدار 2.2 [ 14 ] وإزالتها اعتبارًا من الإصدار 3.0. [ 15 ] [ 16 ]

تستخدم لغات البرمجة باسكال ، ودلفي ، ومودولا-2 ، وأوبرون الدوال ( inc(x)و dec(x)) بدلاً من المعاملات. أما لغة Tcl فتستخدم incrالأمر.

والجدير بالذكر أن لغات البرمجة بايثون وروبي وراست لا تدعم هذه المعاملات.

تاريخ

تم تقديم هذا المفهوم في لغة البرمجة B حوالي عام 1969 بواسطة كين تومسون . [ 17 ]

خطا تومسون خطوةً أبعد باختراعه عاملي ++ و --، اللذين يزيدان أو ينقصان قيمةً ما؛ ويحدد موضعهما قبل أو بعد إدخال قيمة المعامل ما إذا كان التغيير يحدث قبل أو بعد إدخالها. لم يكونا موجودين في الإصدارات الأولى من لغة B، بل ظهرا لاحقًا. يظن البعض أنهما صُمما لاستخدام نمطي العنونة التلقائيين للزيادة والنقصان اللذين يوفرهما جهاز DEC PDP-11، الذي اشتهرت عليه لغتا C و Unix. هذا غير منطقي تاريخيًا، إذ لم يكن جهاز PDP-11 موجودًا عند تطوير لغة B. مع ذلك، احتوى جهاز PDP-7 على عدد قليل من خلايا الذاكرة "ذاتية الزيادة"، حيث كانت خاصية زيادة قيمة الخلية عند الوصول إليها بشكل غير مباشر. ربما أوحت هذه الخاصية لتومسون بفكرة هذين العاملين؛ أما تعميمهما ليجعلهما يعملان في كل من نمطي البادئة واللاحقة فكان من ابتكاره. في الواقع، لم يتم استخدام خلايا الزيادة التلقائية بشكل مباشر في تنفيذ عوامل التشغيل، وربما كان الدافع الأقوى للابتكار هو ملاحظته أن ترجمة ++x كانت أصغر من ترجمة x=x+1.

انظر أيضاً

مراجع

  1. "ملاحظات" ، عوامل الزيادة/النقصان ، cppreference.com
  2. ريتشارد إم ريس. "فهم واستخدام مؤشرات لغة سي" . "الفصل 4. المؤشرات والمصفوفات" . دار نشر أورايلي ميديا، 2013. رقم ISBN 9781449344184
  3. ريتشارد بيترسن. "مقدمة في لغة C باستخدام لغة C++" . 2019. الشكل 12-12.
  4. "دليل مستخدم GNU Awk" . مؤسسة البرمجيات الحرة.
  5. "8.3. بنية الأقواس المزدوجة" . مشروع توثيق لينكس.
  6. ريتشي، برايان دبليو. كيرنيغان؛ دينيس م.؛ ريتشي، دينيس (1988). لغة البرمجة سي (الطبعة الثانية، [الطبعة الثانية] ). إنجلوود كليفس ، نيوجيرسي: برنتيس هول. ص 18. ISBN   0-13-110362-8.{{cite book}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط )
  7. "عوامل الزيادة/النقصان" . cppreference.com.
  8. "معامل الزيادة (مرجع لغة C#)" . شبكة مطوري مايكروسوفت. 8 أبريل 2023.
  9. "تحميل المعاملات الزائد" . dlang.org.
  10. "مشغلو عيادات الأطباء العامين وأولوياتهم" .
  11. "حول مشغلي التعيين" . 19 يناير 2024.
  12. "زيادة رمز لغة وولفرام" . مركز توثيق لغة وولفرام.
  13. "إنقاص رمز لغة وولفرام" . مركز توثيق لغة وولفرام.
  14. "الميزات الجديدة في Swift 2.2" . الموقع الرسمي لـ Swift. 30 مارس 2016.
  15. "تم إصدار Swift 3.0!" . الموقع الرسمي لـ Swift. 13 سبتمبر 2016.
  16. "إزالة عاملي الربط و " . تطور لغة سويفت .++--
  17. ريتشي، دينيس م. (مارس 1993). "تطوير لغة سي" . إشعارات ACM SIGPLAN . 28 (3): 5. doi : 10.1145/155360.155580 .