• 0
codz

لغز بسيط

سؤال

السلام عليكم

 

الكود التالي واضح بدون شرح

#include <stdio.h>int i;int inci(){    i = i + 1;    return i;}void Show(int i1, int  i2,int  i3, int i4){    printf("%d %d %d %d \n",i1, i2, i3, i4);}int main(){  i = 0;  Show(inci(), inci(), inci(), inci());   getchar();}

السؤال لماذا النتيجة هي 4321 بدلا من 1234 ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

3 إجابة على هذا السؤال .

  • 0
السؤال لماذا النتيجة هي 4321 بدلا من 1234 ؟

الكود المكتوب ينتج unspecified behavior و ذلك لأن ترتيب الحصول على نتيجة الدالة inci يحدده المترجم، أنظر هذا المثال.

 

 

و الله ولي التوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سؤال جميل شكراً لك

يتم معالجة الوسطاء من اليمين لليسار (ملاحظة : هذا لا علاقة له بالـ calling convention وكيفية دفع الوسطاء للمكدس )

وهذا مثال

#include <stdio.h>void test(int a,int b){}int main(){    test(putchar('M'),putchar('N'));} 

بالتوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

فعلا اخ مصطفى

للتوضيح اكثر نقوم بـ disassembly للملف main.c بهذا الشكل

gcc -g -c main.cobjdump -d -M intel -S main.o > main.asm

الصورة التالية توضح العملية

 

post-280615-0-45896900-1403789856_thumb.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .