سؤال

سؤال غريب ، لكن أحدهم أظهر لي هذا ، كنت أتساءل هل يمكنك استخدام لا! مشغل INT في C ++؟ (من الغريب بالنسبة لي).

#include <iostream>
using namespace std;

int main()
{
   int a=5, b=4, c=4, d;
   d = !( a > b && b <= c) || a > c && !b;
   cout << d;
   system ("pause");
   return 0;
}
هل كانت مفيدة؟

المحلول

نعم. لأنواع لا يتجزأ ، ! عائدات true إذا كان المعامل صفر ، و false خلاف ذلك.

لذا !b هنا يعني فقط b == 0.


هذه حالة معينة حيث يتم تحويل القيمة إلى أ bool. ال !b يمكن أن ينظر إليها على أنها !((bool)b) لذا فإن السؤال هو ما هو "حقيقة" b. في C ++ ، يمكن تحويل أنواع الحساب ، وأنواع المؤشرات والتعداد إليها bool. عندما تكون القيمة 0 أو فارغة ، تكون النتيجة false, وإلا هو كذلك true (C ++ §4.1.2).

بالطبع يمكن للفصول المخصصة حتى زيادة تحميل operator! أو operator<يمكن تحويل الأنواع إلى Bool> للسماح !b لفصولهم. على سبيل المثال، std::stream لقد زاد حجمها operator! و operator void* للتحقق من الفشل ، بحيث مثل التعابير

while (std::cin >> x) {   // <-- conversion to bool needed here
  ...

من الممكن استخدامه.

(لكن الرمز الخاص بك !( a > b && b <= c) || a > c && !b هو مجرد خفي.)

نصائح أخرى

في الأصل ، في C (الذي يستند إليه C ++) لم يكن هناك نوع منطقي. بدلاً من ذلك ، تم تعيين القيمة "True" لأي قيمة غير صفرية وتم تعيين القيمة "False" لأي شيء يقييم إلى الصفر. لا يزال هذا السلوك موجودًا في C ++. لذلك ل int x, ، التعبيرات !x يعني "x ليس صحيحا "، وهو"x ليس غير صفري "، أي أنه صحيح إذا x هو الصفر.

تستطيع، !b يعادل (b == 0).

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

البناء ! يقوم المشغل بتحويل حجته إلى bool. المعيار يحدد ذلك يوجد تحويل من أي نوع من الحساب (int, char,.... float, double...) إلى منطق. إذا كانت قيمة المصدر 0 والنتيجة true, وإلا هو كذلك false

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