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

المقارنة بين نصّين باستخدام (==) ، بدون مكتبات مساعدة ؟

بدأه Abdullah.Alshammeri في 10 مايو 2010 · 8 رد · 1,315 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ،

ما أعرفه ، أنه ولمقارنة متغيرين يحملان نص معين ، فانه يجب أن أقارن كل بحرف بالمقابل حتى أقرر ان كانا متطابقين ، أو أن استخدم stl::string كحل بديل . لكن أمامك هذا البرنامج ، الذي يقارن بين نصين وينجح في ذلك حيث يذكر أنهما متطابقين ، اذا كانا كذلك :

#include <stdio.h>
int main()
{
	if( "XYZ" == "XYZ" ){
		printf("they are equal");
	}
	else{
		printf("they are not equal");
	}
	getchar();
	return 0;
}

- من متى ولغة السي/السي بلس ، تستطيع المقارنة بين نصين ؟

- تأكدت باستخدام Visual C++ 2010 Debugger ، أنه لايتم استدعاء أي معامل من نوع == ، ويبدو أن هذا موجود في قلب اللغة - في تعريفها . هل الأمر بهذه السهولة في لغة السي ، حتى يمكن المقارنة بين نصين باستخدام المعامل == فقط ؟ أم أن هناك شيء خفي يحدث دون أن أراه أو ألاحظه ؟

1

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

الشيء الخفي هو ان "XYZ" يرجع مؤشر لمكان في الذاكرة يخزن النص XYZ، و بالتالي المعامل == هنا يقارن بين مؤشرين و يجد انهما متساويين

3
#3

عندما يحدث ان يتواجد نصين ثابتين متطابقين يتم حجز لهم symbol واحد فقط و يتم الإشاره إليه من خلال اى مكان تم استخدامه به و عندما يبدأ البرنامج عمله يتم تحميل هذا النص مره واحده و حيث ان جميع الأماكن المستخدم فيها هذا النص ستشير لنفس المكان بالذاكره لذا عند المقارنه بينهم سيكون الناتج true لإنهم جميعا يشيروا لنفس المكان.

إذا كانت عملية المقارنه تتم لوضع قيمه داخل متغير boolean ففى وضع الـ debug سيتم المقارنه بينه % بإستخدام cmp و يتم وضع القيمه بالمتغير بإستخدام sete اما فى وضع الـ release و مع تفعيل الـ optimization فسيتم حذف المقارنه و يتم ابدلها بالقيمه الخاصه بها.

إذا كانت عملية المقارنه تتم كشرط لجملة if فى وضع الـ debug سيتم تحويل كود الحالتين داخل الملف التنفيذى و سيتم تنفيذ شرط الـ true فقط اما فى وضع الـ release و مع تفعيل الـ optimization فسيتم حذف كود المقارنه بأكمله و سيتم ترك فقط الكود الذى سيتم تنفيذه فى حالة true.

هذا الكلام ينطبق على VC++ و Intel.

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 11 مايو 2010 في 01:17

4

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

#4

هل تقصدون أن "XYZ" لايوجد منه الا نسخة واحدة في الذاكرة حتى لو كتبته مئة مرة ؟ وذلك لتطابق النص ؟

ماكنت أفهمه هو أن أي نص أنشئه سيتم تخزينه في مكان مختلف حتى لو تطابق النص ، وبالتالي يختلف العنوان .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

اذا كتبته مباشرة في الكود "XZY" فنعم، كل مرة تكتب بها هذا النص سيكون نفس المكان

اما لو قمت بتركيبه بطرق اخرى، فسيكون له مكان مختلف

#include <stdio.h>

int main()
{
   char *a = "abc";
   char *b = { 'a', 'b', 'c' };

   printf("a -> %d\n", (int)(a == "abc"));
   printf("b -> %d\n", (int)(b == "abc"));

   return 0;
}

http://codepad.org/og4xF1Fa

2
#6
اقتباس

اما لو قمت بتركيبه بطرق اخرى، فسيكون له مكان مختلف

إذا قمت بتركيبه بطرق اخرى لن يكون const char* و بالتالى سيفقد ميزة تطبيق الـ optimization عليه و قت ترجمة الكود.

المصفوفه b بالتأكيد لا تتساوى مع a و السبب ان a هو مؤشر لـ const و بالتالى لن تستطيع تغيير ما يشير إليه و لكن يمكنك تغيير قيمته هو .

النص "abc" لا يتساوى مع الحروف المكونه له إذا كانت منفصله لإن اللغه تفرق ما بين const char و const char*.

امر اخر تعريف المصفوفه b خاطئ و عندما حاولت ترجمته على مترجم vc++ و Intel رفض و السبب too many initializers.

اقتباس
هل تقصدون أن "XYZ" لايوجد منه الا نسخة واحدة في الذاكرة حتى لو كتبته مئة مرة ؟ وذلك لتطابق النص ؟

نعم هذا صحيح و تسمى هذه الخاصيه داخل مترجم مايكروسوفت و انتل بـ String Pooling و تستخدم لتصغير حجم الملف التنفيذى الناتج و ايضا هذه الخاصيه تجعل النص المحمل بالذاكره read-only.

اقتباس
ماكنت أفهمه هو أن أي نص أنشئه سيتم تخزينه في مكان مختلف حتى لو تطابق النص ، وبالتالي يختلف العنوان .

إذا كان النص literal داخل الكود سيتم حذف أى نسخ متشابهه منه و ترك واحده فقط، اما إذا كانت النصوص variable فيمكنك حدوث تشابه فهذا يتم اثناء الـ runtime.

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

1

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

#7

كل هذا يعمتد على وضع الـString Pooling ، فعندي مثلا تكون نتيجة المقارنة FALSE

:P

2

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#8

الله يكرمك ياشمرى ,, بالأمس كتبت دالة معينة وفى داخلها كنت أقوم بمقارنة نصين باستخدام المعامل == وظللت أبحث عن سبب المشكلة ولم أتوصل إلى شئ ولم أجد بداً إلا استخدام strcmp أو كتابة دالة أخرى للمقارنة والآن عرفت السبب :blush:

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#9

@Ghost : الشكر لله ثم للأخوة الذين أجابوا :/ .

واضح الان ، بحثت أيضاً عن String Pooling في الفيجوال سي :

http://msdn.microsof...28VS.80%29.aspx

شكرا لكم .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…