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

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

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

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

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

الباحث:

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

Double:

هو double-قيمة النقطة العائمة الدقة. مثال: 11.22، 2.345

شار:

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

تطفو:

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

سلسلة حرفية:

السلسلة الحرفية هي سلسلة من الأحرف المضمنة double-علامات الاقتباس. على سبيل المثال: "كيف حالك؟"

منطقي:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

int guru99, gurU99, GuRu99, GURU99;

لقد حجزت لغة C++ بعض الأسماء لاستخدامها.

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

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

  • يجب أن يعطي المعرف على الأقل بعض المؤشرات حول معناه.
  • عادةً ما تكون أسماء المتغيرات بأحرف صغيرة — 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 بعد إنشائه، بل يجب الإعلان عنه وتهيئته بشكل إلزامي. آخرwise المترجم يلقي خطأ.

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;	
}	 

يحدد هذا البرنامج 3 أسماء، viz، الرئيسي، المجموع، وفال. يستخدم اسم مساحة الاسم 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++ المختلفة:

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

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 
*/

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

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

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

لغة البرمجة 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 

نبذة عامة

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