هل يمكنني استخدام المشغل غير في C ++ على قيم INT؟
-
29-09-2019 - |
سؤال
سؤال غريب ، لكن أحدهم أظهر لي هذا ، كنت أتساءل هل يمكنك استخدام لا! مشغل 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