سؤال

في العديد من اللغات تكون المهام قانونية في بعض الظروف.لم أفهم أبدا السبب وراء هذا.لماذا تكتب:

if (var1 = var2) {
  ...
}

بدلاً من:

var1 = var2;
if (var1) {
  ...
}
هل كانت مفيدة؟

المحلول

إنها مفيدة للحلقات أكثر من العبارات.

while( var = GetNext() )
{
  ...do something with var 
}

والتي لولا ذلك يجب أن تكون مكتوبة

var = GetNext();
while( var )
{
 ...do something
 var = GetNext();
}

نصائح أخرى

يكون ذلك أكثر فائدة إذا كنت تتصل بوظيفة:

if (n = foo())
{
    /* foo returned a non-zero value, do something with the return value */
} else {
    /* foo returned zero, do something else */
}

بالتأكيد، يمكنك فقط وضع n = foo();في بيان منفصل ثم إذا (ن)، ولكن أعتقد أن ما ورد أعلاه هو لغة قابلة للقراءة إلى حد ما.

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

if ((rc = first_check(arg1, arg2)) != 0)
{
    report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
    report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
    report error based on new rc
}
else
{
    do what you really wanted to do
}

البديل (عدم استخدام الواجب في الشرط) هو:

rc = first_check(arg1, arg2);
if (rc != 0)
{
    report error based on rc
}
else
{
    rc = second_check(arg2, arg3);
    if (rc != 0)
    {
        report error based on new rc
    }
    else
    {
        rc = third_check(arg3, arg4);
        if (rc != 0)
        {
            report error based on new rc
        }
        else
        {
            do what you really wanted to do
        }
    }
}

من خلال التحقق من الأخطاء لفترة طويلة، يمكن للبديل تشغيل RHS للصفحة بينما إصدار التعيين المشروط لا يفعل ذلك.

يمكن أن تكون عمليات التحقق من الأخطاء أيضًا "إجراءات" — first_action(), second_action(), third_action() - بالطبع، وليس مجرد الشيكات.أي أنه يمكن التحقق من خطوات العملية التي تديرها الوظيفة.(في أغلب الأحيان في الكود الذي أعمل به، تكون الوظائف على غرار عمليات التحقق من الحالة المسبقة، أو عمليات تخصيص الذاكرة اللازمة لكي تعمل الوظيفة، أو على غرار خطوط مماثلة).

قد يكون ذلك مفيدًا إذا كنت تقوم باستدعاء دالة تقوم بإرجاع البيانات للعمل عليها أو إشارة للإشارة إلى وجود خطأ (أو أنك انتهيت).

شيء مثل:

while ((c = getchar()) != EOF) {
    // process the character
}

// end of file reached...

شخصيًا، هذا مصطلح لا أحبه كثيرًا، لكن في بعض الأحيان يكون البديل أقبح.

يمكن أن تساعدك دول مجلس التعاون الخليجي على اكتشاف (باستخدام -Wall) إذا حاولت عن غير قصد استخدام مهمة كقيمة حقيقية، في حالة ما إذا كانت توصيك بالكتابة

if ((n = foo())) {
   ...
}

أي.استخدم قوسًا إضافيًا للإشارة إلى أن هذا هو ما تريده حقًا.

يكون المصطلح أكثر فائدة عند كتابة ملف while حلقة بدلا من if إفادة.ل if بيان، يمكنك تقسيمها كما تصفها.ولكن بدون هذا البناء، سيكون عليك إما أن تكرر نفسك:

c = getchar();
while (c != EOF) {
    // ...
    c = getchar();
}

أو استخدم بنية حلقة ونصف:

while (true) {
    c = getchar();
    if (c == EOF) break;
    // ...
}

أفضّل عادةً نموذج الحلقة والنصف.

الجواب القصير هو ذلك موجه نحو التعبير تسمح لغات البرمجة بتعليمات برمجية أكثر إيجازًا.إنهم لا يجبرونك على ذلك أوامر منفصلة عن الاستعلامات.

في PHP، على سبيل المثال، من المفيد تكرار نتائج قاعدة بيانات SQL:

while ($row = mysql_fetch_assoc($result)) {
    // Display row
}

هذا يبدو أفضل بكثير من:

$row = mysql_fetch_assoc($result);
while ($row) {
    // Display row
    $row = mysql_fetch_assoc($result);
}

الميزة الأخرى تأتي أثناء استخدام gdb.في الكود التالي رمز الخطأ غير معروف إذا أردنا القيام بخطوة واحدة.

while (checkstatus() != -1) {
    // process
}

بدلاً

while (true) {
    int error = checkstatus();
    if (error != -1)
        // process
    else
        //fail
}

الآن خلال خطوة واحدة يمكننا معرفة رمز الخطأ الذي تم إرجاعه من حالة التحقق ().

السبب هو :

  1. تحسين الأداء (أحيانًا)

  2. الرمز الأصغر (دائمًا)

خذ مثالا:هناك طريقة someMethod() وفي if الشرط الذي تريد التحقق مما إذا كانت قيمة الإرجاع للطريقة null.إذا لم يكن الأمر كذلك فسوف تستخدم قيمة الإرجاع مرة أخرى.

If(null != someMethod()){
    String s = someMethod();
    ......
    //Use s
}

سوف يعيق الأداء لأنك تتصل بنفس الطريقة مرتين.بدلا من ذلك استخدم:

String s;
If(null != (s = someMethod())) {
    ......
    //Use s
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top