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

لغز بسيط

مغلقمُجاب
بدأه codz في 25 يونيو 2014 · 3 رد · 1,430 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

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

#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 ؟

#2

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

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

وهذا مثال

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

بالتوفيق

2 −1
#3

فعلا اخ مصطفى

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

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

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

 

post-280615-0-45896900-1403789856_thumb.

#4 أفضل إجابة
اقتباس
السؤال لماذا النتيجة هي 4321 بدلا من 1234 ؟

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

 

 

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

2 −1

مدونتي: C++ Tips and Tricks

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…