المحتوى هنا ينقصه الاستشهاد بمصادر، أي معلومات غير موثقة يمكن التشكيك بها وإزالتها.
يرجى مراجعة هذه المقالة وإزالة وسم المقالات غير المراجعة، ووسمها بوسوم الصيانة المناسبة.

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

من ويكيبيديا، الموسوعة الحرة
اذهب إلى التنقل اذهب إلى البحث
Question book-new.svg
المحتوى هنا ينقصه الاستشهاد بمصادر. يرجى إيراد مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (فبراير 2016)
N write.svg
هذه مقالة غير مراجعة. ينبغي أن يزال هذا القالب بعد أن يراجعها محرر عدا الذي أنشأها؛ إذا لزم الأمر فيجب أن توسم المقالة بقوالب الصيانة المناسبة. (مايو 2013)

المتغيرات هي عبارة عن حاويات لها حجم معين (كل نوع له حجم) تقوم بتخزين البيانات، تعد من أساسيات البرمجة ولايمكن لبرنامج أن يعمل من دونها، تتكون من عدة انواع لكل نوع حجم مخصص له في الذاكرة لايمكن أن يتجاوز هذا الحجم، إلا إذا كان يستخدم أنواع ديناميكية تستخدم معها المؤشرات.

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

هو تمثيل رمزي يدلّ على كمية أو تعبير. بعض الأمثلة تتضمن درجة حرارة الغرفة وارتفاع صوت الكلام. يمثل المتغير عادة باستخدام رمز أو حرف أو كلمة مثل x و y و time.

تعريف المتغيرات البرمجية[عدل]

القاعدة النحوية:


Type Name = Value;

أنواع المتغيرات[عدل]

المتغيرات الآلية Auto[عدل]

المتغيرات الآلية هي نفسها المتغيرات العادية، سميت آلية لتميزها عن الساكنة. يمكن ببساطة تجاهل كتابة كلمة auto لأن المترجم يفهم تلقائيا أن المتغير آلية، تخزن في منطقة Stack المكدس.


auto int f = 10;
int g = 20;

المتغيرات الخارجية extern[عدل]

عندما يكون لديك متغيرين بنفس الاسم والأول متغير محلي والثاني متغير عام، وتريد أن يشتركا في نفس القيمة ماعليك إلا أن تكتب extern عندما تقوم بتعريف المتغير المحلي، تخزن في منطقة Heap.


int r;
void pr (void)
{
    extern int r;
    r = 5;
    printf("1- %d\n", r);
}
int main(void)
{
    r = 10;
    pr();
    printf("2- %d\n", r);
    return 0;
}

الآن أصبح المتغيرين المحلي والعام يحملان نفس القيمة وهي 5. أيضا يمكنك تعريف متغير عام في ملف header ثم تضمينه ضمن المشروع ليكون متغير خارجي:


//-----HEADER-----//
#ifndef EXTER_H
#define EXTER_H
int r;
#endif // EXTER_H

//-----main .cpp-----//
#include <stdio.h>
#include "exter.h"
extern int r;
void pr (void)
{
    extern int r;
    r = 5;
    printf("1- %d\n", r);
}
int main(void)
{
    r = 10;
    pr();
    printf("2- %d\n", r);
    return 0;
}

ملاحظة: لايمكنك اسناد قيمة للمتغير عندما تعرفه كتغير خارجي:


extern int r = 20;  // Error

المتغيرات الساكنة static[عدل]

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


void goo()
{
    static int i = 0;
    i++;
    if (i >= 10)
        return;
    printf("%d\n", i);
    goo();
}
int main(void)
{
    goo();
    return 0;
}

أنواع البيانات[عدل]

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

عندما نتكلم عن الثوابت فكل قيمة عددية أو نصية تعتبر ثابت.


75         // decimal
0113       // octal
0x4b       // hexadecimal

وكتابة انواعها أيضا:


75         // int
75u        // unsigned int
75l        // long
75ul       // unsigned long

والأرقام العشرية أيضا:


3.14159    // 3.14159
6.02e23    // 6.02 x 10^23
1.6e-19    // 1.6 x 10^-19
3.0        // 3.0
3.14159L   // long double
6.02e23f   // float

والثوابت النصية أيضا:


'z'
'p'
"Hello world"
"How do you do?"

الكلمة المحجوزة const[عدل]

للثوابت عدة أنواع، النوع الأول يعد نوع عادي شائع الاستخدام:


const float PI = 3.14159;

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

بالنسبة لتغير قيمة الثابت عن طريق المؤشرات، تابع المثال التالي:


const int con = 10;
int *ptr = &con;
printf("%d\n", con);
*ptr = 5;
printf("%d\n", con);

القاعدة النحوية الأخرى لـ const، كلا الجملتين صحيحة، وتقوم بنفس العمل.:


const int t = 10;		// case 1
int const d = 10;		// case 2

المؤشرات الثابتة[عدل]

في السطر التالي، المؤشر متغير (عنوان الذاكرة) وقيمته ثابتة، أي لايمكن تغير قيمته:


const *int first;

في هذه الحالة، المؤشر ثابت وقيمته متغيرة:


int *const secand;

في الحالة الأخيرة، المؤشر ثابت وقيمته ثابتة، أي لايمكن تغير الاثنين:


const int *const third;

الثوابت الرمزية[عدل]

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


#define PI 3.14159
#define NEWLINE '\n'

وبالتالي يمكنك التوسع في ذلك حتى في رموز اللغة نفسها:


#include <stdio.h>

#define oo ;
#define begin {
#define end }
int t()
begin
printf("hello");
end
int main()
{
    t() oo
    int x = 1 oo
    return 0;
}

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

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


int var     = 10;     // variable
int* varPtr = &var;   // Pointer
int& varRef = var;    // Reference <=> const Pointer e.g. ( int* const p) <=> (int& p)

انظر أيضا[عدل]

روابط خارجية[عدل]