اذهب إلى المحتوى
  • 1

difference btw y++ and ++y

السؤال

نشر

السلام عليكم هذه المساله من leetcode

لا حظت انه عند وضع الزيادة قبل اسم المتغير يعطي نتائج صحيحه علي عكس اذا قمت بالزيادة بشكل طبيعي

هنا يعطي خطا ويظهر نواتج 5 5 5  اذا قمت بالاستدعاء الاتي 

/**
 * const counter = createCounter(5)
 * counter.increment(); // 6
 * counter.reset(); // 5
 * counter.decrement(); // 4
 */

ما السبب

var createCounter = function(init) {
    let present = init;
    return {
        increment:()=> present++,
        decrement:()=> present--,
        reset:()=> present = init,
    }
};

 

Recommended Posts

  • 1
نشر

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

إن y++ and ++y هما مفهومان مختلفان تماما ولنشرح معا الفرق بينهما .

إذا تم إستخدام المعامل  قبل اسم المتغير فإن هذا ما يعرف باسم pre-increment:

y = 1;
x = ++y
console.log(x);

هنا من الإسم فإن هنا إذا كان المعامل قبل المتغير فسيتم أولا زيادة المتغير y قبل أى عملية . أى هنا سيتم زيادة ال y ب قيمة 1 لتصبح 2 و من ثم يتم وضع قيمة 2 في المتغير x وبذلك يتم طباعة 2 لأن x أصبح يساوي 2.

أما إذا تم إستخدان المعامل بعد المتغير فهذا ما يعرف باسم post-increment:

y = 1;
x = y++
console.log(x);

وهنا من إسمه إذا كان المعامل بعد المتغير فسيتم أولا تنفيذ العمليات المطلوبة ومن ثم يتم الزيادة . يعني في المثال السابق هنا العملية هي وضع قيمة y في x أى يتم وضع أولا قيمة y القديمة في x وبذلك يصبح x ب 1 ومن ثم حين إنتهاء العملية يتم زيادة y بقيمة 1 . أي هنا سيتم طباعة 1 لأن x ستكون ب 1 و y ستكون ب 2 .

وكما في مثالك هنا إذا وضعت المعامل بعد present

var createCounter = function(init) {
    let present = init;
    return {
        increment:()=> present++,
        decrement:()=> present--,
        reset:()=> present = init,
    }
};

فهنا سيتم إعادة قيمة present القديمة أولا ومن ثم يتم زيادة أو إنقاص present بقيمة 1 . ولهذا تحدث المشكلة لديك .

أما في المثال التالي :

var createCounter = function(init) {
    let present = init;
    return {
        increment:()=> ++present,
        decrement:()=> --present,
        reset:()=> present = init,
    }
};

فهنا يتم أولا تطبيق المعامل أى زيادة إو إنقاص present بقيمة 1 ومن ثم إعادة القيمة الجديدة بعد الزيادة أو النقصان.

  • 0
نشر

عندما تستخدم present++ في دالة increment، تعيد الدالة القيمة الحالية ل present قبل زيادتها لذا تظهر النتيجة كما هي لذا استخدم ++present بدلا من present++ لكي تعيد القيمة بعد زيادتها كالتالي:

var createCounter = function(init) {
    let present = init;
    return {
        increment: () => ++present,
        decrement: () => --present,
        reset: () => present = init,
    };
};

هنا increment تزيد present بمقدار 1 ثم تعيد القيمة الجديدة وdecrement تقلل present بمقدار 1 ثم تعيد القيمة الجديدة وأما reset تعيد present إلى القيمة الابتدائية init.

  • 0
نشر

المشكلة في الكود هي أنك تستخدم present++ (Post-Increment) داخل الدوال وهذا يؤدي إلى إرجاع القيمة الحالية ل present قبل عمل أي زيادة، مما يجعل النتائج غير صحيحة لذا استبدل present++ ب ++present (Pre-Increment) حتى تتم الزيادة أولا ثم تعاد القيمة بحيث counter.increment() يعيد القيمة الصحيحة بعد التعديل:

var createCounter = function(init) {
    let present = init;
    return {
        increment:()=> ++present,
        decrement:()=> --present,
        reset:()=> present = init,
    }
};
  • present++: يعيد القيمة قبل التعديل.
  • ++present: يعدل القيمة ثم يعيدها.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...