سؤال

[هذا السؤال يرتبط ولكن ليس بنفس هذا واحد.]

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

وهنا ما أقصد:

typedef long T;       // similar warning with void * or double
T t = 0;
bool b = t;           // performance warning: forcing 'long' value to 'bool'
b = t ? true : false; // ok
b = !!t;              // any different?

هل المزدوج ليس تقنية حقا تفعل نفس الشيء ؟ هو أكثر أو أقل أمنا من الثلاثي التقنية ؟ هذه التقنية آمنة على قدم المساواة مع غير جزء لا يتجزأ من أنواع (على سبيل المثال ، void * أو double بالنسبة T)?

أنا لا أطلب منك إذا !!t هو اسلوب جيد.أنا أسأل إذا كان لغويا مختلفا t ? true : false.

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

المحلول

ووحجة! كلاهما تحويل المشغل والوسيطة الأولى من المشغل الثلاثي ضمنيا منطقي، لذلك !! و: هم زينة زائدة سخيفة IMO من المدلى بها. اصوت ل

b = (t != 0);

ولا تحويلات ضمنية.

نصائح أخرى

وبدلا من ذلك، يمكنك القيام بذلك: bool b = (t != 0)

حذرا!

  • منطقية عن الحق و الباطل.
  • صحيح هو عن أرقام كاملة.

تلك هي متميزة جدا مفاهيم:

  • الحقيقة زيف عن البت في الأمور.
  • أرقام عن عد الأشياء.

عندما سد تلك المفاهيم ، ينبغي أن يتم ذلك بشكل صريح.انا احب ديما نسخة أفضل:

b = (t != 0);

هذا الرمز يقول بوضوح:مقارنة بين أرقام وتخزين الحقيقة-قيمة منطقية.

وجميع التقنيات صالحة، وكلها سوف تولد نفس الرمز.

وشخصيا، أنا فقط تعطيل التحذير حتى أتمكن من استخدام أنظف بناء الجملة. صب لمنطقي ليست شيئا انا قلق القيام بطريق الخطأ.

و
نعم أنها آمنة.

و
يتم تفسير 0 كما كاذبة، كل شيء آخر هو الصحيح،
بالتالي! 5 يخرج كما كاذبة
! 0 يخرج على النحو الصحيح
ذلك !! 5 يخرج على النحو الصحيح

وأنا لن تستخدم:

bool b = !!t;

وهذا هو الطريق الأقل قراءة (وبالتالي أصعب للحفاظ على)

وأما الآخرون تعتمد على الوضع.
إذا كنت تقوم بتحويل لاستخدامها في تعبير منطقي فقط.

bool b = t ? true : false;
if (b)
{
    doSomething();
}

وثم أود أن ندع لغة تفعل ذلك بالنسبة لك:

if (t)
{
    doSomething();
}

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

bool  b = t ? true : false;      // Short and too the point.
                                 // But not everybody groks this especially beginners.
bool  b = (t != 0);              // Gives the exact meaning of what you want to do.
bool  b = static_cast<bool>(t);  // Implies that t has no semantic meaning
                                 // except as a bool in this context.

موجز: استخدام ما توفر معظم معنى للسياق الذي أنت فيه.
محاولة لجعله واضحا ما تقومون به

وأوصي أبدا قمع هذا التحذير، وأبدا باستخدام الزهر ج (منطقي) لقمعه. قد لا تكون دائما تسمى التحويلات كما تفترض.

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

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

ونهج ديما هو جيد جدا، لأنه يعين قيمة تعبير لمنطقي.

إذا كنت قلقا حول تحذير، يمكنك أيضا فرض المدلى بها: bool b = (bool)t;

وأنا أكره حقا !! ر !!. أنه ينم عن أسوأ شيء حول C ++ و C، وإغراء لتكون ذكية جدا بمقدار النصف مع تركيب الخاص بك.

ومنطقي ب (ر = 0!)؛ // هو أفضل وسيلة IMHO، فإنه يظهر بوضوح ما يحدث.

و!! قد يكون التعاقد، ولكن أعتقد أنه معقد دون داع. أفضل لتعطيل التحذير أو استخدام عامل التشغيل الثلاثي، في رأيي.

وأود أن استخدام ب = (0 = ر!) - على الأقل أي شخص عاقل يمكن قراءتها بسهولة. إذا كنت أرى دانغ مزدوج في التعليمات البرمجية، وأود أن تكون جميلة يفاجأ كثيرا.

وتعطيل التحذير.

والكتابة لوضوح أولا؛ ثم الشخصية. ثم تحسين للسرعة، عند الاقتضاء.

و!! هو مفيد فقط عندما كنت تستخدم تعبير منطقي بطريقة حسابية، منها مثلا:

c = 3 + !!extra; //3 or 4

و(لمن الاسلوب هو مناقشة مختلفة). عندما كل ما تحتاجه هو تعبير منطقي، و!! لا لزوم لها. كتابة

bool b = !!extra;

ويجعل الكثير من المعنى على النحو التالي:

if (!!extra) { ... }

ومقارنة ل0 لا تعمل بشكل جيد. الذي يعود - لماذا !! مقابل الثلاثي؟

class foo { public: explicit operator bool () ; };

foo f;

auto a = f != 0; // invalid operands to binary expression ('foo' and 'int')
auto b = f ? true : false; // ok
auto c = !!f; // ok

وأوصي لاستخدام

وإذا (خ! = 0)

أو

وإذا (خ! = NULL)

وبدلا من إذا (خ)؛ انها أكثر مفهومة وقابلة للقراءة.

ووضعف لا يشعر مضحك بالنسبة لي، وفي التعليمات البرمجية التصحيح سيكون مختلفا جدا عما في رمز الأمثل.

إذا كنت في حالة حب مع !! هل يمكن ماكرو دائما.

#define LONGTOBOOL(x) (!!(x))

و(بوصفها جانبا، المشغل الثلاثي هو ما يفضل في هذه الحالات)

وأود أن استخدام منطقي ب = ر وترك الترجمة تحذير في معرض تعليقه على سلامة هذا الخط معين. تعطيل التحذير قد لدغة لك في بعقب في جزء آخر من التعليمات البرمجية.

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