C6291

تحذير C6291: تمثل عملية تشغيل النتيجة المنطقية: ! له الأسبقية عن |. استخدم | | أو (!(x | y)) بدلاً من ذلك

!محصول عامل منطقي النتيجة، و |(تمثل-أو) يأخذ عامل تشغيل حسابي الوسيطتين. !عامل أيضا الأسبقية أكبر |.

ولذلك، واحد الأخطاء التالية قد تم الكشف عن:

  • تعبير هو mis-parenthesised:

    لأن النتيجة !هو قيمة منطقية (صفر أو واحد)، محاولة إلى فقط سوف تنتهي اختبار المتغيرات الثاني تم تعيين بت الاختبار وجود البت الأقل في جانب أيمن: ((!x) | y) != (!(x | y))عندx == 0وy == 1.

  • !العامل هو غير صحيحة، ويجب أن يكون ~بدلاً من ذلك:

    !عامل التشغيل قد تكون نتيجة قيمة منطقية، ولكن ~عامل تشغيل يحتوي على النتائج الحسابية. هذه العوامل عدم interchangeable، حتى عندما تعمل تشغيل القيمة منطقية (صفر أو واحد): ((!x) | y) != ((~x) | y)عندx == 1وy == 0.

  • عامل تشغيل ثنائي | هو غير صحيحة، وبدلاً من ذلك يجب ||:

    حتى بالرغم من ذلك | يمكن في بعض الأحيان interchanged مع ||، هو لا يعادل لأن ذلك يفرض على تقييم ل جانب أيمن للتعبير. معينة-الآثار الجانبية في هذا نوع تعبير يمكن أن تكون المحطة الطرفية: (!p | (*p == '\0'))، وعندماp == NULL، فإننا يجب أن عدم مرجعية إلى تقييم الآخر نصف التعبير.

Th هو تحذير هو إذا لم تم الإبلاغ عنها ! operator is on the right side of the | عامل التشغيل لأن th هو الحالة هو الحالة ضارة نسبيا عادة فقط من عامل تشغيل غير صحيح.

هو صعوبة في الحكم خطورة th هو المشاكل بدون فحص تعليمات برمجية. التعليمات البرمجية يجب فحصه للتأكد من أن الاختبار المعني هو التي تحدث.

وهذا تحذير دائماً يشير إلى الارتباك المحتمل في استخدم عامل التشغيل أو أسبقية المعامل الرياضي.

مثال

يلي تعليمات برمجية ينشئ هذا التحذير:

void f(int x, int y )
{
  if (!x | y)
  {
    //code 
  }
}

لتصحيح هذا التحذير، استخدم إحدى الطرق هو موضح في التعليمة البرمجية التالية:

void fC(int x, int y )
{
  /* When checking whether any bits are set in either x or y. */
  if (!(x | y))
  {
    // code
  }
  /* When checking whether bits are set in either */
  /* the complement of x or in y. */
  if ((~x) | y)
  {
    // code
  }
}

#include <windows.h>
void f(int x, BOOL y )
{
  /* When y is a Boolean or Boolean result. */
  if ((!x) || y)
  {
    // code
  }
}