التحكّم في التدفّق والحلقات

القيم المنطقية ومعاملات المقارنة

15 دقيقة الدرس 1 من 14

القيم المنطقية ومعاملات المقارنة

كل قرار يتخذه البرنامج يعود في النهاية إلى سؤال واحد: هل هذا صحيح أم خاطئ؟ تجيب Java على هذا السؤال بنوع البيانات boolean ومجموعة من معاملات المقارنة. قبل أن تكتب جملة if واحدة أو حلقة تكرارية، عليك أن تفهم هذا الأساس جيدًا.

نوع البيانات boolean

في Java، يُعدّ boolean نوعًا أوليًا يحمل قيمة واحدة فقط من اثنتين: true أو false. لا يوجد صفر، ولا null، ولا سلسلة فارغة — فقط هاتان القيمتان.

boolean isLoggedIn = true; boolean hasPermission = false; System.out.println(isLoggedIn); // true System.out.println(hasPermission); // false

اسم المتغير مهم. استخدم أسماء تُقرأ كأسئلة نعم/لا: isReady، hasError، canEdit. هذا يجعل كودك شبه موثّق بنفسه.

اتفاقية التسمية: ابدأ أسماء متغيرات ودوال boolean بـ is أو has أو can أو should. تتبع Java ذاتها هذه الاتفاقية في مكتبتها القياسية — String.isEmpty()، List.contains()، وغيرها.

معاملات المقارنة

تقيّم معاملات المقارنة قيمتين وتُنتج نتيجة من نوع boolean. يوجد في Java ستة معاملات:

  • == — يساوي
  • != — لا يساوي
  • < — أصغر من
  • > — أكبر من
  • <= — أصغر من أو يساوي
  • >= — أكبر من أو يساوي

كل واحد من هذه التعبيرات يُسمى تعبيرًا منطقيًا — إذ يُقيَّم إلى true أو false.

int age = 20; System.out.println(age == 20); // true System.out.println(age != 18); // true System.out.println(age < 18); // false System.out.println(age > 18); // true System.out.println(age <= 20); // true System.out.println(age >= 21); // false

تخزين نتائج المقارنة

بما أن المقارنة تُنتج قيمة boolean، يمكنك تخزين النتيجة في متغير مثل أي قيمة أخرى. هذا نمط شائع وأنيق:

int score = 85; boolean passed = score >= 60; boolean perfect = score == 100; System.out.println(passed); // true System.out.println(perfect); // false

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

مقارنة الأنواع الأولية

تعمل المعاملات الستة مباشرةً على الأنواع الأولية العددية في Java: int، long، double، float، short، byte، وchar. المقارنة دائمًا تكون بالقيمة.

char grade = 'B'; System.out.println(grade == 'B'); // true — نفس قيمة الحرف System.out.println(grade < 'C'); // true — للحرف 'B' قيمة Unicode أصغر من 'C' System.out.println(grade > 'A'); // true double price = 9.99; System.out.println(price < 10.0); // true
الأحرف أرقام في جوهرها. كل char مخزّن كنقطة كود Unicode — أي عدد صحيح. فـ'A' هو 65، و'B' هو 66، وهكذا. لهذا يمكنك مقارنة الأحرف بـ< و>.

فخ == مع الكائنات

يقارن المعامل == القيم للأنواع الأولية. أما مع الكائنات (كـString)، فإن == يتحقق مما إذا كان متغيران يشيران إلى الكائن ذاته في الذاكرة، لا ما إذا كانت محتوياتهما متساوية. يُعدّ هذا أحد أكثر الأخطاء شيوعًا لدى المبتدئين في Java.

String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); // false — كائنان مختلفان في الذاكرة System.out.println(a.equals(b)); // true — نفس الأحرف
استخدم دائمًا .equals() لمقارنة محتويات السلاسل النصية. قد يبدو استخدام == مع السلاسل صحيحًا أحيانًا (حين تُعيد JVM استخدام حرفية السلاسل من مجمّعها)، لكنه غير موثوق وسيسبب أخطاء يصعب تتبّعها. يتناول هذا الدرس الأنواع الأولية، لكن احتفظ بهذه القاعدة في ذهنك حين تتعامل مع السلاسل.

التعبيرات المنطقية كلبنات بناء

يمكن استخدام التعبير المنطقي في أي مكان تتوقع Java فيه قيمة boolean: تخزينه في متغير، أو تمريره إلى دالة، أو وضعه مباشرةً داخل شرط if. في الدرس التالي ستربط هذه التعبيرات بفروع if/else. في الوقت الحالي، تدرّب على قراءتها وتقييمها ذهنيًا.

int x = 7; int y = 10; boolean xIsSmaller = x < y; // true boolean theyAreEqual = x == y; // false boolean xIsNotTen = x != 10; // true boolean sumIsPositive = (x + y) > 0; // true

الخلاصة

يحمل نوع البيانات boolean قيمة true أو false حصرًا. تقارن المعاملات الستة — ==، !=، <، >، <=، >= — بين قيمتين أوليتين وتُنتج نتيجة boolean. يمكنك تخزين تلك النتيجة في متغير أو استخدامها مباشرةً. تذكّر أن == يقارن القيمة للأنواع الأولية، أما للكائنات فتحتاج .equals(). كل شيء في تدفق التحكم — كل فرع وكل حلقة — يُبنى على هذه التعبيرات البسيطة للصحيح والخطأ.