View Full Version : سوال در مورد 2 نکته جالب در ++C
Ahmad Chehreghani
یک شنبه 16 دی 1386, 20:15 عصر
با سلام
چند روز پیش یک PDF درباره ++C داشتم می خوندم که 2 تا نکته جالب دیدم که برام هم جالب بود.
اولی اینه
http://www.cheit.net/img/01.jpg
و دمی اینکه توی اون PDF نوشته بود ماتریس ها در ++C برخلاف پاسکال به جای سطر و سطون ، اولین اندیس ستون و دومی سطر است!!! اما من تو کتاب جعفر نژاد برعکس این موضوع رو خوندم.
راستی برنامه اولی رو تست کردم وجوابی که گفته بود درست بود.
و حالا سوال من اینه که تو قسمت اولی بر چه اساسی اینطوری عمل می کنه؟
و دومی انکه آیا درست گفته یا خیر.
موفق باشید.
emad_67
یک شنبه 16 دی 1386, 22:45 عصر
خیلی جالب بود. ظاهرا مثل stack عمل میکنه و وقتی از عملگر های افزایشی استفاده میشه یه همچین حالتی به وجود میاد. ولی بازم درست نفهمیدم که علتش چیه.
اون خطی که زیر تصویر نوشته هم غلطه چون اولویت >> از چپ به راست هست و نه از راست به چپ.
در مورد سوال دوم هم توی c++ اندیس اول سطر و اندیس دوم ستون رو نشون میده بنابراین غلط گفته.
Ahmad Chehreghani
یک شنبه 16 دی 1386, 23:24 عصر
منم توش موندم چون با یک تابع هم نشونش داده ، مثلا گفته ما عدد 3 رو تو n قرار می دیم و بعد به تابع عدد n و بعد n++ رو می دیم یعنی دو تا پارامتر و حالا به تابع می گیم مثلا a,b رو نمایش بده ، اصولا باید به جای n عدد 3 و به جای n++ که همون b ما هست 4 رو نشون بده اما برعکس نشون می ده یعنی به جای a عدد 4 رو نشون میده و b رو عدد 3 نشون میده، من این رو هم تست کردم و دیدم درست می گه!!!
والا چی بگم!!!
emad_67
دوشنبه 17 دی 1386, 00:05 صبح
یه همچین شکلی منظورته:
void print(int a,int b)
{
cout<<a<<" "<<b<<endl;
}
void main()
{
int n=3;
print(n,n++);
}
در این حالت 2 تا 3 چاپ میشه و منطقی هم هست. درست نفهمیدم نظورت چیه؟
emad_67
دوشنبه 17 دی 1386, 00:23 صبح
فکر میکنم جواب سوال رو فهمیدم.
عملگر های افزایشی یا کاهشی از سمت راست به چپ در عملیات شرکت میکنن بنابراین وقتی مینویسیم:
int n=3;
cout<<n++<<n++;
در ابتدا ++n ایی که در آخر قرار گرفته محاسبه میشه و چون در اینجا ++ بعد از n اومده یعنی اینکه عملگر پس افزایشی هست بنابراین مقدار n همون 3 در جریان خروجی باقی میمونه یعنی تا این مرحله یه همچین شکلی رو داریم:
cout<<n++<<3;
و بعد موقعی که به ++n اولی میرسه مقدار n برابر 4 شده و بعد این 4 هم در جریان خروجی قرار میگیره یعنی :
cout<<4<<3;
بقیش هم که دیگه واضحه. اولویت >> از چپ به راست هست پس 43 در خروجی چاپ میشه.
ICEMAN
دوشنبه 17 دی 1386, 11:05 صبح
لینک اون PDF و میشه بذاری
emad_67
دوشنبه 17 دی 1386, 15:03 عصر
میتونی از لینک زیر دانلود کنی. 7 قسمت به صورت pdf هست.
اگه اون قسمت هایی رو هم که صحبت شد می خوای توی فایل 5 و 6 هستند.
http://www.forum.majidonline.com/showthread.php?t=53712
Ahmad Chehreghani
دوشنبه 17 دی 1386, 20:13 عصر
ببخشید نبودم.
من هم اینتور فکر می کنم چون وقتی به جمله اول شما 2 تا چیز اضافه کردم جواب نیز به این صورت بود.
cout<<n<<n++<<n++<<n
اول می نویسه 5و بعد 4 و بعد 3 و دوباره 3
!!!
موفق و پیروز باشید.
emad_67
دوشنبه 17 دی 1386, 20:35 عصر
من هم اینتور فکر می کنم چون وقتی به جمله اول شما 2 تا چیز اضافه کردم جواب نیز به این صورت بود.
cout<<n<<n++<<n++<<n
اول می نویسه 5و بعد 4 و بعد 3 و دوباره 3
!!!
این حالت هم مثل همونی که در بالا توضیح دادم هست. زیاد فرقی نمیکنه و کلا به خاطر اولویت عملگر ها اینجوری میشه.
404_3140
چهارشنبه 19 دی 1386, 08:09 صبح
به این طور چیزا گفته می شه undefined behavior. این رو داریم که مثلا هنگام اجرای یک تابع، اول باید آرگومان هاش محاسبه بشن، اما این که آرگومان ها به چه ترتیبی محاسبه بشن مسئله ای هست که کامپایلر خودش تصمیم می گیره، مثلا گاهی برای optimize کردن طور خاصی عمل می کنه. این لینک (http://gcc.gnu.org/bugs.html#nonbugs_c) توضیحات خوبی در مورد sequence points داره.این (http://rafb.net/p/8LpsFS12.html) مثلا یک مثالشه که البته توی همون لینک قبلی هم مثالهایی هست...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.