PDA

View Full Version : سوال: رفتار غیر منتظره در بررسی شرطی و عملگر‌های پسوند و پیشوند



m121212
پنج شنبه 08 اردیبهشت 1390, 11:09 صبح
سلام دوستان یه سوال جالبی که بهش برخوردم چرا
1 .

if(--x==++x) مقدارش false
2.

printf("\nX=%d , Y=%d",x==x--,x==--x); جوابش چرا x=0 , y=1 میشه؟

حامد مصافی
پنج شنبه 08 اردیبهشت 1390, 14:03 عصر
اولا که عنوان سوال رواصلاح کنید، چون درخواست پروژه نبود حذف نشد.
دوما:


x==x--
جواب این عبارت true خواهد بود چون بعد از پردازش خط مقدار x تغییر پیدا می‌کند.


x==--x
در این حالت ابتدا مقدار x (سمت چپ) به عنوان طرف شرط ارجاع داده می‌شود سپس مقدار x در سمت راست یک واحد کاسته شده و برای مقایسه ارجاع داده می‌شود که بدیهیست جواب نامساوی خواهد بود. با عنایت به همین استدلال می‌توانید علت جواب عبارت زیر را نیز پیدا کنید:)


if(--x==++x)

m121212
جمعه 09 اردیبهشت 1390, 08:47 صبح
دوست عزیز منظورم از این سوا ل این بود که طبق همین قوانین و این که
x==x-- باید true شود پس باید در خروجی عدد 1 به جای عبارت true نمایش داده شود اما برنامه مقدار صفر یا همان fasle را چاپ می کند.
در عبارت بعدی
x==--x مقدار false می باشد ، اما سیستم آن را به عنوان True برمی گرداند.
همچنین در خط بعدی و چندین حالت دیگر این اتفاق خواهد افتاد.

و درنتیجه خیلی مرا به فکر واداشته که کامپایلر C طبق اصل اولویت بندی ابتدا از چب به راست ++ و -- سپس بعد از چندین حالت دیگه == در اولویته ، و اینکه کامپایلر C برای مقایسه دو عملوند == مقادیر این دو عملوند ( یا عملوند اولی را ) در جایی نگهداری می کند تا قبل از رسیدن به عملوند بعدی تغییر نکند؟
بطور مثال
x--==x طبق همین منطق باید true باشد (چون ابتدا مقدار x را مقایسه کرده سپس بعد از مقایسه یک واحد از آن کم کنیم) اما false می شود. اما
x--==++x برابر true می باشد. اما اگر به عنوان اولویت آنها را بگیریم یعنی اولویت ++ و -- بیشتر از == می باشد و اول ++ و -- محاسبه شده سپس == انجام می شود ،بازهم
x-- برابر
x++ نیست.
همین امر به نظر من جالب اومد و اینو سوال داشتم که چرا این جوریه؟

حامد مصافی
جمعه 09 اردیبهشت 1390, 16:45 عصر
دوست عزیز منظورم از این سوا ل این بود که طبق همین قوانین و این که
x==x--

باید true شود پس باید در خروجی عدد 1 به جای عبارت true نمایش داده شود اما برنامه مقدار صفر یا همان fasle را چاپ می کند.چون برام عجیب بود خودم امتحان کردم و جواب ۱ بود!
در gcc (g++4.5)

m121212
جمعه 09 اردیبهشت 1390, 17:54 عصر
دوست عزیز من با برنامه Tc ،Turbo c برنامه را تست کردم و نتایج بالا رو دیدم اینم 2 تا از عکس های برنامه.6930669307

حامد مصافی
جمعه 09 اردیبهشت 1390, 21:38 عصر
دوست عزیزم، tc++ پیش از 15 سال قبل از رده خارج شده!!!

m121212
شنبه 10 اردیبهشت 1390, 06:07 صبح
دوست عزیزم، tc++ پیش از 15 سال قبل از رده خارج شده!!!
ممنون دوست عزیز خیالم راحت شد.
این سوالی که مطرح شد مربوط به آزمون استخدامی یکی از ارگانهای دولتی بود و جوابش هم همون خروجی های tc و من هرجوری فکر میکردم می دیدم اشتباه است.
متشکرماز شما.
موفق باشید.