PDA

View Full Version : حرفه ای: بررسی عملکرد کامپایلر در یک برنامه



sajjadrad
پنج شنبه 20 خرداد 1389, 19:18 عصر
با سلام خدمت دوستان
خسته نباشید.

قطعه کد زیر رو ببیینید:



int main()
{
char word[80];
do
{
cin>>word;
if (*word) cout<<"\t"\"<<word<<"\"\n";
}
while(*word);
}



خب در برنامه بالا ابتدا یک رشته با نام word و طول 79 تعریف میشه.
بعد در خط دوم دستور cin منتظر میمونه تا کاربر رشته ای رو وارد کنه.فکر کنید در این رشته عبارت the biter تایپ شده و دکمه enter رو بزنیم.سپس این رشته به حافظه میانی میره.دستور cin تو حافظه میانی از اول رشته تا خط فاصله رو میخونه (the) و به خط سوم میره.خط سوم بررسی میکنه که اگر word نال نبود رشته رو چاپ میکنه.
در فراخوانی بعدی دستور cin (دومین بار اجرای حلقه) ،cin عبارت را از بعد از خط فاصله در حافظه میانی میخونه (biter) به به خط بعدی میره.

حالا مشکل من سر شرط while هستش:
این شرط یک شرط بی نهایته.چون while به خونه اول رشته اشاره میکنه و تا وقتی که این خونه null نشه false نمیشه.
حالا مشکلم اینجاست که دسنور while در بار اول اجرای حلقه کدوم word رو مقایسه میکنه؟
یعنی آیا دفه اول word مساویه با the و دفه دومم word مساویه با biter???:اشتباه:

در کل آیا مقایسه ای که while میکنه با مقایسه ای که if میکنه فرقی داره؟
اصلا اینا کدوم word رو مقایسه میکنن.....؟

اگه یکی توضیح بده ممنون میشم...:قلب:
با تشکر از دوستان عزیز.

sasan_vm
پنج شنبه 20 خرداد 1389, 19:44 عصر
سلام
مقایسه while با if هیچ فرقی نمی کنه هر دو کاراکتر اول word را مقایسه می کنند ، اصلا گذاشتن شرط if
بی مورد چون شما نمی تونید از صفحه کلید کد null رو وارد کنید و برای همین یک حلقه بی نهایت است.

tdkhakpur
پنج شنبه 20 خرداد 1389, 20:50 عصر
خب در برنامه بالا ابتدا یک رشته با نام word و طول 79 تعریف میشه.

79 نه 80



ستور cin تو حافظه میانی از اول رشته تا خط فاصله رو میخونه (the) و به خط سوم میره.

حافظه میانی چرا خب داخل همان word قرار میدهد.

در فراخوانی بعدی دستور cin (دومین بار اجرای حلقه) ،cin عبارت را از بعد از خط فاصله در حافظه میانی میخونه (biter) به به خط بعدی میره.

چرا باید این کار را انجام بدهد - خب اجرای دوباره حلقه مثل اولین ورود میماند


حالا مشکلم اینجاست که دسنور while در بار اول اجرای حلقه کدوم word رو مقایسه میکنه؟

یعنی چی کدوم word خب اول word را بررسی میکند.

یعنی آیا دفه اول word مساویه با the و دفه دومم word مساویه با biter???:اشتباه:

نه وقتی ورودی توسط cin گرفته شود همیشه از ابتدای آدرس- شروع به پردازش میکند نه اواسط.

در کل آیا مقایسه ای که while میکنه با مقایسه ای که if میکنه فرقی داره؟
اصلا اینا کدوم word رو مقایسه میکنن.....؟

نه چه قرقی دارد داخل کدهای هر دو فرقی هست؟
خب مگر چند word دارید همیشه و همه جا اول آدرسها مد نظر هست مگر شما بهش بگید از کجا مد نظر بگیرد مانند


&word[1];

سي شارپ
جمعه 21 خرداد 1389, 19:26 عصر
با سلام، يك اصل مهم رو فراموش كرديد و اون اينه كه نامه آرايه در واقع يك اشاره گر ثابت به عنصر اول آراينه مي باشد. نكته اينجاست كه اشاره گر ثابت فقط به يك خانه مي تواند اشاره كند و اون عنصر اول است.
از يك اشاره گر ديگه استفاده كن كه به آرايت اشاره كنه مثل اين :
char *wordPtr;
wordPtr=word