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

a+5 - a != 5

بدأه مصطفى 36a2 في 10 أغسطس 2014 · 13 رد · 1,311 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

لدي متغير اسمه mv وله نوع ما , قمت بكتابة الكود التالي :

cout<<int(mv+5)-int(mv);

وهو يطبع العدد 40 , وفق قواعد اللغة الصحيحة المعرفة بشكل جيد .

فهل يمكنك معرفة السبب ؟

1
#2

اربعين منين؟ عندما اجرب الكود مع g++/clang++ يعطيني ناتج ٥. هذا هو كودي:

 

#include <iostream>

using namespace std;

int main() {
    double mv = 0;
    cout<<int(mv+5)-int(mv);
    return 0;
}
هل تستخدم مصرف مختلف؟

حان الموعد حان موعدنـا :ph34r:  جاء البطل يفرح شاشتنا
اهجم اهجم، لا تلــــــــي :ph34r:  نحن معك أجمعيـــــــــن

#3

الفكرة في نوع المتحول ;) , غير , عدل بدل , المهم أن تعطي العبارة العدد 40

#4

الان فهمت.. عاوزني اطلع نوعه ايه..

يبدو انه بسيطة. ممكن اوبيريتور اوفر لود..

حان الموعد حان موعدنـا :ph34r:  جاء البطل يفرح شاشتنا
اهجم اهجم، لا تلــــــــي :ph34r:  نحن معك أجمعيـــــــــن

#5

تعديل: بق فادح في الكود الآن اكتشفته. ساصلحه لكن الى حين ذلك اترككم مع الكود القديم كما هو للضحك:

 

 

ده ينفع؟

#include <iostream>

using namespace std;

class jongar {
    public:
        int operator= (int x) {
            return kantaro = x;
        }
        int operator+ (int x) {
            return kantaro + 40;
        }
        int operator- (int x) {
            return kantaro - x;
        }
        const operator int() {
            return kantaro;
        }
    private:
        int kantaro;
};

int main() {
    jongar mv;
    mv = 3;
    mv = mv + 5;
    cout<<int(mv+5)-int(mv);
    return 0;
}

تم تعديل هذه المشاركة بواسطة جونكر في 10 أغسطس 2014 في 21:39

حان الموعد حان موعدنـا :ph34r:  جاء البطل يفرح شاشتنا
اهجم اهجم، لا تلــــــــي :ph34r:  نحن معك أجمعيـــــــــن

#6

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

تعديل: مسحت المزيد

تعديل: غيرت الاوبيريتور =

 

#include <iostream>

using namespace std;

class jongar {
    public:
        void operator= (int x) {
            kantaro = x;
        }
        int operator+ (int x) {
            return kantaro + 40;
        }
        const operator int() {
            return kantaro;
        }
    private:
        int kantaro;
};

int main() {
    jongar mv;
    mv = 3;
    cout<<int(mv+5)-int(mv);
    return 0;
}

تم تعديل هذه المشاركة بواسطة جونكر في 10 أغسطس 2014 في 21:55

1

حان الموعد حان موعدنـا :ph34r:  جاء البطل يفرح شاشتنا
اهجم اهجم، لا تلــــــــي :ph34r:  نحن معك أجمعيـــــــــن

#7

حلك صحيح بالطبع ,

ولكن هناك حل أبسط بكثير , لا يعتمد بشكل مباشر على operator overloading ولكنه بطريقة ما كذلك , فالعملية  a+b أحياناً تصبح a+c*b  لسبب ما :) هل يمكنك معرفته ,

حلّي كان سطراً واحداً فقط وهو تعريف المتحول mv لا أكثر . سأضعه مساء اليوم إن لم تقدم حلول أخرى

#8

السلام عليكم , حمداً لله على عودة المنتدى ,

حلي للمسألة هو ما يلي :

#include <iostream>
using namespace std;

int main() {
    long long*mv;
    cout<<int(mv+5)-int(mv);
    return 0;
}

يعني : عند تعريف mvكما يلي :

    long long*mv;

فإن عملية الزيادة تصبح زيادة عناوين , وبما أن حجم long long هو 8 بايت , فالزيادة بمقدار 5 تصبح 5*8 , كما لو قمنا مثلاً بعمل mv++ فالعنوان سيزداد بمقدار 8 بدلاً من 1 (أو بمقدار sizeof نوع المتحول)

وهذه إحدى العبارات الممتعة أيضاً :

cout<<int(mv--)-int(mv);

 

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

2
#9

طيب انت قلت  ان  mv   متغير   و مع ذلك   حسب معرفتي 

long long*mv

 الا يفترض به ان يكون  مؤشر  :hmm:

 

ارجوا توضيح هذه  النقطة 

للإطلاع  على جديد  الكتب من تأليفي


 


الطريق لاحتراف تطوير المواقع   ج1 | ج2 | ج3 | ج4


 


                    4Colors | Break Out | Classic Snake | لعبة السودوكو - 2014  |  لعبة  XO                      


 


Help Dodo


 


^_^


 

#10

لا أدري بماذا أجيبك صراحةً , أنا أعتبر كل ما يمكن تعريفه متغيرات , حتى الكائنات objects  أعتبرها متغيرات , مثلاً المؤشر الذي ذكرته أنا أعتبره متغيراً نوعه (مؤشر إلى long long )

والسبب من وراء هذا الاعتبار هو ما يلي :

تعريفي للمتغير : هو كل ما يتم حفظه في الذاكرة ككتلة مستقلة(يعني له عنوان ويحجز مكاناً في الذاكرة) في وقت التشغيل , يعني باختصار : المتغير هو مكان في الذاكرة . (لا تنس أنه مفهومي الشخصي )

وهناك الكثير مما يؤكد كلامي , ويمكنني أن أعطيك مثالاً سريعاً :

template<class x>x function(x q){return q;}

كيف تقرأ تعريف التابع السابق ؟

لدينا تابع اسمه function ويأخذ وسيط (متغير) من نوع x ويعيد متغير من النوع x

إلا أن هذا النوع x يمكن أن يكون مؤشر أو مرجعاً أو كائناً أو أي شيء يمكن أن يحجز مكاناً ديناميكياً في الذاكرة

وعلى ذلك فالمؤشر بحد ثاته هو نوع المتغير

 

ما رأيك :)

#11

مشكور اخي  على التوضيح  

 

لكني  ظننت اننا مطالبون فقط بالمتغيرات  في  هذا اللغز 

 

عموما  ننتبه  لهذه النقطة في المرات القادمة

للإطلاع  على جديد  الكتب من تأليفي


 


الطريق لاحتراف تطوير المواقع   ج1 | ج2 | ج3 | ج4


 


                    4Colors | Break Out | Classic Snake | لعبة السودوكو - 2014  |  لعبة  XO                      


 


Help Dodo


 


^_^


 

#12

السلام على الجميع

قراْت اللغز

And since then I'm lost in the woods of programming

على كل.. هل اللغز له علاقة في الفيض؟ يعني مثلا بعد تحويل mv الى عدد صحيح و زيادة 5 يحصل عنّا فيض في الاعداد بحيث يتغير بشكل غير طبيعي ثم نقوم بطرح القيمة من الmv الاصلي فنحصل على اربعين بدل الحصول على رقم 5 (بالفطرة)

 

او يتم تحويل mv بشكل طبيعي الى رقم صحيح و يتم جمعه مع 5 بشكل طبيعي بدون فيض و لكن عندما نقوم نحسب الTwo's Complement للmv يحصل عنّا فيض ربما لان لا يوجد مكان في الذاكرة لرقم سلبي بهذا الحجم.

 

و انا اظن ان كل الى ذكرته خاطىء لأن الفيض يؤدي الى فروقات كبيرة بالارقام.

 

تعديل:

-----

 

حلّك رائع جدا

 اشعر بالغباء الشديد :)

تم تعديل هذه المشاركة بواسطة adam-master في 25 أغسطس 2014 في 11:20

1
#13

حل ذكي ومنشط للدماغ :pde:  لكن اظن انه ليس بورتبل لان long long ليس دائما 8 بايت لذا لو كان نوعه object كما قلت انا حينها لو دخل المنتدى هذا كائن من المريخ مع كمبيوتر غريب الا انه بالصدفة يستخدم مترجم سي بلص بلص حينها سيكون كودي الوحيد الذي سيعمل كما يب مع الكائن المريخي :tbsob:

1

حان الموعد حان موعدنـا :ph34r:  جاء البطل يفرح شاشتنا
اهجم اهجم، لا تلــــــــي :ph34r:  نحن معك أجمعيـــــــــن

#14
AGASHE كتب:

مشكور اخي  على التوضيح  

 

لكني  ظننت اننا مطالبون فقط بالمتغيرات  في  هذا اللغز 

 

عموما  ننتبه  لهذه النقطة في المرات القادمة

نعم كنا مطالبون فقط بالمتغيرات.. وهذا الذي حصل المؤشر هو متغير من نوع "مؤشر". كما ان الchar x هو متغير من نوع char

حان الموعد حان موعدنـا :ph34r:  جاء البطل يفرح شاشتنا
اهجم اهجم، لا تلــــــــي :ph34r:  نحن معك أجمعيـــــــــن