مشغل مشغل في C على وجه التحديد بادئة وزيادة postfix وانخفاض

StackOverflow https://stackoverflow.com/questions/2395423

  •  25-09-2019
  •  | 
  •  

سؤال

في C تشغيل العمليات على هذا النحو للزيادة والانخفاض والتعيين.

  2. postfix ++ and -- 
  3. prefix ++ and -- 
  16. Direct assignment = 

تم العثور على القائمة الكاملة هنا مشغلي ويكيبيديا في ج

سؤالي عندما يكون لدينا

int a, b;

b = 1;
a = b++;

printf("%d", a); // a is equal to 1

b = 1;
a = ++b;

printf("%d", a); //a is equal to 2

لماذا تساوي 1 مع B ++ عندما يجب أن يحدث مشغل زيادة Postfix قبل المهمة المباشرة؟

ولماذا يختلف مشغل زيادة البادئة عن postfix عندما يكونا قبل المهمة؟

أنا متأكد من أنني لا أفهم شيئًا مهمًا جدًا عندما يتعلق الأمر بتشغيل العمليات.

هل كانت مفيدة؟

المحلول

مشغل postfix a++ سوف الزيادة a ثم أعد القيمة الأصلية أي مشابهة لهذا:

{ temp=a; a=a+1; return temp; }

والبادئة ++a سيعود القيمة الجديدة أي

{ a=a+1; return a; }

هذا غير ذي صلة بالمشغل الأولوية.

(والزمان يحكم ما إذا كان a-b-c يساوي (a-b)-c أو a-(b-c).)

نصائح أخرى

أسبقية المشغل وربطها لا تخبرك بما يحدث قبل وماذا يحدث بعد. أسبقية/زملاء المشغل لا علاقة لها به. في C Language ، يتم تعريف العلاقات الزمنية مثل "قبل" أو "بعد" نقاط التسلسل و فقط بواسطة نقاط التسلسل (وهذه قصة منفصلة تمامًا).

أخبرك الأسبقية/الزملاء ببساطة عن المعاملات التي تنتمي إلى المشغلين. على سبيل المثال ، التعبير a = b++ يمكن تفسيرها رسميًا على أنها (a = b)++ و كما a = (b++). أسبقية/زملاء المشغل هي هذه الحالة تخبرك ببساطة أن التفسير الأخير صحيح وأن الأول غير صحيح (أي ++ ينطبق على b وليس نتيجة a = b).

هذا ، مرة أخرى ، لا يعني ذلك b يجب زيادة أولا. أسبقية/أسبقية المشغل ، مرة أخرى ، تشير إلى ما يحدث "أولاً" وما يحدث "التالي". إنه يخبرك ببساطة أن نتيجة b++ تم تعيين التعبير إلى a. بحكم التعريف ، نتيجة b++ (زيادة postfix) هي أصلي قيمة ال b. هذا هو السبب a سوف تحصل على أصلي قيمة ال b, وهو 1. عندما يكون المتغير b سوف يتم تزويدها غير ذي صلة تمامًا ، طالما a يتم تعيينه bأصلي القيمة. يُسمح للمترجم بتقييم هذا التعبير بأي ترتيب وزيادة b في أي وقت: أي شيء يذهب ، طالما a بطريقة ما يحصل على أصلي قيمة ال b (ولا أحد يهتم حقًا كيف يعمل "بطريقة ما" داخليًا).

على سبيل المثال ، يمكن للمترجم التقييم a = b++ باعتباره التسلسل التالي للعمليات الابتدائية

(1) a := b
(2) b := b + 1

أو يمكنه تقييمه على النحو التالي

(1) b := b + 1
(2) a = b - 1

لاحظ أنه في الحالة الأولى b يتم زيادة في الواقع في النهاية ، بينما في الحالة الثانية b يتم زيادة أولا. لكن في كلتا الحالتين a يحصل على نفس القيمة الصحيحة - القيمة الأصلية لـ b, وهو ما يجب أن تحصل عليه.

لكن عليّ أن أكرر أن مثالين أعلاه موجودان هنا فقط لأغراض توضيحية. في الواقع ، تعبيرات مثل a = ++b و a = b++ ليس لديك نقاط تسلسل في الداخل ، مما يعني أنه من وجهة نظرك يحدث كل شيء في هذه التعبيرات الوقت ذاته. لا يوجد "قبل" ، "بعد" ، "أولاً" ، "التالي" أو "الماضي". مثل هذه التعبيرات "ذرية" بمعنى أنها لا يمكن أن تتحلل بشكل مفيد إلى سلسلة من الخطوات الأصغر.

كما أشار Andreyt بالفعل ، لا تخبرك الأسبقية والربط عن ترتيب التقييم. يخبرونك فقط عن التجميع. على سبيل المثال ، الأسبقية هي ما يروي استخدام ذلك a*b+c تم تجميعها (a*b)+c بدلاً من a*(b+c). المترجم حر في التقييم a, b و c بأي ترتيب يرى أنه يتناسب مع أي من تلك التعبيرات. يخبرك المساعد عن التجميع عندما يكون لديك مشغلين من نفس الأسبقية ، في أغلب الأحيان ، نفس المشغلين. على سبيل المثال ، هذا ما يخبرك بذلك a-b-c يعادل (a-b)-c, ، ليس a-(b-c) (وخلاف ذلك ، يتم ترك الطرح مرتبط).

يتم تعريف ترتيب التقييم بواسطة نقاط التسلسل. هناك نقطة تسلسل في نهاية تعبير كامل (من بين أشياء أخرى). في نقطة التسلسل ، يجب أن تكون جميع التقييمات السابقة قد حدثت ، ولا يمكن أن تحدث أي من التقييمات اللاحقة بعد.

النظر إلى الأمثلة المحددة الخاصة بك ، في a=b++;, ، والنتيجة هي في الغالب من تعريف ما بعد المخلصة نفسها. تعطي ما بعد الخلايا القيمة السابقة للمتغير ، وفي وقت ما قبل نقطة التسلسل التالية ، سيتم زيادة قيمة هذا المتغير. تعطي ما قبل التجارة قيمة المتغير مع التركيب المطبقة. ومع ذلك ، في كلتا الحالتين ، هل هذا يعني أن المتغير يجب زيادة في أي ترتيب معين بالنسبة إلى المهمة. على سبيل المثال ، في مثال ما قبل الدخل ، يكون المترجم حرًا تمامًا في القيام بشيء مكافئ لـ:

temp = b+1;
a = temp;
b = b + 1;

وبالمثل ، في إصدار ما بعد الإصابة ، يمكن زيادة المتغير قبل أو بعد المهمة:

a = b;
b = b + 1;

أو:

temp = b;
b = b + 1;
a = temp;

وفي كلتا الحالتين ، ومع ذلك ، فإن القيمة المخصصة ل a يجب أن تكون قيمة b قبل زيادة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top