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

سؤال عن ;;;;;;

بدأه khaled_prg في 5 أكتوبر 2010 · 7 رد · 525 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

بينما كنت أجرب بعض أفكاري البرمجية (الفضولية بعض الشيء), قمت بكتابة الكود الآتي :

#include <iostream>
using namespace std;
int main()
{
    cout<<"Hi"<<endl;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    system("pause");
    return 0;
}

و الغريب في الأمر أن الكومبايلر لم يعترض على الكود !, فقد كانت النتائج مذهلة .. تم إظهار الكلمة Hi !!!

نعلم جميعا أن كل أمر برمجي لابد و أن ينتهي بالنقطة الفاصلة حيث يأتي دورها في إخبار المترجم بانتهاء الأمر البرمجي لينتقل المترجم إلى بقية الأوامر الموجودة في الكود وصولا إلى النهاية. ولكن ماذا لو وضعنا أكثر من نقطة فاصلة بعد الأمر البرمجي !؟

بانتظار الإجابة, تحياتي.

#2

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

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

#3

اوكى شوف بقى

انتا ممكن تعمل الكود التالى و يشتغل

cout << "hello world" << endl; cout << "Hello Again" << endl;

سيعمل جربه بنفسك

اذا ف ال ; هى ناهية الجملة فأذا قمت بعمل جملتين فى نفس السطر و بناهيتين (اقصد ال ;) ستعمل ؟ نعم ستعمل انت تكتب ناهيتين على كل جملة و ليست مشكلتنا فى ترتيب و تنسيق السطر اذا فلو قمت انت بعمل جمل فارغة و وضعت ال ; فى نهاية الجملة الفارغة ستعمل انتا فى برنامجك هذا كتبت جمل فارغة كثيرة و لكى تنهى الجملة يجب وضع ال ; و هذا بالظبط ما فعلته انت ؟؟؟

وضحت ؟؟؟؟

اى خدمات

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#4

و عليكم السلام...

الـ statement التي تتكون من فاصلة منقوطة فقط, تسمى null statement في C و ++C على حد سواء. قد تجد فكرة مشابهة لها في لغات أخرى كـ Assembly و تسمى في بعض المنصات NOP أو no operation. بمعنى أن ما تقوم به هو أن لا تقوم بأي شيء. فائدتها أننا أحياناً, نحتاج لها. مثلاً, نريد جمع مكعب الأعداد في مدى معين - من سالب ثلاثة إلى ثلاثة مثلاً!

int sum = 0;
for(int n = -3; n <= 3; sum += n++);

أو كما هو الحال في الـ implementation الشهير لـ strcpy من كتاب K&R:

// src & dest are pointers to char arrays.
// forget the details for moment!
// src is the source string.
// dest is the destination string.
while(*dest++ = *src++);

ببساطة إن كان هناك موضع في اللغة يحتاج إلى statement فإنه يمكن استخدام null statement إن كنت لا تريد تنفيذ شيء على الإطلاق. مثلاً, assert تستخدم في حالة الـ debugging و في حالة تفعيل الـ optimizations في المترجمات فإنه يتم إزالتها عن طريق استخدام null statement. هناك طرق أخرى لعمل implementation لـ assert و لكن هذه إحداها.

تحياتي..

4
#5

كذلك الكود التالي يعمل بنجاح ....

//hello.c
int main(void)
{
printf("Hello World!");
}
#6

اخى الكريم

هو يعتبر كل فاصله منقوطه

هى سطر برمجى

ولكنه لا يحتوى على اوامر لتنفيذها

وبالتالى فهو كل ما يأتى الى السطر ولا يجد به شىء يتحرك الى الذى يله

وهكذا

حتى يكتمل الكود

بالتوفيق :)

Software Developer
Mahmoudkelany.com


 

#7

السلام عليكم

الآن اتضحت الفكرة, أشكركم على المساعدة و أخص بالذكر أخي الفاضل و مشرفنا الأكبر خالد الشايع فقد أعجبتني إجابته كثيرا :wub:

اقتباس
كذلك الكود التالي يعمل بنجاح ....

//hello.c
int main(void)
{
printf("Hello World!");
}

كيف يتعرف المترجم على الدالة printf و انت لم تقم بتضمين المكتبة stdio.h !؟ :wacko: :blink:

ملاحظة :

لماذا كثرت المشاركات في هذا الموضوع بينما لم يشارك في هذين الموضوعين إلا محمد علاء الدين و عمرو الصعيدي الذي اختفى في ظروف غامضة !!! :

التحقق المتقدم من صحة الإدخال !

كيفية مسح سطر محدد بدون التأثير على بقية الأسطر و كذلك التلوين

مع العلم أنني متأكد أن جميع المشاركين في هذا الموضوع يعرفون إجابة سؤالي غير مشترك أو اثنان لا أريد تسميتهم !

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 6 أكتوبر 2010 في 14:58

#8
اقتباس
كيف يتعرف المترجم على الدالة printf و انت لم تقم بتضمين المكتبة stdio.h !؟

في لغة السي ... فإن المترجم لا يشترط وجود prototype للداله قبل أن يتم إستدعائها .... فهو لن يعطي error إذا لم يجد prototype ل printf قبل أن يتم إستخدامها ...

فبالتالي لن يعطي رسالة خطأ (بعكس ال سي++ )...... فتتم الترجمه بنجاح ... أما ال linker فعندما يجد إسم الداله printf يقوم بالبحث عليها في ال object files الخاصه بالمترجم .... فبما ان هناك داله إسمها printf في ال object files الخاصه بال std lib ... فالبتالي يقوم بتنفيذ هذه الداله بنجاح ..... (و هذا لا يحدث في السي++ التي تشترط وجود declaration و definition للداله قبل إستخدامها! )

اقتباس
مع العلم أنني متأكد أن جميع المشاركين في هذا الموضوع يعرفون إجابة سؤالي غير مشترك أو اثنان لا أريد تسميتهم !
:D
1

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