PDA

View Full Version : سوال: مشکل در تقدم عملگر ها در C++‎



Anti Security
سه شنبه 29 مرداد 1392, 19:26 عصر
با سلام
در سوال زیر با توجه به تقدم عملگرها جواب باید 8 بشه اما چرا برنامه 6 رو چاپ میکنه؟


x=2 y=3

++x+y/2*4+(--y-x++);

omidshaman
سه شنبه 29 مرداد 1392, 20:28 عصر
چرا باید 8 بشه ؟
سمت چپ پرانتز که با این معادله

(x+1)+((y/2)*4)
که میشه 7
داخل پرانتز هم معادله اینه

(y-1)-x
که چون x قبلا ++ شده x,y دو تاشون 3 اند
پس جواب هست 3-2 که میشه -1
یعنی در مجموع جواب کل میشه 6

Anti Security
سه شنبه 29 مرداد 1392, 21:22 عصر
سلام
مگر نه اینکه بالاترین حق تقدم ماله پرانتزه؟
پس اول داخل پرانتز حساب میشه که میشه 0 و y=2 و x=3 و بعد میره سراغه اول جمله که x یکی بهش اضافه میشه یعنی x=4 و بعد y/2 که میشه 1 و بعد ضرب در 4 که میشه 4 و با 4 اولی جمع میشه که کلا میشه 8

omidshaman
سه شنبه 29 مرداد 1392, 21:34 عصر
نه این بر می گرده بهleft-associative بودن عملگره + یعنی این که اگر عملگر ما left-associative باشه اول اون سمت چپش انجام میشه بعد سمت راست یعنی پرانتز در مرحله اخر انجام میشه محاسباتش
اطلاعات بیشتر :
http://en.wikipedia.org/wiki/Operator_associativity
این جا هم یک جدول هست که تقدم و left to right یا right to left بودن عملگر ها توی C++‎‎ توش هست
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

Anti Security
سه شنبه 29 مرداد 1392, 21:45 عصر
لطفا یکم بیشتر درباره right to left توضیح بده من زبانم خوب نیست!

ممنون

omidshaman
سه شنبه 29 مرداد 1392, 22:10 عصر
left to right من اشتباه نوشته بودم ادیت کردم.
ببین شما فرض کن یک همچین عبارتی داری a#b#c که به جای # عملگر دلخاوه با حق تقدم یکسان می تونی زاری
حالا این جا کل عبارت حق تقدمش یکیه این جا کامپایلر از کجا باید بهمه که کد رو این جوری اجرا کنه

(a#b)#c
یا این جوری ؟

a#(b#c)
خب این جاست که کامپایلر میاد از operators associaty ها استفاده می کنه یعنی اگر مثلا به جا # عملگر + بود چون + left associety ه میاد اول سمته چپیه رو انجام میده یعنی اگر داشته باشیم
a+b+c
اینو کامپایلر اینجوری اجرا می کنه

(a+b)+c
یا توی سوال خودت عبارت y/2*4 چون تقدم * و / یکیه به خاطر left to right بودن * و / اول تقسیم انجام میشه بعد *

Anti Security
سه شنبه 29 مرداد 1392, 22:35 عصر
خیلی ممنون از وقتی که گذاشتی
جالبه که کتاب هایی که من در زمینه برنامه نویسی سی پلاس پلاس دیدم به این نکته هیچ اشاره ای نکرده اند
دوست عزیز لطف کن و به من یک منبع آموزشی(کتاب یا ویدیو یا...) خوب به من معرفی کن
بازم ممنون

omidshaman
چهارشنبه 30 مرداد 1392, 06:56 صبح
من کتاب فارسی نمیخونم ولی خب تاپیک درباره معرفی کتاب تو سایت زیاده بگردی پیدا می کنی. و این که توی کتاب هایی که دیدم فقط ++accelarated c چند جا به این نکته اشاره کرده بود.

Anti Security
چهارشنبه 30 مرداد 1392, 15:13 عصر
سلامی دوباره
دوست من ،من صفحه زیر را که بهم دادید مطالعه کردم البته به صورت تقریبی و به مشکلی برخوردم
در جدول اولویت ها گفته تقدم اول با suffix هست یعنی :

a++

و بعد با prefix :

++a
در صورتی که من همه جا برعکسش رو دیدم

لینک صفحه : http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

omidshaman
چهارشنبه 30 مرداد 1392, 19:08 عصر
اگر کتابی یا pdf ای اون جوری نوشته که بندازش بیرون اصلا نخون !
این 2 تا رو در نظر بگیر

int x=1;
cout<< ++x++;
و

int x=1;
cout<< (++x)++;
کد اول به خاطر مقدم بودن suffix اجرا نمیشه( ارور require lvalue میده )
ولی اگر پرانتز بزاریم اجرا میشه

Anti Security
چهارشنبه 30 مرداد 1392, 19:20 عصر
شرمنده من درست متوجه نشدم
می شه روی مثال زیر توضیح بدی
a=3

a++ * 3 + ++a

omidshaman
چهارشنبه 30 مرداد 1392, 19:38 عصر
خب اینی که مثال زدی چیز جالبی نیست اول ++a انجام میشه بعد ضرب بعد a++ بعد جمع (به خاطر همون Operator associativity ها )
خب همون مثالی که خودم گفتم رو در نظر بگیر
++x++
این اگر x++ یعنی همون چیزی که فکر می کنی تقدمش بیشتر بود این جوری اجرا میشد

(++x)++
و ارور نمیداد ولی اگر الان تست کنی ارور میده یعنی این مدلی اجرا میشه چون تقدم postifix بیشتره

++(x++) و این عبارت اصلا اجرا نمیشه چون ++x یک مقدار rvalue بر می گردونه ولی x++ متغیر lvalue میخواد
اگر rvalue و lvalue نمیدونی چی هستن بگو توضیح میدم.

Anti Security
چهارشنبه 30 مرداد 1392, 19:49 عصر
لطفا درباره rvalue و lvalue توضیح بده
اما در مورد مثال من ؛ من مثال را در کمپایلر نوشتم و جواب شد 16 که در این صورت اول a++ و بعد ++a و بعد ضرب در 3 و در اخر جمع اجرا میشه
اما این طور که شما میگی حاصل باید بشه 14

shahramlp
پنج شنبه 31 مرداد 1392, 01:04 صبح
a++ دقیقاً چگونه عمل می کند؟ (http://barnamenevis.org/showthread.php?369810-a-%D8%AF%D9%82%DB%8C%D9%82%D8%A7%D9%8B-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%B9%D9%85%D9%84-%D9%85%DB%8C-%DA%A9%D9%86%D8%AF%D8%9F)