نقاط الترابط والتسلسل في C
-
27-10-2019 - |
سؤال
منذ زملاء "؟" من اليمين إلى اليسار ، أي 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;
نأمل أن يكون هذا منطقيا الآن.