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

Continue

مغلق
بدأه ♥ حُوريّة ♥ في 22 أغسطس 2008 · 29 رد · 7,766 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#26

بالنسبة لوجود الgoto في الكود source level فلا توجد مشكله بتاتا في حال تم استخدام الgoto مكان الcontinue ، لكن فقط لن يسهل قرائه الكود وتتبعه ، يعني الأمر في الReadability ، لذلك يتم تجنبها خصوصا كلما يكبر المشروع ،،

بالنسبة للbinary level فلا فرق بينهم أيضا ، وكلاهم يولد نفس الكود ، كما سيلي ذلك :

المثال الأول :

#include <stdio.h>

int main () {
	int x = 0;
	while( x < 10) { //The condition... 
		x++;
		if( (x%2) == 0  )//Is it an even number?
			continue; //return to the condition

		printf("x = %d\n",x);
	}

	return (0);
}

بعد عمل disassembling للكود :

C:\Documents and Settings\wgdee\Desktop>gcc test.c -g -o a.exe
C:\Documents and Settings\wgdee\Desktop>gdb -q a.exe
(gdb) set dis intel
(gdb) disassemble main
Dump of assembler code for function main:
0x004012f0 <main+0>:    push   ebp
0x004012f1 <main+1>:    mov    ebp,esp
0x004012f3 <main+3>:    sub    esp,0x18
0x004012f6 <main+6>:    and    esp,0xfffffff0
0x004012f9 <main+9>:    mov    eax,0x0
0x004012fe <main+14>:   add    eax,0xf
0x00401301 <main+17>:   add    eax,0xf
0x00401304 <main+20>:   shr    eax,0x4
0x00401307 <main+23>:   shl    eax,0x4
0x0040130a <main+26>:   mov    DWORD PTR [ebp-0x8],eax
0x0040130d <main+29>:   mov    eax,DWORD PTR [ebp-0x8]
0x00401310 <main+32>:   call   0x401870 <_alloca>
0x00401315 <main+37>:   call   0x4013f0 <__main>
0x0040131a <main+42>:   mov    DWORD PTR [ebp-0x4],0x0
0x00401321 <main+49>:   cmp    DWORD PTR [ebp-0x4],0x9
0x00401325 <main+53>:   jg     0x40134d <main+93>
0x00401327 <main+55>:   lea    eax,[ebp-0x4]
0x0040132a <main+58>:   inc    DWORD PTR [eax]
0x0040132c <main+60>:   mov    eax,DWORD PTR [ebp-0x4]
0x0040132f <main+63>:   and    eax,0x1
0x00401332 <main+66>:   test   eax,eax
0x00401334 <main+68>:   jne    0x401338 <main+72>
0x00401336 <main+70>:   jmp    0x401321 <main+49>
0x00401338 <main+72>:   mov    eax,DWORD PTR [ebp-0x4]
0x0040133b <main+75>:   mov    DWORD PTR [esp+0x4],eax
0x0040133f <main+79>:   mov    DWORD PTR [esp],0x403000
0x00401346 <main+86>:   call   0x4018d0 <printf>
0x0040134b <main+91>:   jmp    0x401321 <main+49>
0x0040134d <main+93>:   mov    eax,0x0
0x00401352 <main+98>:   leave
0x00401353 <main+99>:   ret
End of assembler dump.
(gdb)

اما البرنامج الثاني :

#include <stdio.h>

int main () {
	int x = 0;
	lbl:
	while( x < 10) { //The condition... 
		x++;
		if( (x%2) == 0  )//Is it an even number?
			goto lbl;

		printf("x = %d\n",x);
	}

	return (0);
}

الDisassembling له :

C:\Documents and Settings\wgdee\Desktop>gcc test2.c -g -o b.exe
C:\Documents and Settings\wgdee\Desktop>gdb -q b.exe
(gdb) set dis intel
(gdb) disasemble main
Undefined command: "disasemble".  Try "help".
(gdb) disassemble main
Dump of assembler code for function main:
0x004012f0 <main+0>:    push   ebp
0x004012f1 <main+1>:    mov    ebp,esp
0x004012f3 <main+3>:    sub    esp,0x18
0x004012f6 <main+6>:    and    esp,0xfffffff0
0x004012f9 <main+9>:    mov    eax,0x0
0x004012fe <main+14>:   add    eax,0xf
0x00401301 <main+17>:   add    eax,0xf
0x00401304 <main+20>:   shr    eax,0x4
0x00401307 <main+23>:   shl    eax,0x4
0x0040130a <main+26>:   mov    DWORD PTR [ebp-0x8],eax
0x0040130d <main+29>:   mov    eax,DWORD PTR [ebp-0x8]
0x00401310 <main+32>:   call   0x401870 <_alloca>
0x00401315 <main+37>:   call   0x4013f0 <__main>
0x0040131a <main+42>:   mov    DWORD PTR [ebp-0x4],0x0
0x00401321 <main+49>:   cmp    DWORD PTR [ebp-0x4],0x9
0x00401325 <main+53>:   jg     0x40134d <main+93>
0x00401327 <main+55>:   lea    eax,[ebp-0x4]
0x0040132a <main+58>:   inc    DWORD PTR [eax]
0x0040132c <main+60>:   mov    eax,DWORD PTR [ebp-0x4]
0x0040132f <main+63>:   and    eax,0x1
0x00401332 <main+66>:   test   eax,eax
0x00401334 <main+68>:   jne    0x401338 <main+72>
0x00401336 <main+70>:   jmp    0x401321 <main+49>
0x00401338 <main+72>:   mov    eax,DWORD PTR [ebp-0x4]
0x0040133b <main+75>:   mov    DWORD PTR [esp+0x4],eax
0x0040133f <main+79>:   mov    DWORD PTR [esp],0x403000
0x00401346 <main+86>:   call   0x4018d0 <printf>
0x0040134b <main+91>:   jmp    0x401321 <main+49>
0x0040134d <main+93>:   mov    eax,0x0
0x00401352 <main+98>:   leave
0x00401353 <main+99>:   ret
End of assembler dump.
(gdb)

;كما نشاهد بدءا من أول تعلمية في البرنامج (في عنوان 0x0040131a فما قبل ذلك كله تهيئة للمكدس Function prolog) سنجد ان البرنامجين متطابقين تماما ،

والله أعلم :) .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#27

:ty:

وجدي

,.,.,.,.,.,..,.

,.,.,.,.,.,.

صراحة مافيه فرق بين goto و continue خصوصاً بهالمسال الموجود بالدرس...

موفقين يارب

bye

تعديل: آسفة مالي متأكدة من صيغة الشيفرة (كانت موجودة قبل التعديل)

تم تعديل هذه المشاركة بواسطة ♥رغـد♥ في 14 يوليو 2009 في 16:37

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#28

و طبعاً continue نموذجية و مخصصة لهيك شغلات...بنستعمل الأدوات نموزجياً و بشكلها المخصص افضل...

موفقين

bye

صدقوني افضل... :happy:

تم تعديل هذه المشاركة بواسطة ♥رغـد♥ في 14 يوليو 2009 في 17:16

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#29
اقتباس
هل تريدون أمثلة teeth_smile.gif

طبعا :)

#30

متنازلة عن الطلب...

آسفة

تم تعديل هذه المشاركة بواسطة ♥رغـد♥ في 15 يوليو 2009 في 05:35

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

هذا الموضوع مغلق.

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