مقارنة حرف المصفوفات مع == مشغل في ج
-
05-07-2019 - |
سؤال
وأنا أعلم أن الطريق الصحيح مقارنة "السلاسل" في C باستخدام strcmp
, ولكن الآن حاولت مقارنة بعض الحرف المصفوفات مع ==
المشغل ، وحصلت على بعض نتائج غريبة.
نلقي نظرة على التعليمات البرمجية التالية:
int main()
{
char *s1 = "Andreas";
char *s2 = "Andreas";
char s3[] = "Andreas";
char s4[] = "Andreas";
char *s5 = "Hello";
printf("%d\n", s1 == s2); //1
printf("%d\n", s3 == s4); //0
printf("%d\n", s1 == s5); //0
}
أول printf
طباعة بشكل صحيح 1
, ، مما يشير إلى أنها ليست متساوية.ولكن يمكن للشخص أن يفسر لي لماذا, عندما يقارن الحرف المصفوفات ، ==
هو العودة 0
?
هل يمكن لأحد أن يشرح لي لماذا أول printf
هو العودة 1
(أي أنها متساوية) و الحرف المصفوفات هي العودة 0
?
المحلول
وو== هو المقارنة بين عنوان الذاكرة.
فمن المحتمل أن المترجم الخاص بك يجعل S1 و S2 نقطة لنفس بيانات ثابتة لتوفير مساحة.
وأي. و"أندرياس" في أول سطرين من التعليمات البرمجية يتم تخزين البيانات في تنفيذ الخاص بك. يقول معيار C هذه السلاسل ثابتة وهكذا فقد optomized مؤشرات اثنين للإشارة إلى نفس التخزين.
ووشار [] خطوط خلق متغير عن طريق نسخ البيانات إلى متغير وهكذا يتم تخزينها في عنوان مختلف على المكدس أثناء التنفيذ.
نصائح أخرى
واه ... عندما يطبع ==
1، وهو ما يعني أنها <م> هي م> على قدم المساواة. انها مختلفة من strcmp، والتي ترجع النظام النسبي من السلاسل.
وأنت تقارن عناوين وليس السلاسل. أول هما مستمر وسيتم إنشاء مرة واحدة فقط.
int main()
{
char *s1 = "Andreas";
char *s2 = "Andreas";
char s3[] = "Andreas";
char s4[] = "Andreas";
char *s5 = "Hello";
printf("%d\n", s1 == s2); //1
printf("%p == %p\n", s1, s2);
printf("%d\n", s3 == s4); //0
printf("%p != %p\n", s3, s4);
printf("%d\n", s1 == s5); //0
printf("%p != %p\n", s1, s5);
}
والناتج على جهاز الكمبيوتر الخاص بي، ولكن تحصل على هذه الفكرة:
1
0x1fd8 == 0x1fd8
0
0xbffff8fc != 0xbffff8f4
0
0x1fd8 != 0x1fe0
وانتظر ثانية ... 1 يعني صحيح، 0 يعني كاذبة. لذلك التفسير الخاص بك هو جزئيا إلى الوراء. أما لماذا يبدو أن السلسلتين الأولى لتكون مساوية: المترجم بنيت هذه السلسلة المستمرة (S1 / 2) مرة واحدة فقط
. وs1 == s2
يعني "(char*) == (char*)
" أو أن العناوين هي نفسها.
ونفس الشيء بالنسبة لs3 == s4
. هذا هو " صفائف تسوس إلى مؤشرات " في العمل .
وكان لديك معنى نتيجة الخطأ المقارنة:
0 == 0; /* true; 1 */
42 == 0; /* false; 0 */
"foo" == "bar"; /* false (the addresses are different); 0 */
كل القيم من s1 خلال s5 لا شار أنفسهم, أنهم المؤشرات إلى شار.إذا ما كنت مقارنة هي عناوين الذاكرة من كل سلسلة ، بدلا من السلاسل نفسها.
إذا قمت بعرض عناوين وهكذا يمكنك أن ترى ما عوامل المقارنة هي في الواقع تعمل على:
#include <stdio.h>
int main() {
char *s1 = "Andreas";
char *s2 = "Andreas";
char s3[] = "Andreas";
char s4[] = "Andreas";
char *s5 = "Hello";
printf("%p\n", s1); // 0x80484d0
printf("%p\n", s2); // 0x80484d0
printf("%p\n", s3); // 0xbfef9280
printf("%p\n", s4); // 0xbfef9278
printf("%p\n", s5); // 0x80484d8
}
بالضبط أين السلاسل المخصصة في الذاكرة تنفيذ محددة.في هذه الحالة, s1 و s2 تشير إلى نفس ثابت كتلة الذاكرة ، ولكن لا أتوقع أن السلوك المحمولة.
وأنت لا يمكن المقارنة بين السلاسل، ولكن يمكنك مقارنة المؤشرات.