أنواع البيانات في C++

في كل لغة برمجة تحتاج إلى أنواع البيانات لكي تتعامل مع الذاكرة, من هذه اللغات لغة البرمجة ++C/C, التي تحتوي على عدة أنواع بيانات منها الأولية مثل: int و bool ومنها المركبة مثل: Array و structure و union و Class ومنها ماهو مختلف مثل: المؤشرات و المراجع.
## أنواع البيانات
### أنواع البيانات الأولية
: مقالة مفصلة عن أنواع البيانات الأولية
#### الأنواع الأساسية
* **int**: عدد صحيح حجمه 4 بايت.
* **short**: عدد صحيح حجمه 2 بايت.
* **long**: عدد صحيح حجمه 4 بايت.
* **bool**: منطقي حجمه 1 بايت.
* **float**: عدد عشري حجمه 4 بايت.
* **double**:عدد مضاعف حجمه 8 بايت.
* **[[متغير محرفي (حوسبة)|char]]**: حرفي من جدول الأسكي
* **wchar_t**: حرفي واسع يضم جدول اليونيكود أوسع من الأسكي.
* **void**: بلا قيمة, يستخدم مع الوظائف التي لاترجع قيمة.

```cpp
int: integer size is 4 bytes.
short: integer size is 2 bytes.
long: integer size is 4 bytes.
bool: logical size of 1 byte.
float: float size is 4 bytes.
double: double the number of size 4 bytes.dl
char: craftsman from the ASCII table
wchar_t: Spacious craftsman table Unicode wider than ASCII.
void: the type that can be used with all types.
```


#### الأنواع الإضافية
* **signed int** : يساوي int, عدد صحيح حجمه 4 بايت
* **unsigned int**: عدد صحيح موجب لا يحمل إشارة حجمه 4 بايت.
* **unsigned short**: عدد صحيح موجب قصير لا يحمل إشارة حجمه 2 بايت.
* **unsigned long**: عدد صحيح موجب طويل لا يحمل إشارة حجمه 4 بايت.
* **signed char**: حرفي يمكن أن تكون قيمته سلبية، مدى قيمه هو [127+, 127-].
* **unsigned char** : حرفي موجب من 0 إلى 255.
* **long long**: عدد صحيح موجب طويل حجمه 8 بايت.
* **unsigned long long**: عدد صحيح موجب طويل لا يحمل إشارة حجمه 8 بايت.
* **long double**: عدد عشري موجب طويل لا يحمل إشارة حجمه 8 بايت.

### الأنواع المركبة
#### المصفوفات
:المصفوفات: هي عبارة عن حاوي تقوم بتخزين عدد من العناصر من نفس النوع وبترتيب محدد,أي هي عبارة عن خانات في الذاكرة متجاورة مع بعضها البعض, ولأجل الرجوع إلى خانة معينة يكفي ذكر اسم المصفوفة مع رقم الخانة, تعريف المصفوفة:

```cpp
// syntax:
// Type name[index];
// 1 2 3 4 5 6 items
// 0 1 2 3 4 5 index
int Arr[] = {1, 2, 3, 4, 5, 6};
int Arr1[6] = {1, 2, 3, 4, 5, 6};
int Arr2[100], Arr3[200];
int Arr4[6]; // 6 item:
Arr4[0] = 1;
Arr4[1] = 2;
 //....
Arr4[5] = 6;
```

بالنسبة للمصفوفات النصية فتكتب كالتالي:

```cpp
// -- String --
// 1 2 3 4 5 6 items
// 0 1 2 3 4 6 index
// H e l l o \0 char

char str[5] = "Hello"; // Error
char str1[6] = "Hello"; // Ok
cout << str1;

char str1[5] = {'H', 'e', 'l', 'l', 'o', '\0'}
```

:أخطاء قواعدية(نحوية يقوم المترجم بإعطاء رسالة خطأ ولايقوم بتنفيذ البرنامج)في تعريف المصفوفات:

```cpp
int Arr5[0]; // Error: 0 item
int Arr6 = {1,2,3,4,5,6}; // Error: 6 items
```

:أخطاء منطقية مثل نسيان تهيئة المصفوفة, أو الخروج عن حد(فهرس) المصوفة بعد تعريفها(وليس عند تعريفها), هذه الأخطاء قد تحدث بعد تنفيذ البرنامج ولايقوم المترجم بكشفها خلال مرحلة الترجمة:

```cpp
int Arr7[5] = {1, 2, 3, 4, 5};
             //0  1  2  3  4 index
             //1  2  3  4  5 items
cout << Arr7[4] // -> 5
  << '\n';
cout << Arr7[5] // -> 2686828
  << '\n';
cout << Arr7[6] // -> 945547239
  << '\n';
```

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

```cpp
int varable_ = 5;
static int Array[varable_];		// Error
----
const int varable_ = 5;
static int Array[varable_];		// Ok
----
static int c[5]; // Ok
```


## انظر أيضًا
* لغة السي
* الكائنات في لغة ++C
* المتغيرات في لغة ++C
* التحويل في لغة ++C

## مراجع

تصنيف:أنواع البيانات
قواعد لغة سي++