هو "منطقية الدائرة القصيرة" تمليها القياسية أو تستخدم في الغالب على النحو الأمثل ؟ [مكررة]

StackOverflow https://stackoverflow.com/questions/852676

سؤال

النظر في هذا

Class* p = NULL;
if( p != NULL && p->Method() == OK ){

  // stuff
}

على جميع المجمعين لقد عملت مع هذا هو آمنة تماما.أولا-هاء.الجزء الأول من التعبير منطقية سوف تقيم كاذبة, و الدعوة إلى طريقة() وبالتالي لا يكون محاولة من حيث تقييم الجزء الثاني هي زائدة عن الحاجة.

هذا لأن معظم المجمعين تحسين بعيدا تقييم الجزء الثاني أو تملي السلوك من C/C++ المعايير ؟

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

المحلول

وهذا ما يسمى منطقية الدائرة القصيرة ويعرف إلى لغات عديدة. هنا مقالة ويكيبيديا التي تصف اللغات التي لديها هذه الميزة.

والآن عليك أن تعرف الاسم الصحيح لهذه الميزة، هناك البعض SO المواد عن ذلك أيضا.

نصائح أخرى

ومكفول التعبير قطع قصيرة من هذا المعيار.

وС ++ القياسية 1998
القسم 5.14

<اقتباس فقرة>   

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

أنا لم أر ذلك ذكر بعد ذلك:

الدائرة قصيرة يضمن C++ إلا عندما && أو || مشغل الاحتجاج طاقتها.ولكن لا تفعل ذلك, لأن الأمر محير جدا.

وهذه هي ميزة تسمى الدائرة القصيرة. ويضمن هذا السلوك حسب المعيار C ++. أنا لا أعتقد أنه هو الأمثل إذا جاز التعبير لكنه أكثر بكثير من مجرد ميزة لغة.

وانها ليست الأمثل عادل، فإنه من المفيد أن تسمح لك أن تكون أكثر إيجازا.

وكما يبين المثال، فإنه يتيح لك كتابة "آمنة" بيان dereferencing في سطر واحد. خلاف ذلك، عليك أن تفعل شيئا مثل:

if (p != null) {
    if (p.getValue() == 3) {
        // do stuff
    }
}

ويبدو تافها، ولكن حاول أن الترميز في لغة لا يكون ذلك (على سبيل المثال VB6) والبدء في نضيعها بشدة.

وانها في مستويات اللغة كما تذكر إجابات أخرى، ولكن فقط لأن شيئا من هذا القبيل يجب أن تكون محددة بوضوح. أنه ربما يمكن تجميع وصولا الى رمز الأمثل هو الآثار الجانبية. في هذه الأيام، فإن C لائق أو مترجم C ++ تجميع من سطر واحد أو سطرين، البيانات equivilently

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