سؤال

منذ زملاء "؟" من اليمين إلى اليسار ، أي 2 على التوالي؟ " يجب أن يعامل المشغلون على هذا النحو ، أليس كذلك؟

الآن،

int x=-1;
int y=x?x++?x:-1:1;

أتوقع أن يتم تنفيذ ذلك على النحو التالي:

int y = x ? (x++?x:-1) : 1;

الآن منذ إعدامها من اليمين إلى اليسار ، عند مواجهة الأول؟ " في البيان ، قيمة X هي 0 والتعبير كما

int y= x? 0 : 1;

ومن ثم توقعت أن تكون y 1، ولكنها تظهر صفرًا في dev-cpp الخاص بي. أين أخطأت؟

هل كانت مفيدة؟

المحلول

لديك ترتيب التقييم خاطئ.في a ? b : c, a يتم تقييمه دائمًا أولاً، ثم أيضًا b أو c تم التقييم.

لقد قمت بترميز المثال الخاص بك حتى أتمكن من تحديد التعبيرات الفرعية:

            c
int y=x?x++?x:-1:1;
      a bbbbbbbb

(أ) يتم تقييمه، وينتج -1، لذا يتم تقييم (ب).هناك، x++ يتم تقييمها، وتنتج -1 مرة أخرى، لذلك يتم تقييم (ج).عند هذه النقطة، x هو 0.

أو، مع كود أكثر تفصيلاً وأكثر وضوحًا، يبدو الأمر كما لو أنك قلت:

int x = -1;
int y;
if (x != 0)
{
    int new_x = x + 1;
    if (x != 0)
    {
        y = new_x;
    }
    else
    {
        y = -1;
    }
}
else
{
    y = 1;
}

نصائح أخرى

العمليات: Genacodicetagpre

أتمنى أن يساعدك هذا!

الجواب على سؤالك هو أنه في C/C++ int y = x ? (x++?x:-1) : 1; سوف نصل إلى نقطتي تسلسل عند ?.أي عمليات تحديث للمتغير الموجود في نقطة تسلسل ستكون فعالة بعد انتهاء هذا التسلسل.لذلك دعونا ننظر إلى مثالنا في متناول اليد.

نقطة التسلسل الأولى هي الأولى ? من اليسار.

x=-1; (Actual Value)
x=-1; (Value used in expression)
y=-1?(x++?x:-1):1;

نقطة التسلسل الثانية هي الثانية ? من اليسار.كما ذكر أعلاه، تكون عمليات التحديث فعالة بعد التسلسل، على الرغم من ذلك x++ هل هناك القيمة المستخدمة في هذا التسلسل -1 وسيتم استخدام القيمة المحدثة في ما يلي.

x=0; (Actual Value, bcoz of x++)
x=-1; (Value used in expression)
y=-1?x:-1;

الآن سوف يكون

x=0; (Actual Value)
x=0; (Value used in expression)
y=x;
y=0;

نأمل أن يكون هذا منطقيا الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top