الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أخترنا لك(4) الفرق بين تأثير المؤثرات قبل وبعد المتغيرات

بدأه محمد عودة في 10 سبتمبر 2012 · 2 رد · 1,145 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

مرحبا بكم في أخترنا لك(4)

الفهرس الرئيس لــ سلسلة أخترنا لك فى سي++

أخترنا لك(4): الفرق بين تأثير المؤثرات قبل وبعد المتغيرات

++n; وتسمي prefix وقد تظهر بعد المتغير مثل n++; وتسمي postfix .

لعلك تعرف ان المؤثر السابق للمتغير prefix يقوم اولا بتغيير قيمة المتغير قبل ان تستخدم قيمة الحالية فى اي شئ آخر. مثال:

int n=0, m=0;
//اولا زيادة  المتغير m بمقدار 1 ثم تعيين قيمته  الى المتغير  n
n = ++m;
// يعرض النتيجة 1  1  
cout << n << m;

في هذا المثال فأن n تساوي 1 بعد عملية تعيين القيمة لها لاحظ ان علمية الزيادة تمت اولا على المتغير m قبل تعيين القيمة الى n. والعكس يتم هنا لاحظ المثال التالي:

int n=0, m=0;
// اولا تعيين قيم m  الى n ثم زيادة m.
n = m++; 
// النتيجة 0 1 
cout << n << m;

فى المثال السابق فأن n تساوي صفر بعد علمية التعيين لان علمية الزيادة تمت بعد تعيين قيمة m الى n.

لكي تفهم الفرق بين الموثرات السابقة على المتغير واللاحقة للمتغير بشكل افضل. تعال نري الكود الاسلمبي الناتج من عملية فك الكود السابق. لو لم تلاحظ بشكل فوري الفرق بين الاثنين بكل بساطة لاحظ اين يظهر موجة الزيادة والنقصان فى لغة الاسمبلى داخل الكود :

/*كود الاسملبي لكود سي : m=n++;*/

// تخزين قيمة n داخل المسجل ecx
mov ecx, [ebp-0x04]
// تعيين القيمة الموجودة فى  المسجل ecx الى  
mov [ebp-0x08], ecx
//زيادة قيمة n 
inc dword ptr [ebp-0x04]

//كود الاسمبلى المكافئ لــ: m=++n;

inc dword ptr [ebp-0x04] /*زيادة n*/
// تخزين قيمة n فى المسجل eax
mov eax, [ebp-0x04]
//  تعيين القيمة التى فى المسجل exc الى m
mov [ebp-0x08], eax

انت تعرف ان المؤثرات مثل -- و ++ يمكن ان تظهر قبل المتغير مثل

تم تعديل هذه المشاركة بواسطة محمد عودة في 17 سبتمبر 2012 في 09:31

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#2

كلام جميل وشرح واضح .. ولكن عندي سؤال ..

كيف يكون شكل التحميل الزائد .. عاملي الزيادة prefix و postfix . . كيف نفرق بينهما .؟كعملية .. أظن أن الإجابة أن واحدة تأخذ وسيطاً والأخرى لا تأخذ وسيط ..هل هذا صحيح

#3
مصطفى 36a2 كتب:

كلام جميل وشرح واضح .. ولكن عندي سؤال ..

كيف يكون شكل التحميل الزائد .. عاملي الزيادة prefix و postfix . . كيف نفرق بينهما .؟كعملية .. أظن أن الإجابة أن واحدة تأخذ وسيطاً والأخرى لا تأخذ وسيط ..هل هذا صحيح

نعم صحيح أخى انظر الكود التالي:

بدون وسيط

Digit& operator++(); // prefix
Digit& operator--(); // prefix

تأخذ وسيط
Digit operator++(int); // postfix
Digit operator--(int); // postfix

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

مواضيع مشابهة