تضامنًا مع حق الشعب الفلسطيني |
المتغيرات في سي++
يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. (فبراير 2016) |
المتغيرات هي عبارة عن حاويات لها حجم معين (كل نوع له حجم) تخزّن البيانات، تعد من أساسيات البرمجة ولا يمكن لبرنامج أن يعمل من دونها، تتكون من عدة أنواع لكل نوع حجم مخصص له في الذاكرة لايمكن أن يتجاوز هذا الحجم، إلا إذا كان يستخدم أنواع ديناميكية تستخدم معها المؤشرات.
المتغيرات الرياضية
هو تمثيل رمزي يدلّ على كمية أو تعبير. بعض الأمثلة تتضمن درجة حرارة الغرفة وارتفاع صوت الكلام. يمثل المتغير عادة باستخدام رمز أو حرف أو كلمة مثل 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;
لايمكن تغير قيمة المتغير X إلا عن الطريق الموشرات، ولايمكنك أيضا تعريف متغير بدون اسناد قيمة له، لذلك ينبغي عليك تعين قيمة متغير من البداية فقط.
بالنسبة لتغير قيمة المتغير عن طريق المؤشرات، تابع المثال التالي:
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)