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

من وحي Appendix B

بدأه مصطفى 36a2 في 18 نوفمبر 2013 · 4 رد · 876 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

يقول حكما ء الـ++C دوماً :
عليكم بوثائق اللغة ..
وعملاً بنصيحة الـC++ers :) فيجب أن تقرأ من وثائق اللغة كلما واجهتك مشكلة .. وعندما تألف هذه الوثائق اقرأها من البداية للنهاية .. وستكتشف أنك لم تكن تعلم شيئاً :)
في هذه المشاركة أرغب في مشاركة بعض المعلومات التي قرأتها , بهدف فتح شهية السنافر لأكل التوت
لن أعلق على الأكواد .. وسأترك لكم اكتشافها ..(أو العودة للوثائق)
اقرأ الكود التالي بعناية .. ثم توقّع المخرجات

int main()
{
#define iF(a)    if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)
#define If(a)    iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)
#define IF(a)    If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)
    int a=0;
    IF(a)
        printf("Finally O.K.\n");
    return 0;
}
أو هذا:
int main()
{
#define if(a)   while(a)
#define iF(a)    if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)
#define If(a)    iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)
#define IF(a)    If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)
    int a=0;
    IF(a)
        printf("Infinite!\n");
    return 0;
}
وهذا من نفس المبدأ
int main()
{
#define _ [1][1][1][1][1][1][1][1][1][1][1][1][1][1]
#define __ _ _ _ _ _ _ _ _ _ _
#define ___ __ __ __ __ __ __ __ __ __
    int a ___={0x36a2};
}
هل سمعت من من قبل بالدالة atexit ؟ ماذا تتوقع من الكود التالي
#include<cstdio>
void p()
{
    printf("First!");
}
int main()
{
    atexit(p);
    printf("Last!\n");
}

اقرأ الوثائق :)
بالتوفيق
1
#2
مصطفى 36a2 كتب:

 

 بهدف فتح شهية السنافر لأكل التوت

 

هل قلت سنافر ..  :D  :D  :D  :D  ... 

شكرا على الأكواد .. فهمي ممتعة .. و فهمت كيف تعمل .. لن أحرق الموضوع و اترك  للأعضاء المشاركة ..

بالمناسبة ما رأيكم بناتج : 

 #include <stdio.h>
  int main()
  {
	printf("%d\n" , (!0==!0&!0==!0&!0==!0));
  }

 حاول الاجابة قبل تجريب الكود ..

تم تعديل هذه المشاركة بواسطة حسام الشامي في 18 نوفمبر 2013 في 23:46

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3
اقتباس

(!0==!0&!0==!0&!0==!0)

 

عند إستخدام المعامل logical not على قيمه رقميه فإنه يتم تحويل هذه القيمه إلى true او false بحث الصقفر يصبح false و غير ذلك يصبح true و بالتالي:

!0: true!0==!0: true(true&true&true)

المعامل bitwise and يطبق على integers و بالتالي سيتم تحويل قيمة true إلى واحد و قيمة false إلى صفر لتصبح:

(1 & 1 & 1) = 1

و الكود يكون:

#include <stdio.h>int main(){    printf("%d\n" , 1);}

و النتيجة:

1

هذه الأكواد تذكرني بلعبة spider's web!!

 

 

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

تم تعديل هذه المشاركة بواسطة C++er في 19 نوفمبر 2013 في 02:46

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

#4

@C++er 

تماما .. بالضبط ... الحل و الشرح صحيحان .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5

عدت إلى الموضوع بالصدفة ..

وأرغب في شرح الأفكار خلف كل واحد من الأكواد لمن لا يعرف الجواب الصحيح ..

int main()
{
#define iF(a)    if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)
#define If(a)    iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)
#define IF(a)    If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)
    int a=0;
    IF(a)
        printf("Finally O.K.\n");
    return 0;
}

في الكود السابق سيتم استبدال الـ IF الموجودة في الكود بـ 10 If (حسب الماكرو ) والتي سيتم استبدال كل واحدة منها بـ 10 iF فيكون الحاصل 100 ثم يتم استبدال كل واحدة منها بـ if العادية المعروفة

ورغم أن الكود بسيط جداً والمفترض ألا يشكل اي مشكلة في وقت التشغيل run time  وذلك لأن a=0

إلا أنه في وقت المعالجة compile time سيجد المصرّف 1000 if متداخلة وسينفجر :) ويخرج خطاً if-statements nested too deeply أو شيئاً كهذا ..

وثائق اللغة تحدد فقط أقل عدد مسموح للمترجم أن يسمح به .. أما العدد الأعظمي فهو متروك لصانع المترجم

يقوم مترجم Visual بإصدار الخطأ المذكور للكود السابق ( طبعاً نحتاج إلى include مكتبة stdio.h

ولكن gcc ليس لديه مشكلة معه .. فالعدد الذي يسمح به أكبر من 1000 ولكن كوداً مثل

هذا

#include<stdio.h>
int main()
{
#define if3(a)    if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)
#define if2(a)    if3(a)if3(a)if3(a)if3(a)if3(a)if3(a)if3(a)if3(a)if3(a)if3(a)
#define iF(a)    if2(a)if2(a)if2(a)if2(a)if2(a)if2(a)if2(a)if2(a)if2(a)if2(a)
#define If(a)    iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)
#define IF(a)    If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)
    int a=0;
    IF(a)
        printf("Finally O.K.\n");
    return 0;
}

سيظهر ضعف gcc حيث أنه سيتوقف عن العمل بشكل غير نظامي !! (جربوه )

 

 

الكود الثاني

int main()
{
#define if(a)   while(a)
#define iF(a)    if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)if(a)
#define If(a)    iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)iF(a)
#define IF(a)    If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)If(a)
    int a=0;
    IF(a)
        printf("Infinite!\n");
    return 0;
}

يظهر عدداً كبيراً من حلقات while متداخلة ( أيضاً يصدر خطاً nested too deeply في الvisual )

 

أما هذا الكود

int main()
{
#define _ [1][1][1][1][1][1][1][1][1][1][1][1][1][1]
#define __ _ _ _ _ _ _ _ _ _ _
#define ___ __ __ __ __ __ __ __ __ __
    int a ___={0x36a2};
}

فيظهر مصفوفة من 1000 بُعد ( وليس ألف عنصر )

مثلاً المصفوفة a[2][3];l من بعدين

لتقريب الصورة

الكود السابق سيتحول إلى

int a [1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1] ..... [1][1][1][1][1][1][1][1][1][1][1][1][1][1]={0x36a2};

ورغم أن المصفوفة الألفية لا تحوي إلا على عنصر واحد , إلا أن المصرّف لم يعد بإمكانه متابعة تصريف العبارة .

 

بالنسبة للدالة atexit فهي فريدة وغريبة !

نمرر لها وسيطاً (دالة لا تأخذ وسطاء وتعيد void) فتقوم بوضعا في stack  خاصة ..

وعند انتهاء البرنامج يتم اخراج كل الدوال المخزنة في الـstack وتنفيذها .. !

مثال :

#include<stdio.h>
void x0(){puts("0");}
void x1(){puts("1");}
void x2(){puts("2");}
void x3(){puts("3");}
int main()
{
    atexit(x0);
    atexit(x1);
    atexit(x2);
    atexit(x3);
    return 0;
}

 

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

1

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