سؤال

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

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

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

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

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

 

1

شارك هذا الرد


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

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

  • 0

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

 

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

شارك هذا الرد


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

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

0

شارك هذا الرد


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

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

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

0

شارك هذا الرد


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

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

 

 

ده ينفع؟

#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;}
تم تعديل بواسطه جونكر
0

شارك هذا الرد


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

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

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

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

 

#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;}
تم تعديل بواسطه جونكر
1

شارك هذا الرد


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

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

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

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

0

شارك هذا الرد


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

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

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

#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

شارك هذا الرد


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

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

long long*mv

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

 

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

0

شارك هذا الرد


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

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

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

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

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

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

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

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

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

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

 

ما رأيك :)

0

شارك هذا الرد


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

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

 

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

 

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

0

شارك هذا الرد


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

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

قراْت اللغز

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

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

 

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

 

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

 

تعديل:

-----

 

حلّك رائع جدا

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

تم تعديل بواسطه adam-master
1

شارك هذا الرد


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

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

1

شارك هذا الرد


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

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

 

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

 

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

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

0

شارك هذا الرد


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

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

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

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