الاثنين، 24 فبراير 2020


لو أخذنا مثال للبنية أو struct بحيث أننا نصمم لعبة قتالية بسيطة، طبعا هذه اللعبة فيها شخصيات مقاتلة، لها عدة صفات تهمنا في اللعبة، مثلا إحداثيات الموقع الحالية على الخارطة، عداد الصحة والذي يقل كلما زادت الإصابات، والفريق الذي ينتمي إليه. يمكن بالتأكيد إيجاد خصائص أخرى نحتاجها، ولكن وللتوضيح سنكتفي بهذه الصفات.
ما هي القيم التي سنحتاجها، الإحداثي السيني لموقعه (عدد صحيحي، موجب أو سالب)، الإحداثي الصادي لموقعه(عدد صحيح موجب أو سالب)، صحته (بالنسبة المئوية 1-100)، والفريق الذي ينتمي إليه (0 للفريق الأول و1 للفريق الثاني).
إذا فإن الشيفرة لهذا البناء قد تبدو كالآتي :
typedef struct
{ 
int Xposition; 
int Yposition; 
int health; 
bool team; 
} warrior ;
ويمكن وضع هذا التعريف بالبنية في أي مكان في شيفرة المصدر بشرط أن يسبق أي استخدام لهذا البناء.
الآن لنتخيل برنامج بسيط، نهدف من خلاله توضيح الفكرة
TODO: شرح استخدام الـ struct والمؤشرات لعمل linked list. نقاط القوة الضعف في الـ linked list ومتى يمكن استخدامها، مع تطبيق بسيط.
Structure أو البناء أو البنية هو مفهوم مفيد جدا في البرمجة، وهو يعتبر أحد الأسس التي أدت إلى ولادة البرمجة الكائنية التوجه. ويستخدم لجمع مجموعة من المتغيرات المختلفة المتعلقة بشيء ما معا، فعلى سبيل المثال، لو كان برنامجنا يسعى لبناء وتخزين ملفات طلبة المدارس، فما هي مجموعة المتغيرات التي نتحدث عنها، وما هو الشيء الذي نتحدث عنه.
إن الشيء الذي نتحدث عنه في مثل هذه الحالة هو الطالب، بالطبع ليس هناك في المدارس طالب واحد، ولكن وحدة البناء ستكون الطالب ، وعندها يمكننا تكرار هذه الوحدة بأي عدد نشاء من المرات. أما المتغيرات فهي قد تكون اسم الطالب مثلا! تاريخ ميلاده! علاماته...إلخ.
لو أردنا أن نجعل البرنامج يتعامل مع طالب مثلا دون استخدام وحدة البناء Struct ، وأردنا أن نتحدث عن سنة ميلاده ومجموع علاماته واسمه الأول فقط!! قد يكون شكل الإعلان عن هؤلاء الطلبية ربما كالآتي :
  • ملاحظة:إرساء قيم الاسم مكتوبة بشكل مبسط لأغراض التوضيح ، وهذه ليست الطريقة الصحيحة لعملها.
char firstName[15];
int birthYear;
int grades;
.
.
.
firstName="Ahmad";
birthYear="1995";
grades=84;
ماذا لو كان هناك 30 طالبا؟ طبعا، يمكن استخدام المصفوفات مثلا ، بالشكل الآتي:
char firstName[30][15];
int birthYear[30];
int grades[30];
.
.
.
for (int i =0; i <30 ; i++)
{
firstName[i]=FN;
birthYear[i]=Y;
grades[i]=G;
}
وبكلمات أخرى ، فإن ما يتم هو البحث عن الاسم Hanna في مصفوفة الأسماء، فنجد مثلا أن موقعه هو الموقع رقم 5 مثلا في مصفوفة الأسماء، ولمعرفة سنة ميلاده، فإننا سنبحث عن القيمةالموجودة في الموقع الخامس من مصفوفة أعوام الميلاد! وهكذا...
ألن يكون من الأفضل أن نرسي قيمة لاسم الطالب ، وبعدها وبسهولة نرسي قيمة لتاريخ ميلاده وأخرى لعلاماته، كل ذلك بمعاملة بناء من نوع طالب بمعلومات فرعيه عنه، بدلا من العديد من المصفوفات التي عليك تتبعها بشكل منفصل؟ ... إلخ. إذا شعرت أن هذا الحل هو الأنسب ، فما عليك إلا استخدام بناء أو Struct للطالب. وإليك مثال ذلك:
struct student
{
char firstName[15];
int birthYear;
int grades;
} student1;
.
.
.
student1.firstname="Ahmad";
student1.birthyear=1995;
student1.grades=85;
أما عند التعامل مع عدد كبير من الطلبة ، فإن الأمور ستكون أبسط، فبدلا من بناء مصفوفة بعدد الطلاب لأسماءهم ، وأخرى لسنوات ميلادهم وأخرى لعلاماتهم، فإن إنشاء مصفوفة واحدة من نوع طلاب سيكون أسهل، أبسط، وأوضح! إليك المثال الآتي:
typedef struct
{
char firstName[15];
int birthYear;
int grades;
} student;
.
.
.
student studentList[30];
.
.
.
for (int i =0; i <30 ; i++)
{
studentList[i].firstName=FN;
studentList[i].birthYear=Y;
studentList[i].grades=G;
}
بالأضافة إلى سهلولتها في البرمجة فانها أيضاً أكثر كفاءة من حيث سرعة تنفيذ البرنامج حيث انك عادة ما نطلب اسم الطالي مع ميلاده, وليس اسمين لطالبين وتاريخي ميلاد متتابعين. فعند استخدام المصفوفات المنفصلة سيكون هناك عبيء كبير في الوصول إلى الأماكن المختلفة من الذاكرة، وهذه فائدة اخر للبنيات.
المصفوفة هي مساحة من الذاكرة تحجز سكشككشلاءمز\ْلإنشاء مصفوفة فيها الحرف الأول من كل يوم من أيام الأسبوع فستكون
char week[7] = "SMTWTFS"
وستكون الخانة
week[0] = 'S'
بمعنى أنه تم حجز مساحة من الذاكرة مكونة في هذه الحالة من 7 مواقع تخزين، وتم وضع حرف من الحروف السبعة في كل موقع، وفي الموقع رقم صفر (خانة البداية) على سبيل المثال ، سنجد الحرف 'S'.

مفاهيم عامة عن الذاكرة, طبيعة المصفوفات في الذاكرة, مقدمة عن المؤشرات.[edit]

.
.
.

مقدمة عن المؤشرات[edit]

المؤشرات أو pointers هي نوع من المتغيرات يستخدم للإشارة إلى موقع ما في الذاكرة عن طريق حفظ موقعه. إذا فالمؤشرات تحمل قيمة يعتمد حجمها على تصميم الحاسوب وحجم الذاكرة التي يدعمها ، فتكون في العادة 2 أو 4 بايت. وتستخدم المؤشرات للإشارة إلى قيم متغيرات أخرى في العادة أو للتحرك الحرية في ذاكرة البرنامج، ومن الجدير بالذكر أن النظام لا يمنعك من الإعلان عن مؤشر يشير إلى موقع خارج برنامجك، ولكن بمجرد محاولة إستخدامه للقراءة أو الكتابة، فإن النظام يرجع خطأ يؤدي إلى إنهاء البرنامج، وهو ما يعرف بأخطاء Segmentation error. ولهذا السبب يكره البعض إستخدامها وذلك لسهولة الوقوع في الخطأ أثناء إستخدامها، ولكن عدم إستخدامها قد يمنعك من القيام بالكثير من الأشياء المثيرة اثناء البرمجة بلغة C++.
وكون المؤشرات تشير إلى موقع في الذاكرة ، فذلك يعني أن جميع المؤشرات بغض النظر عن نوعها (ولكن بالطبع على ذات التصميم من الحواسيب) لها ذات الحجم، فلماذا إذا هناك أنواع مختلفة من المؤشرات؟
إن تغير نوع المؤشر يساعد في التحرك في الذاكرة بخطوات تتناسب مع نوع المتغير الذي تشير إليه هذه المؤشرات، بكلمات أخرى ، إذا كنت تشير بمؤشر مخصص للإشارة إلى char، فإن كل خطوة تحركها بإستخدام عملية الزيادة ++ مثلا تغير من موقع إشارة المؤشر ببايت واحد فقط، وذلك لأن الحروف من نوع char تحتل بايتا واحدا كل مرة، في حين أنك لو استخدمت مؤشرا مخصص للإشارة إلى عدد صحيح int بحجم 4 بايت، فإن كل خطوة زيادة للمؤشر بعملية ++ ستحركه اربعة بايت.

الإعلان عن المؤشرات[edit]

للإعلان عن المؤشرات ، كل ما عليك القيام به هو تحديد نوع المتغير الذي سيشير إليه المؤشر واسم ذلك المؤشر فمثلا:
char *aPointer;
int x=5, *xptr;
هو جزء من برنامج، السطر الأول فيه يعلن عن مؤشر مخصص للإشارة عن متغير من نوع حروف char ، أما السطر الثاني ففيه إعلان عن متغير من نوع عدد صحيح int وبعدها مؤشر مخصص للإشارة على متغير من نوع int.
لاحظ من المثال أنه لتحديد ان الإعلان عن مؤشر من نوع ما ، ما عليك سوى الإعلان عنه كأي متغير من النوع الذي سيتم الإشارة إليه ثم إضافة النجمة * قبل اسم المؤشر. لاحظ ان المؤشران المعلن عنهما أعلاه لم يتم تحديد قيمهما للإشارة إلى أي متغير، ولكن هذا لا يعني أنهما لا يحملان قيمة، فهما يحملان قيمة مجهولة بالنسبة لنا، وعلى الأغلب ، فإن إستخدامهما مباشرة بعد الإعلان عنهما بهذه الصورة سيؤدي إلى Segmentation fault، أي خطأ في الإشارة إلى موقع الذاكرة لأنهما وعلى الأغلب سيكونان حاملان لقيم تشير وبشكل عشوائي لمواقع ما في الذاكرة على الأغلب خارج نطاق برنامجنا.

  • يجب ان يذكر تعريف الدالة نوع القيمة الراجعة (أي نوع البيانات التي ترجعه الدالة، مثال: دالة تستخدم لتقريب إلى أقرب عدد صحيح سترجع بيانات من نوع "عدد صحيح" أو int، ودالة تستخدم لإسترجاع تاريخ ميلاد طالب سيذكر تعريفها بأنها ترجع بيانات من نوع "تاريخ يوم").
  • تمرير المتغيرات بحسب القيمة أو بالإشارة (بالمرجعية) (Reference).
  • المتغيرات التي تم تعريفها ضمن نطاق الدالة ، لا تخرج عنها ولا يمكن الوصول إليها من خارج الدالة، والقيم التي تمرر للدالة لا يعدل عليها، إلا في حال تم تمريرها بالمرجعية By Reference

الدوال[edit]

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

الإعلان عن الدوال[edit]

يجب الإعلان عن الدوال قبل إستخدامها، وكتابة الدالة بالكامل قبل إستخدامها يعوض عن الإعلان عنها، ولكن من المتبع والمتعارف عليه بشكل واسع الإعلان عن الدوال أولا، ويكون الإعلان عن الدالة بذكر نوع القيمة المرجعة واسم الدالة ونوع المدخلات متوعا بفاصلة منقوطة، فمثلا:
char pos (char *,int) ;
هو إعلان عن دالة اسمها pos، وترجع قيمة حرف (رمز) و لها مدخلتين، أحدها مؤشر على حرف (رمز) والآخر عدد صحيح.

طريقة الكتابة[edit]

تكتب الدوال بعدة أجزاء هي:
  • نوع القيمة المرجعة.
  • اسم الدالة
  • المدخلات
  • الشيفرة الفعلية
مثال:
int squre (int x)
{
int y =  x * x;
return y 
}
اي برنامج في العالم, عندما يتم ترجمته إلى لغة الآلة, هو مجموعة من الاوامر المتسلسلة بشكل منطقي, و لا بد من نقطة بداية لهذه السلسلة من الأوامر ليبدأ الحاسوب بتنفيذ البرنامج.
في لغة السي و السي بلص بلص, هذه النقطة هي بداية الدالة main() :
int main()
{
    //code here
}
هناك بعض التفاصيل الغير مهمة في هذه المرحلة , فنحن لا نزال في البداية, ولكن المهم لنا أن أي برنامج نريد كتابته لا بد وأن يحتوي على هذه الدالة (main) ; لأنها تحدد لنا نقطة الدخول في البرنامج , وبامكاننا اعتبار أن نقطة الدخول هي أول سطر بعد القوس المعقوف } و هو يحدد بداية الدالة main وبالتالي بداية البرنامج.

ما المقصود بالدالة؟[edit]

جرت العادة عند كتابة برامج طويلة الحجم نوعا ما, أن يقسم البرنامج إلى عدة اجزاء صغيرة , يمكن اعتبار كل جزء منها "بريمج" صغير, ينفذ اوامر معينة , فبذلك تسهل عملية البرمجة ، ولحفظ الكثير من الجهد الغير لازم ، وتوفير كتابة أسطر لا حصر لها. عادة هذه البريمجات تسمي functions أو procedures أو subroutines حسب اللغة المستخدمة , في السي و السي بلص بلص فإنها تسمى functions , وعند ترجمتها إلى العربية أصبحت "دالة", رغم انها حسب رأيي لا تعبر عن المعنى الصحيح ، لها معناً آخر بالعربية يُطلق في بعض الأحيان : "تابع".
بهذا المفهوم, فإن البرنامج نفسه ككل, ما هو إلا دالة كبيرة, لذلك فالبرنامج يبدأ عند بداية الـmain و ينتهي عند نهايتها.

التعليق[edit]

بالنسبة للسطر
//code here
فهو ليس سوى تعليق comment يتم اهماله عند ترجمة البرنامج, حيث إن أي سطر يبدأ بخطين مائلين // يعتبر تعليقا و هو طريقة مناسبة لكتابة اي شيء داخل البرنامج مثل شرح عن كيفية عمل جزء معين من البرنامج وما إلى ذلك.
فالحد الأدنى لأي برنامج هو هذه الأسطر:
int main()
{

}
و هذا في الحقيقة هو برنامج صالح للترجمة و التنفيذ, و هو ببساطة لا يفعل شيئا, مجرد برنامج فارغ.

المكتبات[edit]

المكتبات هي مجموعات من دوال سي بلص بلص مجمعة معا في ملفات يمكن إستخدامها في برامجك، وتتنوع تلك الدوال في أهدافها، ويندر أن يخلو أي برنامج سي بلص بلص من المكتبات مهما كان بسيطا.

الكتابة على الشاشة[عدل]

إن الأوامر الأكثر إنتشارا للكتابة على الشاشة هي أمر cout ، وهو عبارة عن stream ، والأمر موجود ضمن مكتبة iostream ، والتي من اسمها والذي يعني Input Output Stream ، أي تيار المدخلات والمخرجات المستمر.

مثال[عدل]

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello World!\n"; // طباعة جملة Hello World على الشاشة
}
كتابه برنامج اولي مثل
#include<conio.h>
#include<stdio.h>
main()
{
    printf("my first program");
    getch();
}

المتغيرات[عدل]

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

العدد الصحيح int[عدل]

العدد الصحيح، والذي يتم تعريفه بإستخدام int والتي هي إختصار لكلمة integer هو نوع من المتغيرات الذي يمكنه أن يحمل قيمة عدد صحيح ، قد يكون سالبا وقد يكون موجبا، وهو محدود بـ 16 أو 32 بت. وبشكل إفتراضي ، فإن المتغيرات من نوع int يمكن أن تحمل قيم سالبة وموجبة، وفي حال أردت أن يتم استخدام القيم الموجبة فقط يمكن إضافة كلمة unsigned، حظا مطبعيفإن ذلك سيزيد آخر قيمة موجبة يمكن تخزينها إلى الضعف.

مثال[عدل]

int x;
unsigned int y;
long int z;
int w=5,a,b;
هنا يمكنك أن تلاحظ الإعلان عن متغير من نوع int اسمه x في السطر الأول، ثم متغير آخر من نوع int ولكنه غير حامل لإشارة ، وبالتالي لا يحمل إلا قيم موجبة وذلك في السطر الثاني، وفي السطر الثالث يتم الإعلان عن متغير اسمه z ومن نوع long int، أي عدد صحيح مكون من 32 بت على الاقل، وفي السطر الأخير تلاحظ الإعلان عن ثلاثة متغيرات من نوع int، الأول هو w وتم إرساء القيمة 5 له، وتبعه على ذات السطر إعلن عن متغيران آخران هما a و b.

الحروف char[عدل]

الحروف يتم تعريفها بإستخدام النوع char والذي هو إختصار لكلمة character، وهو يحمل قيمة رقم معين بين 0 و 255 بحيث يعني كل رقم من هذه الأرقام حرفا معينا، وتسمى القيم من 0 إلى 127 بقيم ASCII. وبحسب التعريف ، فإن char يحمل قيما عددية صحيحة، مما يسمح بإستخدامه لتخزين الأرقام التي دون 255، ولكن ذلك يعني أيضا بأن قيمه قد تكون سالبة أو موجبة، ولتأكيد كونها سالبة أو موجبة ، أضف كلمة signed او unsigned إلى جانب إعلانك عن متغير من نوع char.

الأعداد الكسرية Floating-point types[عدل]

عندما نحتاج لتخزين عدد غير صحيح، أي عدد كسري، فإننا نستخدم الأنواع float و double و long double. وهي أنواع لا تختلف إلا في مدى دقة تخزينها للقيم والحدود القصوى للقيم التي يمكن تخزينها فيها. ف float بشكل عام يتكون من 32 بت، و double من 64 بت. و long double قد يكون أكبر من ذلك، ولكنه قد يكون بذات طول double.
وهناك نوع خاص آخر يسمى void. وفي الحقيقة لا يسمح لك بإستخدام متغيرات من نوع void . ولكن هناك إستخدامات عديدة ل void، منها تمكين دالة ما من عدم إرجاع إي قيمة للبرنامج. و void لم تكن موجودة قبل أن تدخل ضمن لغة C القياسية عام 1989.

الثوابت[عدل]

الثوابت تشبه المتغيرات كثيرا، بل إنها عبارة عن متغيرات من ناحية كونها طريقة لتسمية الأشياء لتسهيل الوصول إليها، ولكنها تختلف عن المتغيرات أنها لا يمكن تغيير قيمها بعد أول تحديد للقيمة.
لتعريف الثوابت تستخدم كلمة const والتي تعني ثابت أو مستمر مدموجة مع نوع الشيء الذي نود التعامل معه (أي نوع المتغير) وقيمته! قد يجد البعض أن كون الثابت هو متغير لا يمكن تغيير قيمته جملة عديمة المعنى، ولكن لو إعتبرنا أن الثابت عبارة عن قيمة متغير تبقى تحمل ذات القيمة بإستمرار، قد تكون الأمور أوضح.
لإنشاء ثابت من نوع ما، لنفرض أنه ثابت عدد صحيح، ونود تسميته x وإسناد القيمة 7 إليه فإننا نكتب :
const int x = 7;

ما فائدة الثوابت؟[عدل]

قد تكون قد لاحظت أن الثوابت عبارة متغيرات ممنوع تغييرها! إذا لماذا تم إنشائها؟ وألم يكن من الممكن الإستعاضة عنها بمتغيرات عادية، وأن نقوم وببساطة بتجنب تغييرها؟
في الحقيقة أن أحد أهم الأهداف التي تم إنشاء المتغيرات لأجلها هي مساعدة المبرمج على عدم الوقوع في الخطأ. وبالتالي تحديد ما يمكن فعله وعدم فعله بمتغير معين مع الإبقاء على الشيفرة المصدرية مقروءة ومفهومة. على سبيل المثال، لو أن أحد المبرمجين يود أن يكتب برنامجا، فيه قيمة تمثل القاسم المشترك الأصغر لعددين صحيحين، والذي هو دوما قيمته 1. فإن تحديد القيمة التي يحملها دوما بواحد ومنع تغييرها، ستمنع المبرمج بالوقوع في الخطأ وتعديل هذه القيمة (الأمر الذي قد يحدث إما بالخطأ أو بسبب عدم الفهم الواضح للمعنى الرياضي خلف هذه القيمة، وهو الأمر الشائع جدا)، كما أنه لا داعي لتغيير قيمة ثابت الدوائر باي (3.14..) مثلا، وهكذا دواليك.

بماذا تختلف const عن define#؟[عدل]

قد يعرف البعض أن هناك طريقة لتعريف أسماء لقيم بإستخدام define#، هذه الطريقة تجعل المجمّع (الترجمان أو كومبايلر) يستبدل كل تعريف define يجده بالقيمة المعطاة، ولكنه لا يعطي لها نوعا محددا. على النقيض من const.

العمليات الأساسية[عدل]

العمليات الأساسية، ترجمة لمصطلح operators، هي العمليات التي يمكن القيام بها على المتغيرات والكائنات بشكل عام، وهي تشمل الآتية:
العملية الأساسيةالوصفAssociativity
()
[]
.
->
Parentheses (grouping)
Array subscript
Element selection by identifier
Element selection by pointer
left-to-right
++ --
+ -
! ~
(type)
*
&
sizeof
Prefix/postfix increment and decrement
Unary plus and minus
Logical NOT and bitwise zero's complement
Type cast
Dereference
Reference (address-of)
Size of
right-to-left
* / %Multiplication, division, and modulus (remainder)left-to-right
+ -Addition and subtraction
<< >>Bitwise left shift and right shift
< <=
> >=
Relational “less than” and “less than or equal to”
Relational “greater than” and “greater than or equal to”
== !=Relational “equal to” and “not equal to”
&Bitwise AND
^XOR على مستوى البت (exclusive or)
|Bitwise OR (inclusive or)
&&Logical AND
||Logical OR
c?t:fTernary conditionalright-to-left
=
+= -=
*= /= %=
<<= >>=
&= ^= |=
الإسناد
Assignment by sum and difference
Assignment by product, dividend, and remainder
Assignment by bitwise shift
Assignment by bitwise AND, XOR, and OR
,فاصلةleft-to-right

عمليات مقارنة القيم[عدل]

>[عدل]

أصغر، تستخدم للمقارنة بين القيم العددية لمتغيرين، يجب أن يكون المتغيرين من نفس النوع، أو أن يتم عرض أحدهما على أنه من نوع الآخر في حال إختلافهما

<[عدل]

أكبر، تستخدم للمقارنة بين القيم العددية لمتغيرين، يجب أن يكون المتغيرين من نفس النوع، أو أن يتم عرض أحدهما على أنه من نوع الآخر في حال إختلافهما

==[عدل]

هل يساوي ؟

++/--[عدل]

تعتبر العمليتين ++ و -- عمليتين سريعتين، الهدف منهما زيادة قيمة متغير أو إنقاصه بقيمة واحد، وتتميز هذه العملية بإمكانية تطبيقها قبل بدء الجمل الرياضية الحالية أو بعد إنتهائها بحسب موقع وضعها قبل المتغير أو بعده.
مثال:
int x=5, y; //المتغير x قيمته 5
x++ ; // الآن أصبحت قيمته ستة
 y = ++x * ++x ; //أصبحت القيمة سبعة، ضربت بسبعة ثم أصبحت ثمانية، لأن ++ الأخيرة بعد المتغير، 
;                   //إي تطبق بعد إنتهاء الجملة الرياضية، والقيمة المخزنة في y هي 7 * 7 ، أي 49

|[عدل]

عملية "|" تعني "أو" ، بمعنى أنها تفصل بين جملتين شرطيتين، أو بين قيمتين، حيث أن 0 تعني لا وأي قيمة أخرى تعني نعم، والجدول إلى اليسار يبين المنطق الذي تعمل به أو
الشطر الأولالعمليةالشطر الثانينتيجة العملية
0|0= 0
0|1= 1
1|0= 1
1|1= 1
وهذه العملية مفيدة جدا في الجمل الشرطية والتي تطبق في حال تحقيق شرط أو أكثر من الشروط التي تفصل بينها هذه العملية.
  • مثال:
لو إعتبرنا أن شرطيا يستخدم برنامجا لتحرير المخالفات، وإعتبرنا أن ربط حزام الأمان يعبر عنه بالمتغير x، بيحث تكون قيمة x تساوي 1 إذا كان الحزام مربوطا ، وصفر إن لم يكن مربوطا (1 بمعنى نعم و 0 بمعنى لا) وكان المتغير y يعبر عن سرعة سير السيارة، وكانت السرعة القصوى المسموح بها 80، فإن الجملة الشرطية التالية:
if (x == 0 | y>80)
ملاحظة:عندما يتحقق أول شرط ضمن سلسة من الشروط بينها عملية أو، يتوقف تطبيق بقية الشروط وذلك لأن الإجابة في جميع الأحوال ستكون بنعم (1)

 سمعت مقولة بتقول لو عاوز تستثمر واستثمارك يتنجح استمثر في المكياج او في المطاعم فالناس مش هتبطل تاكل ولا الستات هيبطلوا يحطوا مكياج 😂 ففي ...