سؤال

لقد كنت أعمل مع Java بضع سنوات، ولكن حتى وقت قريب، لم أهرب عبر هذا البناء:

int count = isHere ? getHereCount(index) : getAwayCount(index);

ربما هذا سؤال بسيط للغاية، ولكن هل يمكن لشخص ما أن يفسر ذلك؟ كيف قرأت ذلك؟ أنا متأكد من أنني أعرف كيف يعمل.

  • إذا isHere صحيح، getHereCount() يسمى،
  • إذا isHere هو زائف getAwayCount() يسمى.

صيح؟ ما هو هذا البناء يسمى؟

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

المحلول

نعم، إنه شكل اختصار من

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

يطلق عليه المشغل الشرطي. وبعد كثير من الناس (عن طريق الخطأ) المشغل القصير, ، لأنها هي المشغل الثلاثي الوحيد (ثلاث حجة) في Java، C، C ++، وربما العديد من اللغات الأخرى. لكن من الناحية النظرية هناك استطاع يكون مشغل ثغر آخر، في حين أن هناك فقط واحد المشغل الشرطي.

يتم إعطاء الاسم الرسمي في مواصفات لغة Java.:

§ 15.25 المشغل المشروط؟ في

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

لاحظ أن كلا الفرعين يجب أن يؤدي إلى طرق مع قيم العودة:

إنه خطأ في وقت الترجمة إما للتعبير الثاني أو الثالث هو الاحتجاج بطريقة فراغ.

في الواقع، من قبل قواعد التعبير عبارات (§14.8)، لا يسمح بثلاث تعبير مشروط تظهر في أي سياق حيث يمكن أن يظهر الاحتجاج بطريقة فراغ.

حتى إذا doSomething() و doSomethingElse() هي طرق الفراغ، لا يمكنك ضغط هذا:

if (someBool)
    doSomething();
else
    doSomethingElse();

في هذا:

someBool ? doSomething() : doSomethingElse();

كلمات بسيطة:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

نصائح أخرى

أجاب آخرون على هذا إلى حد معقول، ولكن في كثير من الأحيان مع اسم "مشغل Ternary".

أن تكون ساذجا أنني، أود أن أوضح أن اسم المشغل هو المشغل الشرطي أو "المشغل الشرطي؟:". إنه أ مشغل ثلاثي (به ثلاثة معاملات) ويحدث أن يكون المشغل الثلاثي الوحيد في جافا في الوقت الحالي.

ومع ذلك، و المواصة واضحة جدا أن اسمه هو المشغل المشروط أو "المشغل الشرطي؟:" أن تكون لا لبس فيه تماما. أعتقد أنه أكثر وضوحا للاتصال به بهذا الاسم، حيث يشير إلى سلوك المشغل إلى حد ما (تقييم حالة) بدلا من عدد المعاملات التي لديها.

بحسب ال الشمس جافا المواصفات, ، يطلق عليه المشغل الشرطي. انظر القسم 15.25. أنت على حق ما يفعله.

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

المشغل الشرطي هو النقابة اليمنى بشكل صحيح (مجموعاته اليمنى إلى اليسار)، بحيث أ؟ ب: ج؟ D: e؟ f: g يعني نفس الشيء؟ ب: (ج؟ د: (ه؟ : ز)).

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

المشغل الشرطي لديه ثلاثة تعبيرات المعامل؛ ب يظهر بين التعبيرات الأولى والثانية، و: يظهر بين التعبيرات الثانية والثانية.

يجب أن يكون التعبير الأول من النوع المنطقي أو المنطقي، أو يحدث خطأ في وقت الترجمة.

ليس صحيحا تماما، ليكون دقيقا:

  1. إذا ishere صحيح، نتيجة من getherecount () هو عاد
  2. OtheriWse نتيجة من getawaycount () هو عاد

أن "عاد" مهم جدا. وهذا يعني الأساليب يجب إرجاع قيمة وتلك القيمة يجب يتم تعيينها في مكان ما.

أيضا، انها ليس تماما أي ما يعادل هذا الإصدار if- آخر. علي سبيل المثال:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

إذا تم ترميزه مع IF - آخر سيؤدي دائما إلى مزيد من الأداء.

int count = isHere ? getHereCount(index) : getAwayCount(index);

يعني :

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
condition ? truth : false;

إذا كانت الحالة true ثم إرجاع المعلمة الأولى. إذا كانت الحالة false, ، إرجاع المعلمة الثانية.

ويسمى المشغل الشرطي وهو نوع من عملية ثلاثية.

ternary، مشروط؛ الطماطم، الطماطم. ما هو فعال حقا هو التهيئة المتغيرة. إذا (مثلي) أنت مولعا بتهيئة المتغيرات حيث يتم تعريفها، فإن مشغل الثغرية الشرطية (لأنه كلاهما) يسمح لك للقيام بذلك في الحالات التي توجد فيها مشروطية حول قيمتها. ملحوظ بشكل خاص في المجالات النهائية، ولكن مفيدة في أماكن أخرى، أيضا.

على سبيل المثال:

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

بدون هذا المشغل - بأي اسم - سيكون عليك إجراء الحقل غير النهائي أو كتابة وظيفة ببساطة لتهيئة ذلك. في الواقع، هذا ليس صحيحا - لا يزال من الممكن تهيئة استخدام إذا / آخر، على الأقل في Java. لكنني أجد هذا النظافة.

هذا البناء يسمى مشغل ثلاثي في علوم الكمبيوتر وتقنيات البرمجة.
و ويكيبيديا أقترح التفسير التالي:

في علوم الكمبيوتر، مشغل ثغري (أحيانا يسمى عامل التعليم العالي بشكل غير صحيح) هو مشغل يأخذ ثلاث حجج. يمكن أن تكون الحجج والنتيجة من أنواع مختلفة. تحتوي العديد من لغات البرمجة التي تستخدم بناء جملة C-Like C مشغل ثلاثي،؟:، الذي يحدد تعبيرا مشروطا.

ليس فقط في Java، يتوفر هذا بناء الجملة داخل PHP، والهدف - C أيضا.

في التالي حلقة الوصل إنه يعطي التفسير التالي، وهو أمر هادئ جيد لفهمه:

عامل مشغل Ternary يعمل على تشغيل 3 مدخلات. إنه اختصار لبيان if- آخر، وهو معروف أيضا باسم مشغل شرطي.

في بيرل / PHP يعمل على النحو التالي:
boolean_condition ? true_value : false_value

في C / C ++ يعمل كما:
logical expression ? action for true : action for false

قد يكون هذا قابل للقراءة لبعض الظروف المنطقية التي ليست معقدة للغاية وإلا فمن الأفضل استخدامها إذا كتلة أخرى مع الجمع المقصود من المنطق الشرطي.

يمكننا تبسيط إذا كتل أخرى مع هذا المشغل الثلاثي لخط بيان رمز واحد.
علي سبيل المثال:

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

قد يكون مساويا لما يلي:

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

لذلك إذا نشير إلى بيانك:

int count = isHere ? getHereCount(index) : getAwayCount(index);

في الواقع ما يعادل 100٪ لما يلي إذا كتلة أخرى:

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

هذا هو!
آمل أن يكون هذا مفيدا لشخص ما!
هتافات!

صيح. إنه مسمى ال مشغل ثلاثي. وبعد البعض يطلق عليه أيضا المشغل الشرطي.

مشغلها الثلاثي (؟ :)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.

قد تكون مهتما في اقتراح بالنسبة لبعض المشغلين الجدد الذين يشبهون المشغل الشرطي. سيمكن المشغلون الآمنين غير الآمنين رمز مثل هذا:

String s = mayBeNull?.toString() ?: "null";

سيكون من المريح بشكل خاص حيث يحدث علبة الصندوق التلقائي.

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

قد كان مختارة لمزيد من الدراسة تحت JDK 7's "عملة المشروع".

في الواقع يمكن أن يستغرق أكثر من 3 حجج. على سبيل المثال، إذا كنا نريد التحقق من الأثير، فإن الرقم إيجابي أو سلبي أو صفر يمكننا القيام بذلك:

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";

وهو أفضل من استخدام إذا، آخر إذا، آخر.

إنه المشغل الشرطي، وهو أكثر من مجرد طريقة موجزة للكتابة إذا كانت البيانات.

نظرا لأنه تعبير يعيد قيمة قيمة يمكن استخدامها كجزء من تعبيرات أخرى.

نعم، أنت صحيح. ؟: يطلق عليه عادة "المشغل الشرطي التغريري"، وغالبا ما يشار إليها باسم "مشغل Ternary" ببساطة. إنها نسخة مختارة من المعيار إذا / غير مشروط.

المشغل الشرطي الثغرية

يحدث حقا مثل هذا المشغل، ولكن يجب أخذ القارئ في الاعتبار.

يجب عليك دائما موازنة إيصال التعليمات البرمجية مع الوقت الذي يقضيه في قراءة ذلك، وفي أنه يحتوي على بعض العيوب الشديدة.

بادئ ذي بدء، هناك حالة Asker الأصلية. لقد قضى فقط في نشر ساعة حولها وقراءة الردود. كم سيكون قد اتخذت المؤلف لكتابة كل شيء؟: كإذا أم / بعد ذلك طوال حياته كلها. ليس ساعة للتأكد.

ثانيا، في Langes C-Truge، تحصل على عادة معرفة ببساطة أن الشرائح هي أول شيء في الخط. لقد لاحظت هذا عندما كنت أستخدم Ruby واتبرت عبر خطوط مثل:

callMethodWhatever(Long + Expression + with + syntax) if conditional

إذا كنت مستخدما طويلا روبي، فربما لم يكن لدي مشكلة في هذا الخط، ولكنه يأتي من C، عندما ترى "Callmethodwhaterathating" كأول شيء في السطر، تتوقع تنفيذها. The؟: أقل مخففة، ولكن لا يزال غير عادي بما فيه الكفاية لرمي القارئ قبالة.

ومع ذلك، فإن الميزة هي شعور رائع حقا في بطنيك عندما يمكنك كتابة عبارة في مساحة 1 من الخطوط 1. لا يمكن أن تنكر ذلك :) لكن بصراحة، ليس بالضرورة أكثر قابلية للقراءة بنسبة 90٪ من الناس هناك ببساطة بسبب ندرةها.

عندما تكون حقا مهمة بناء على منطقية وقيم ليس لدي مشكلة في ذلك، ولكن يمكن إساءة استخدامها بسهولة.

تعتبر التعبيرات الشرطية بأسلوب مختلف تماما، دون صريحة إذا في البيان.

بناء الجملة هو: التعبير المنطقي؟ التعبير 1: التعبير 2؛

نتيجة هذا التعبير الشرطي

التعبير 1 إذا كان التعبير المنطقي صحيحا؛

خلاف ذلك النتيجة هي التعبير 2.

افترض أنك تريد تعيين عدد أكبر من Numb1 المتغير والرقم 2 إلى Max. يمكنك ببساطة كتابة عبارة باستخدام التعبير الشرطي: Max = (Num1> Num2)؟ Num1: Num2؛

ملاحظة: الرموز؟ و: تظهر معا في تعبير مشروط. أنها تشكل مشغلا مشروطا وتسمى أيضا مشغلا ثغريا لأنه يستخدم ثلاث معاملات. هذا هو المشغل القصوى الوحيد في جافا.

استشهد من: مقدمة إلى Java Programming Edition 10 من Y. دانيال ليانغ صفحة 126 - 127

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