PDA

View Full Version : سوال: چرا محاسبه این عبارت چنین است؟



erebos928
پنج شنبه 13 آبان 1395, 03:29 صبح
شاید برای خیلی ها جواب ساده باشه. من جوابشو میدونم ولی نمیدونم چرا؟ کد زیر رو در نظر بگیرید در سی شارپ:
x=0;
x-=++x;
لطفا موضوع ++ قبل از متغیر یا بعدش رو مطرح نکنید. موضوع اون نیست. برای محاسبه من اینجوری عمل می کنم که معادل جمله دوم رو می نویسم:
x=x-(++x)
حالا چون عملگر یگانه ++ اولویت بالاتری داره ابتدا اجرا میشه و مقدار x رو میکنه 1. بعد نوبت عملگر منهاست که 1-xرو حساب می کنه. چون حالا دیگه ایکس 1 هست قاعدتا جواب باید صفر باشه. اما در عمل این اتفاق نمیفته و جواب -1 هست. شاید اینطور توجیه کنیم که مقدار ++x بعد از محاسبه در یک مکان موقت حافظه (جایی غیر ازx )ذخیره میشه. اما حالا اگه این عبارت رو حساب کنیم:
x=-(++x)+x که در اون جابجایی نسبت به بالایی انجام شده، این بار نتیجه صفره. در صورتی که اگر فرض ذخیره موقت درست باشه اینجا هم باید منفی یک باشه.

csharp.net
پنج شنبه 13 آبان 1395, 08:43 صبح
سلام دوست عزیز
در اصل اینطور محاسبه میشه بر طبق اولویت عملگرها



x= x -(++x)

x= 0 - (1)


یعنی به قول شما x بعد از مساوی مقدارش صفره و هیچ تغییر نمی کنه اما x بعدی یعنی x++ تغییر می کنه و مقدارش میشه 1 ... در نتیجه 1-0 میشه -1 ...

در مورد دوم هم عملگر یگانی که قبل از پرانتز میاد اولویت داره یعنی (x++)- میشه 1- و بعد با 1+ جمع میشه و جواب صفر میشه

نکته خیلی مهم اینه که اگر بعد از پرانتز x دچار تغییرات بشه رو x های بعدی هم اعمال میشه یعنی اگر تو مثال زیر

x=-(++x) + x چون به اولین x بعد از پرانتز یک واحد اضافه شده پس x آخر هم 1 میشه ولی تو مثال زیر
x=x-(++x) چون اولین x بعد از پرانتز 0 ه و هیچ تغییری نکرده در نتیجه x آخر هم صفره و با ++ یک واحد بهش اضافه میشه

لینک زیر رو هم ببینید

اولویت عملگرها (http://www.w3-farsi.com/%d8%b9%d9%85%d9%84%da%af%d8%b1-%d9%87%d8%a7%db%8c-%d8%b3%db%8c-%d8%b4%d8%a7%d8%b1%d9%be/)

erebos928
پنج شنبه 13 آبان 1395, 16:16 عصر
سلام دوست عزیز
در اصل اینطور محاسبه میشه بر طبق اولویت عملگرها



x= x -(++x)

x= 0 - (1)


یعنی به قول شما x بعد از مساوی مقدارش صفره و هیچ تغییر نمی کنه اما x بعدی یعنی x++ تغییر می کنه و مقدارش میشه 1 ... در نتیجه 1-0 میشه -1 ...

در مورد دوم هم عملگر یگانی که قبل از پرانتز میاد اولویت داره یعنی (x++)- میشه 1- و بعد با 1+ جمع میشه و جواب صفر میشه

نکته خیلی مهم اینه که اگر بعد از پرانتز x دچار تغییرات بشه رو x های بعدی هم اعمال میشه یعنی اگر تو مثال زیر

x=-(++x) + x چون به اولین x بعد از پرانتز یک واحد اضافه شده پس x آخر هم 1 میشه ولی تو مثال زیر
x=x-(++x) چون اولین x بعد از پرانتز 0 ه و هیچ تغییری نکرده در نتیجه x آخر هم صفره و با ++ یک واحد بهش اضافه میشه

لینک زیر رو هم ببینید

اولویت عملگرها (http://www.w3-farsi.com/%d8%b9%d9%85%d9%84%da%af%d8%b1-%d9%87%d8%a7%db%8c-%d8%b3%db%8c-%d8%b4%d8%a7%d8%b1%d9%be/)
خیلی ممنون از جوابتون. ا‍ما موضوع تقدم اولویتها ربطی نداره. یعنی دونستن اولویت عملگرها کمکی به پیدا کردن حاصل عبارت نمیکنه..

YasserDivaR
پنج شنبه 13 آبان 1395, 17:25 عصر
خیلی ممنون از جوابتون. ا‍ما موضوع تقدم اولویتها ربطی نداره. یعنی دونستن اولویت عملگرها کمکی به پیدا کردن حاصل عبارت نمیکنه..



دوست عزیز در ریاضی هم همیشه اولویت ها حرف اول رو میزنن یعنی اولویت ها اول محاسبه میشن
داخل سی شارپ هم همینطوره