الشبكة العربية لمطوري الألعاب

محترف  انس مشاركة 1

السلام عليكم.

صادفة بعض الالغاز الغريبة نوعا ما و اريد كشاركتكم بها.


int i = 1;
int j = 1;



printf("%d %d\n", i++ , j+1 );
printf("%d %d\n", ++i , j++ )

ما قيمة i و j  في السطرين الاخيرين ؟ ☺

خبير مشرف مؤيد مارديني مشاركة 2

السطر الأول سيطبع 1 لـ i و 2 لـ j.
والسطر الثاني سيطبع (بعد استدعاء السطر الأول) 3 لـ i و 1 لـ j.

والقيمة النهائية لهما هي 3 لـ i و 2 لـ j.
هل هذا ما تسأل عنه؟

Moayad Mardini,
MSDN Forums Moderator

محترف  انس مشاركة 3

في الحقيقة هو مجرد لغز و ليس سؤال بحد ذاته. هل من الممكن ان  تخبرنا بسبب ظهور هذه النتيجة ؟

خبير مشرف مؤيد مارديني مشاركة 4

يمكن تفسير النتيجة السابقة بفهم ما يلي :
i++ : يزيد قيمة المتغير i بـ1 ثم يعيد القيمة الجديدة له.
++i : يعيد قيمة i القديمة ثم يزيد قيمة المتغير بـ1.
i+1 : يعيد قيمة i بعد إضافة 1 إليها دون أن يقوم بتغيير قيمته.

Moayad Mardini,
MSDN Forums Moderator

محترف  انس مشاركة 5

وفي 23 سبتمبر 2009 09:48 م، ظهر شبح ابتسامة على وجه مؤيد مارديني وهو يقول:

++i : يعيد قيمة i القديمة ثم يزيد قيمة المتغير بـ1.
لكن في الكود السابق لم يقم بنفس الدور .حيث انه اكتفى باعادة قيمة i  دون اي تغير 😄 . و في السطر التالي :


i = 7 ;

i++ 

// i = 8
اليس كذلك ؟

خبير مشرف مؤيد مارديني مشاركة 6

في حال تمرير ++i إلى تابع ما فإن القيمة القديمة هي التي تمرر إلى التابع، رغم أن قيمة المتغير تـُزاد قبل استدعاء التابع نفسه.
وأما إن قمت باستدعاء ++i بشكل مستقل فستزاد قيمة المتغير، تماماً بنفس الطريقة إن قمنا باستدعاء i++.

Moayad Mardini,
MSDN Forums Moderator

محترف  انس مشاركة 7

التفسير الذي وجدته في هذا الرابط : http://www.c-faq.com/expr/evalorder2.htm
It's true that the postincrement and postdecrement operators ++ and --
perform their operations after yielding the former value.
What's often misunderstood are the implications and
precise definition of the word ``after.'' It is not guaranteed that an increment or decrement 
is performed immediately after giving up the previous value and before any other part of the
expression is evaluated. It is merely guaranteed that the update will be performed
sometime before the expression is considered ``finished'' (before the next
``sequence point,'' in ANSI C's terminology; see question 3.8).

In the example, the compiler chose to multiply the previous value
by itself and to perform both increments later.

محترف مشرف عبد اللطيف حاجي علي مشاركة 8

أنس. التفسير الذي وجدته يحاول شرح مثال أعقد من الذي وضعته وأقل صحة. المثال يشبه التالي:

int i = 5;
printf("%d", i++*i++);
// What does this statement print?

عبد اللطيف حاجي علي
مبرمج
In|Framez

محترف  انس مشاركة 9

اذن يختلف دور المعامل : ++ و -- حسب الحالات، ام ان الاصل فيهما هو ما ذكره الاستاذ مؤيد ؟

محترف مشرف عبد اللطيف حاجي علي مشاركة 10

ما ذكره مؤيد هو الاستخدام الصحيح لهاتين العمليتين ولا يختلف تصرفهما بحسب الحالات أبداً
المثال الذي ذكرته أنا هو الاستخدام الخاطئ للعمليتين.

عبد اللطيف حاجي علي
مبرمج
In|Framez