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

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

## المتغيرات الرياضية

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

## تعريف المتغيرات البرمجية
القاعدة النحوية:

```cpp
Type Name = Value;
```

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

```cpp
auto int f = 10;
int g = 20;
```

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

```cpp
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 ثم تضمينه ضمن المشروع ليكون متغير خارجي:

```cpp
//-----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;
}
```

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

```cpp
extern int r = 20;  // Error
```

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

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

## أنواع البيانات

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

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

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

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

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

```cpp
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
```

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

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

### الكلمة المحجوزة const
للثوابت عدة أنواع، النوع الأول يعد نوع عادي شائع الاستخدام:

```cpp
const float PI = 3.14159;
```

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

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

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

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

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


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

```cpp
const *int first;
```

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

```cpp
int *const secand;
```

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

```cpp
const int *const third;
```

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

```cpp
#define PI 3.14159
#define NEWLINE '\n'
```

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

```cpp
#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;
}
```

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

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

## انظر أيضا
* الكائنات في لغة C++
* أنواع البيانات في لغة C++
* التحويل في لغة C++
## روابط خارجية
* موقع مرجع في لغة C++ 

قواعد لغة سي++