C++ المتغيرات والأنواع: Int، Char، Float، Double، سلسلة وبول

المتغيرات في C++

A C++ المتغير يوفر لنا إمكانية تخزين مسماة. يسمح للمبرمج بمعالجة البيانات حسب الحاجة. كل متغير له نوع في C++يساعد نوع المتغير في تحديد حجم وتخطيط خريطة ذاكرة المتغير، ونطاق القيم التي يمكن تخزينها داخل تلك الذاكرة، ومجموعة العمليات التي يمكن تطبيقها عليها.

الأنواع الأساسية للمتغيرات في C++

فيما يلي الأنواع الأساسية من C++ المتغيرات:

الباحث:

العدد الصحيح هو حرفي رقمي (مرتبط بالأرقام) بدون أي جزء كسري أو أسي. على سبيل المثال 120، -90، وما إلى ذلك.

Double:

إنها قيمة فاصلة عائمة ذات دقة مزدوجة. مثال: 11.22، 2.345

شار:

يتم إنشاء حرف حرفي عن طريق إحاطة حرف واحد داخل علامات الاقتباس المفردة. على سبيل المثال: 'a'، 'm'، 'F'، 'P'، '}' وما إلى ذلك.

تطفو:

النقطة العائمة الحرفية هي حرفية رقمية لها إما شكل كسري أو شكل أسي. على سبيل المثال: 1.3، 2.6

سلسلة حرفية:

السلسلة الحرفية عبارة عن سلسلة من الأحرف محاطة بعلامات اقتباس مزدوجة. على سبيل المثال: "كيف حالك؟"

منطقي:

يحمل قيمة منطقية صحيحة أو خاطئة.

قواعد الإعلان عن المتغيرات في C++

فيما يلي بعض القواعد الشائعة لتسمية المتغير:

  • A C++ لا يمكن أن يحتوي اسم المتغير إلا على أحرف أبجدية وأرقام وشرطة سفلية.
  • A C++ لا يمكن أن يبدأ اسم المتغير برقم.
  • يجب ألا تبدأ أسماء المتغيرات بحرف كبير.
  • اسم متغير يستخدم في C++ لا يمكن أن تكون كلمة رئيسية. على سبيل المثال، int هي كلمة أساسية تُستخدم للإشارة إلى الأعداد الصحيحة.
  • A C++ يمكن أن يبدأ اسم المتغير بشرطة سفلية. ومع ذلك، لا تعتبر ممارسة جيدة.

C++ أنواع البيانات المتغيرة

C++ يحدد مجموعة كاملة من الأنواع البدائية

تشير باطل لا يحتوي النوع على قيم مرتبطة به ويمكن استخدامه في حالات قليلة فقط. وهو الأكثر شيوعًا كنوع الإرجاع للوظائف التي لا تُرجع قيمة.

تشير أنواع حسابية تتضمن الأحرف والأعداد الصحيحة والقيم المنطقية والأرقام العائمة. يتم تقسيم النوع الحسابي إلى فئتين

  1. أنواع النقطة العائمةتمثل الأرقام العائمة (أو النوع العائم) أرقامًا عشرية. يحدد معيار IEEE عددًا أدنى من الأرقام المهمة. توفر معظم المترجمات عادةً دقة أكبر من الحد الأدنى المحدد. عادةً، يتم تمثيل الأرقام العائمة بـ 32 بت، والأرقام المزدوجة بـ 64 بت، والأرقام المزدوجة الطويلة إما بـ 96 أو 128 بت.
  2. أنواع متكاملة (والتي تشمل الأحرف والأعداد الصحيحة والأنواع المنطقية). ال منطقية يحتوي النوع على نوعين فقط من القيم: True أو False. هناك العديد دبابة أنواع، معظمها موجود لدعم التدويل. نوع الحرف الأساسي هو char. الحرف هو نفس حجم بايت جهاز واحد مما يعني بايت واحد.

تشير أنواع متكاملة قد تكون موقعة أو غير موقعة.

النوع الموقع:تمثل الأرقام السالبة أو الموجبة (بما في ذلك الصفر). في النوع الموقّع، يجب تقسيم النطاق بالتساوي بين القيم الموجبة والسالبة. وبالتالي، فإن الحرف الموقّع المكون من 8 بتات سيحمل قيمًا من -127 إلى 127.

النوع غير الموقع: في النوع غير الموقع، تكون جميع القيم >= 0. يمكن أن يحتوي الحرف غير الموقع ذو 8 بتات على الأرقام من 0 إلى 255 (كلاهما شامل).

C++ أنواع البيانات المتغيرة

اسم المتغير أو المعرفات

يمكن أن تتكون المعرفات من بعض الأحرف والأرقام والشرطة السفلية أو مزيج منها. لا يوجد حد مفروض على طول الاسم.

يجب على المعرفات

  • تبدأ إما بحرف أو بشرطة سفلية ('_').
  • وهي حساسة لحالة الأحرف؛ الحروف الكبيرة والصغيرة مميزة:

// يحدد أربعة متغيرات int مختلفة

int guru99, gurU99, GuRu99, GURU99;

تشير C++ وقد احتفظت اللغة ببعض الأسماء لاستخدامها.

اسم المتغير أو المعرفات

هناك العديد من الاصطلاحات المقبولة لتسمية المتغيرات لغات البرمجة المختلفةإن اتباع هذه الاتفاقيات قد يؤدي إلى تحسين قابلية قراءة البرنامج.

  • يجب أن يعطي المعرف على الأقل بعض المؤشرات حول معناه.
  • عادةً ما تكون أسماء المتغيرات بأحرف صغيرة — guru99، وليس Guru99 أو GURU99.
  • عادةً ما تبدأ الفئات التي نحددها بحرف كبير.
  • يجب أن تميز المعرفات التي تحتوي على كلمات متعددة كل كلمة بصريًا. على سبيل المثال، guru99_website ليس guru99website.

C++ إعلان وتعريف المتغير

إن إعلان المتغير يجعل الاسم معروفًا للبرنامج في النطاق الذي تم تعريفه فيه. مثال:

int a=5;
int b;
char c='A'; 
int a,b;
a=b=1000;
List initialization
int a(5);
int b{5};

تصفيات Const في C++

لنفترض أن هناك حجمًا متغيرًا يوضح عدد المدخلات التي سيتم أخذها من المستخدم. هنا، لا نريد تغيير قيمة buffsize خلال البرنامج. نريد تحديد متغير نعرف أن قيمته لا يجب أن تتغير.

في مثل هذه الحالة، استخدم الكلمة الأساسية const

const int bufSize = 512;    // input buffer size

هذا يعرّف bufSize كثابت. أي محاولة لتعيين bufSize أو تغييره ستؤدي إلى حدوث خطأ.

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

const int i = get_size();  // ok: initialized at run time
const int j = 42;          // ok: initialized at compile time
const int k;               // error: k is uninitialized const
int i = 42;
const int ci = i;    	   // ok: the value in i is copied into ci 

نطاق المتغيرات في C++

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

#include <iostream>	
int main()	
{	
    int sum = 0;	
    // sum values from 1 through 10 inclusive	
    for (int val = 1; val <= 10; ++val)	
        sum += val;  // equivalent to sum = sum + val	
    cout << "Sum of 1 to 10 inclusive is "<< sum <<endl;	
    return 0;	
}	 

يحدد هذا البرنامج ثلاثة أسماء، وهي viz وmain وsum وval. ويستخدم اسم مساحة الأسماء std، إلى جانب اسمين آخرين من مساحة الأسماء تلك - cout وendl.

  • يتم تعريف اسم الوظيفة "الرئيسية" خارج الأقواس المتعرجة. اسم الوظيفة main — مثل معظم الأسماء الأخرى المحددة خارج الوظيفة — له نطاق عالمي. مما يعني أنه بمجرد الإعلان عن الأسماء الموجودة في النطاق العالمي يمكن الوصول إليها في جميع أنحاء البرنامج.
  • يتم تعريف المبلغ المتغير ضمن نطاق الكتلة التي تمثل نص الوظيفة الرئيسية. ويمكن الوصول إليه من نقطة الإعلان الخاصة به وفي بقية أجزاء الوظيفة الرئيسية. ومع ذلك، ليس خارجها. وهذا يعني أن المبلغ المتغير لديه نطاق الكتلة.
  • يتم تعريف المتغير val في نطاق "للبيان". يمكن استخدامه بسهولة في هذا البيان ولكن ليس في أي مكان آخر في الوظيفة الرئيسية. لقد النطاق المحلي.

النطاق المتداخل

يمكن أن يحتوي النطاق على نطاقات أخرى. يُشار إلى النطاق المضمن (أو المتداخل) بالنطاق الداخلي. النطاق المحتوي هو النطاق الخارجي.

#include <iostream>	
using namespace std;	
// Program for illustration purposes only: It is bad style for a function	
// to use a global variable and also define a local variable with the same name	
int reused = 42;  // reused has global scope	
int main()	
{	
    int unique = 0; // unique has block scope	
    // output #1: uses global reused; prints 42 0	
    cout << reused << " " << unique << endl;	
    int reused = 0; // new, local object named reused hides global reused	
    // output #2: uses local reused; prints 0 0	
    cout << reused << " " << unique << endl;	
    // output #3: explicitly requests the global reused; prints 42 0	
    cout << ::reused << " " << unique << endl;	
    return 0;	
}	 

الإخراج رقم 1 يظهر قبل التعريف المحلي لإعادة الاستخدام. وهكذا هذا الإخراج

البيان هو الذي يستخدم الاسم المعاد استخدامه والمحدد في النطاق العالمي. يخرج هذا البيان

42 0

الإخراج رقم 2 يحدث بعد التعريف المحلي لإعادة الاستخدام. وهي الآن في نطاقها. لذلك، يستخدم بيان الإخراج الثاني ببساطة الكائن المحلي المسمى المعاد استخدامه بدلاً من الكائن العام والمخرجات

0 0

الإخراج رقم 3 يتجاوز قواعد النطاق الافتراضية باستخدام مشغل النطاقلا يوجد اسم للنطاق العالمي. وبالتالي، عندما يكون عامل النطاق (::) فارغًا على الجانب الأيسر، فإنه يفسره كطلب لجلب الاسم على الجانب الأيمن من النطاق العالمي. وبالتالي، يستخدم التعبير إعادة الاستخدام العالمي ويخرج

42 0

تحويل النوع المتغير

يمكن تحويل متغير من نوع واحد إلى نوع آخر. يُعرف باسم "تحويل النوع". دعونا نرى قواعد تحويل مختلفة C++ أنواع المتغيرات:

يؤدي تعيين قيمة غير منطقية إلى متغير منطقي إلى ظهور قيمة False إذا كانت القيمة 0 وقيمة True بخلاف ذلك.

bool b = 42;            // b is true

يؤدي تعيين منطقي إلى أحد الأنواع الحسابية الأخرى إلى الحصول على 1 إذا كان المنطقي صحيحًا و0 إذا كان المنطقي خطأ.

bool b = true;
int i = b;              // i has value 1

يؤدي تعيين قيمة الفاصلة العائمة لمتغير من النوع int إلى الحصول على القيمة المقطوعة. القيمة المخزنة هي الجزء قبل العلامة العشرية.

int i = 3.14;               // i has value 3

يؤدي تعيين قيمة int لمتغير من النوع العائم إلى أن يصبح الجزء الكسري صفرًا. عادة ما يتم فقدان الدقة إذا كان العدد الصحيح يحتوي على عدد أكبر من البتات التي يمكن أن يستوعبها المتغير العائم.

Int i=3;
double pi = i;          // pi has value 3.0

إذا حاولنا تعيين قيمة خارج النطاق لمتغير من النوع غير الموقع، فإن النتيجة هي باقي القيمة %(modulo)

على سبيل المثال، يمكن لنوع الأحرف غير الموقعة ذو 8 بت أن يحمل قيمًا من 0 إلى 255، ضمنًا. سيؤدي تعيين قيمة خارج هذا النطاق إلى قيام المترجم بتعيين ما تبقى من تلك القيمة modulo 256. لذلك، وفقًا للمنطق أعلاه، فإن تعيين –1 إلى حرف غير موقّع ذو 8 بتات يعطي هذا الكائن القيمة 255.

unsigned char c = -1;   // assuming 8-bit chars, c has value 255

إذا حاولنا تعيين قيمة خارج النطاق لكائن من النوع الموقع، فإن النتيجة لا يمكن التنبؤ بها. إنه غير محدد. قد يبدو البرنامج وكأنه يعمل من الخارج، أو قد يتعطل، أو قد ينتج عنه قيم غير مرغوب فيها.

signed char c2 = 256;   // assuming 8-bit chars, the value of c2 is undefined

يطبق المترجم نفس النوع من التحويلات عندما نستخدم قيمة من نوع واحد حيث من المتوقع وجود قيمة من نوع آخر.

int i = 42;
if (i) // condition will evaluate as true
i = 0; 

إذا كانت هذه القيمة = 0، فإن الشرط خاطئ؛ جميع القيم الأخرى (غير الصفر) تسفر عن صحة. وبنفس المفهوم، عندما نستخدم منطقيًا في تعبير حسابي، يتم دائمًا تحويل قيمته إلى 0 أو 1. ونتيجة لذلك، فإن استخدام منطقي في تعبير حسابي عادة ما يكون غير صحيح تقريبًا.

تحذير: لا تخلط بين الأنواع الموقعة وغير الموقعة

يمكن أن تؤدي التعبيرات التي تخلط بين الموقعة وغير الموقعة إلى نتائج مفاجئة وخاطئة عندما تكون القيمة الموقعة سالبة. كما تمت مناقشته أعلاه، يتم تحويل القيم الموقعة تلقائيًا إلى غير موقعة.

على سبيل المثال، في تعبير حسابي مثل

x* y

إذا كانت x هي -1 وy هي 1، وإذا كان كل من x وy يساوي int، فستكون القيمة، كما هو متوقع، -1.

إذا كانت قيمة x هي int وy غير موقعة، فإن قيمة هذا التعبير تعتمد على عدد البتات الموجودة على جهاز الترجمة. على جهازنا، ينتج عن هذا التعبير 4294967295.

تسجيل المتغيرات

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

للتعريف:

register int i;

التعليقات

التعليقات هي أجزاء من التعليمات البرمجية التي يتجاهلها المترجم. يسمح للمبرمج بتدوين ملاحظات في المجالات ذات الصلة بالكود المصدر/البرنامج. تأتي التعليقات إما في شكل كتلة أو في أسطر مفردة. تعليقات البرنامج عبارة عن بيانات توضيحية. يمكن تضمينه في C++ الكود الذي يساعد أي شخص على قراءة كود المصدر الخاص به. تسمح جميع لغات البرمجة بشكل ما من أشكال التعليقات. C++ يدعم كلاً من التعليقات ذات السطر الواحد والمتعددة الأسطر.

  • تعليقات سطر واحد هي تلك التي تبدأ بـ // وتستمر حتى نهاية السطر. إذا كان الحرف الأخير في سطر التعليق هو \، فسيستمر التعليق في السطر التالي.
  • تعليقات متعددة الأسطر هي التي تبدأ بـ /* وتنتهي بـ */.
/* This is a comment */
/* C++ comments can  also 
* span multiple lines 
*/

تسلسلات الهروب

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

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

تشير C++ لغة برمجة يحدد عدة تسلسلات الهروب:

ماذا يفعل؟ حرف
خط جديد \n
علامة تبويب عمودية \v
مائل \\
إرجاع \r
مساحة أفقية \t
BACKSPACE \b
علامة استفهام \?
نموذج تغذية \f
تنبيه (الجرس) \a
Double اقتبس \ "
اقتباس واحد \ "

نستخدم تسلسل الهروب كما لو كان حرفًا واحدًا:

cout << '\n';        // prints a newline
cout << "\tguru99!\n";   // prints a tab followed by "guru99!" and a newline 

يمكننا أيضًا كتابة تسلسلات هروب معممة \x متبوعة برقم سداسي عشري واحد أو أكثر. أو نستخدم \ متبوعًا برقم ثماني أو رقمين أو ثلاثة أرقام. يمثل تسلسل الهروب المعمم القيمة الرقمية للحرف. بعض الأمثلة (بافتراض مجموعة الأحرف اللاتينية-1):

\7 (bell)    \12 (newline)      \40 (blank)
\0 (null)    \115 ('M')         \x4d ('M') 

يمكننا استخدام تسلسلات الهروب المحددة مسبقًا، كما نستخدم أي حرف آخر.

cout << "Hi \x4dO\115!\n";  // prints Hi MOM! followed by a newline
cout << '\115' << '\n';     // prints M followed by a newline 

الملخص

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