الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

فكر معي فى معني هذا الثابت

بدأه C++er في 11 مايو 2011 · 7 رد · 898 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الثوابت فى السي++ قد تجعل شعرك يشيب، و هذا ما جعل Bruce Eckel يخصص لها فصل كامل فى كتابه Thinking in Cpp.

حاول أن تقرأ الثوابت التاليه و تخبرني التالي:

1 - أيهم خطأ و أيهم صحيح، و لماذا (إن أستطعت)؟

2 - بالنسبه للصحيح منهم ما معناه؟

const int* x;

int* const y;

int const* z;

const* int w;

const int* const a;

int const* const b;

const* int const c;

const int d;

int const e;

سأضع إجابتي لاحقا.

و الله ولي التوفيق

4

مدونتي: C++ Tips and Tricks

#2

السلام عليكم

يسرني أو أكون أول من يرد على هذا الموضوع الرائع و المفيد :)

بصراحة, اشتقنا إلى تمارينك التي تجعل الشعر يقف من شدة التفكير ! :lol:

هذه محاولتي للإجابة :

const int* x;//مؤشر متغير لثابت

int* const y;//مؤشر ثابت لمتغير

int const* z;//مؤشر متغير لثابت

const* int w;//نفس الإعلان السابق

const int* const a;//مؤشر ثابت لثابت

int const* const b;//نفس الإعلان السابق

const* int const c;//نفس الإعلان السابق

const int d;//ثابت

int const e;//نفس الإعلان السابق

بانتظار التصحيح.

تم تعديل هذه المشاركة بواسطة khaled_prg في 11 مايو 2011 في 11:52

#3

ملاحظة :

أرجو منك ن تضيف الإعلانات الممكنة لــ :

  • مؤشر متغير لمؤشر متغير
  • مؤشر متغير لمؤشر ثابت
  • مؤشر ثابت لمؤشر متغير
  • مؤشر ثابت لمؤشر ثابت
  • و ...
#4

و علیکم السلام و الرحمة..

موضوع جمیل فعلا، بارک الله فیکم،

اولا بالنسبة للثوابت مع المؤشرات کما نعلم یوجد ثلاث حالات:

*مؤشر بشیء ثابت، A pointer to a constant object

*مؤشر ثابت بشیء، A constant pointer to an object

*و مؤشر ثابت بشیء ثابت، A constant pointer to a constant object

و دائما انا اخطأ فی هذا، لکن رأیت فی کتاب حل لتمییز هذه الحالات حین القرائة:

ان نقرأهم من الیمین إلی الیسار مثلا:

const int* x;

فهذا یعنی: a pointer to an integer that is const

و

int* const y=&a;

و هذا یعنی: a const pointer to an integer

ایضا یوجد حل آخر، const یتعلق بما فی یساره، لکن ان ما کان شیء فی یساره ، فیتعلق بما کان فی یمین الجملة..

و ثانیا، لا فرق بین هذان:

int* x;
int *x;

و ثالثا، لا فرق بین هذان ایضا:

const int x=10;
int const x=10;

و الأکواد:

1-

const int* x;

صحیح و یعنی مؤشر بثابت من نوع int

2-

int* const y;

صحیح ایضا و یعنی مؤشر ثابت بمتغیر من نوع int

(تنبیه: الکود بشکله الحالی بخطأ، یعنی یحتاج بمقدار أولیة)

3-

int const* z;

علی ما یبدو هذا ایضا کمثل الکود الأول یعنی مؤشر بثابت من نوع int،

کتبت کود لأری النتیجة:

#include <iostream>
using namespace std;

int main()
{
	const int x=10;
	int const* p=&x;
	cout<<*p
		<<endl;


	const int y=20;
	p=&y;
	cout<<*p
		<<endl;

	system("pause");
	return 0;
}

بشکل استنتاجی ، کمثل القانون الثالث یمکننا نبدل بین int و const ، یعنی

"int const"* z;
"const int"* z;

(تنبیه: طریقة کتابتی لیس صحیح)

4-

const* int w;

خطأ،

ما لی دلیل لکن اظن لا یمکن هذا:

const*

و لا یمکننی اتفلسف کمثل السابق، لأن مسافة بین const و int biggrin.gif

و ایضا اصبحت متأکد حینما رأیت هذا بخطأ فی VS

5-

const int* const a;

حسنا،صحیح و هذا هو من نوع الثالث، یعنی مؤشر ثابت بثابت من نوع int

لا أظن نحتاج بالبرهان و الآیة :)

(تنبیه: ایضا هذا یحتاج بInitializer کمثل السابق و بشکله الحالی بخطأ )

6-

int const* const b;

هذا صحیح ایضا، و یتساوی مع الکود السابق،

و الدلیل ، الدلیل الذی قلت فی رقم 3

( تنبیه: هذا ایضا یحتاج بinitializer ، لأن المؤشر ثابت و یحتاج بInitializer و بشکله الحالی بخطأ)

7-

const* int const c;

بخطأ،

والدلیل، دلیل رقم 4

8-

const int d;

int const e;

و صحیح،

الدلیل، القانون الثالث..

ننتظر لرد الأستاذ علاء الدین حتی نتأکد

اضافة:

یبدو تأخرت کثیرا :P

ما کانت ردود الأعلی موجود :)

تم تعديل هذه المشاركة بواسطة C77431 في 11 مايو 2011 في 14:08

4
#5

السلام عليكم

موضوع جميل ونافع

موضوع لي بمنتديات مجتمع qt له علاقة بهذا الموضوع ايضاً

كنت ضيفة بمنتدى الأخوان الكرام محمد العبدلي واحمد sudanix

سأكون متابعة معكم لهذا الموضوع ايضاً

اطيب المُنى

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#7

لم اقم بوضع قيم للثوابت حتى لا تظهر الإجابه.

الأخ khaled_prg للأسف ليس كل إجاباتك صحيحه و ستعلم بعد قليل لماذا، الأخ C77431 ما شاء الله عليك حلولك كلها صحيحه.

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

int* const w;
const int* x;

بتطبيق الطريقه المذكوره على المثال الأول ستجد لديك جزئين const w و int و حيث ان w مؤشر لذا ستقرأ كالتالي: w هو مؤشر ثابت لـــرقم.

بتطبيقها على المثال الثاني ستجد لديك جزئين هما x و const int و حيث ان x هو مؤشر لذا ستقرأ كالتالي: x هو مؤشر لــثابت رقمي.

// مؤشر لثابت رقمي
const int* x;

// مؤشر ثابت لرقم
int* const y;

// مؤشر لثابت
int const* z;

// خطأ: لعدم وجود نوع للقيمه التى يشير لها المؤشر
const* int w;

// مؤشر ثابت ارقم ثابت
const int* const a;

// مؤشر ثابت ارقم ثابت
int const* const b;

// خطأ: لعدم وجود نوع للقيمه التى يشير لها المؤشر
const* int const c;

// رقم ثابت
const int d;

// رقم ثابت
int const e;

و الله ولي التوفيق

2

مدونتي: C++ Tips and Tricks

مواضيع مشابهة