PDA

View Full Version : (فوری)اپراتور ++



__masumeh
یک شنبه 26 آذر 1391, 11:02 صبح
مگر توی اپراتورها عملگر ++ از همه مقدم تر نیست پس چرا وقتی تکه کد زیر را می نویسیم حاصل 8 میشه نه9؟
m=10
(printf("%d", m++ -2

omidshaman
یک شنبه 26 آذر 1391, 11:19 صبح
نه باید 8 بشه
اگر این جوری بنویسین 9 میشه

++m-2

m++
این جوری کار می کنه که m رو استفاده می کنه بعد m+1 رو بر می گردونه
یعنی اگر بنویسین

printf("%d", m++)
10 چاپ میشه نه 11

__masumeh
یک شنبه 26 آذر 1391, 11:33 صبح
ولی شما اگه تو اینترنت و کتابها را نگاه کنید حق تقدم ++ را بیشتر گرفته (چه قبل عملوند چه بعدش) ؟ ثانیا اگر خطهای بعدی هم مقدار m را چک کنید باز 10 هست پس کی میشه 11؟

omidshaman
یک شنبه 26 آذر 1391, 11:42 صبح
نه عزیزم همون جوریه که گفتم این کد رو تست کن

#include <stdio.h>

int main() {
int m=10;
printf("%d", m++);
printf("%d", m);
}

خروجی

10
11
اره حق تقدم ++ بیشتره ولی ربطی نداره!
(printf("%d", m++ -2
این جوریه که اول m رو 1 واحد اضافه می کنه میده برنامه بعد همون m قبلی رو -2 می کنه
یعنی این با

printf("%d\n", m-2);
m++;
فرقی نمی کنه
edit::
این که حق تقدمش بیشتره مثلا این جور جا ها بدرد میخوره

int m=10;
printf("%d\n", ++m*2);

خروجی 22
اگر حق تقدمش کمتر بود میشد21

__masumeh
یک شنبه 26 آذر 1391, 12:07 عصر
دستتون درد نکنه توجیه شدم

__masumeh
دوشنبه 04 دی 1391, 09:32 صبح
چرا وقتی عیارت زیر را مینویسیم
i=10;
Printf(“%d%d”,i++ + i,i)
خروجی : 21
10
در حالیکه وقتی قبل از کاما به i دوم رسید آن را 11 ارزیابی کرد ولی ناگهان بعد از کاما i شد همون 10 قبلی؟؟؟؟اگه یه قاعده کلی بگید ممنون میشم؟
ولی وقتی می نویسسیم
Printf(“%d”,i++ + i)
Printf(“%d”,i)
خروجی : 21
11

omidshaman
دوشنبه 04 دی 1391, 20:24 عصر
چرا وقتی عیارت زیر را مینویسیم
i=10;
Printf(“%d%d”,i++ + i,i)
خروجی : 21
10

اولا خروجیش 20 و 11 ه نه 21 و 10!!

دلیلشم گفتم تا وقتی این جمله مربوط به

i++
تموم نشه مقدار i عوض نمیشه

ولی وقتی می نویسسیم
Printf(“%d”,i++ + i)
Printf(“%d”,i)
خروجی : 21
11
خروجی اینم 20 و 11 ه نه اونی که شما نوشتین دقیقا مثل قبلی

__masumeh
سه شنبه 05 دی 1391, 08:36 صبح
اولا خروجیش 20 و 11 ه نه 21 و 10!!

دلیلشم گفتم تا وقتی این جمله مربوط به

i++
تموم نشه مقدار i عوض نمیشه

خروجی اینم 20 و 11 ه نه اونی که شما نوشتین دقیقا مثل قبلی

دوست محترم دقیقا یکبار دیگر اجرا کردم خروجی دقیقا همون چیزهایی است که نوشته بودم شما هم می تونید کد را اجرا و خروجی را ببینید.

omidshaman
سه شنبه 05 دی 1391, 09:12 صبح
http://upload.tehran98.com/img1/zxk3k4743053ax7xpqft.jpg

__masumeh
سه شنبه 05 دی 1391, 12:53 عصر
این هم نتیجه اجرای کد من
97202

aidinMC
سه شنبه 05 دی 1391, 13:10 عصر
چقد خوشگل قوانین اولویت رفت زیر سوال :قهقهه: :قهقهه:

FastCode
سه شنبه 05 دی 1391, 17:45 عصر
i++ +i
و
i+ ++i
از نظر کامپایلر یکی هستن
و دومی اولویتش بیشتره

omidshaman
سه شنبه 05 دی 1391, 22:21 عصر
i++ +i
و
i+ ++i
از نظر کامپایلر یکی هستن
من تست کردم یکی نبودن یکی میشه 22و11 یکی میشه 20و11
اگر3تارو کاملا پشت هم بزاریم میشه 20 و11
هر جور فکر می کنم اون نتیجه توربو با عقل جور در نمیاد!! حالا اگر 21 و11 بود باز یک چیزی!

__masumeh
چهارشنبه 06 دی 1391, 09:13 صبح
هر جور فکر می کنم اون نتیجه توربو با عقل جور در نمیاد!! حالا اگر 21 و11 بود باز یک چیزی!

بله دقیقا اگر 21و 11 بود بحثی نبود و منطقی به نظر می رسید؟ هیچ جوری نمیشه به علت این موضوع پی برد؟

mojtaba.baghban
چهارشنبه 06 دی 1391, 10:52 صبح
مگه کامپایلرها استاندارد نیستند که نتیجه‌های متفاوت می‌دن. لطفا خروجی برنامه رو که می‌زارین اسم کامپایلر هم بنویسین
مثلا واسه من i++ +i رو میده 20 11 و i+ ++i رو میده 22 11. که با g++ کامپایل کردم.
نمیدونم توربو سی کامپایلرش چیه ولی خیلی شوت می‌زنه.

M.T.P
چهارشنبه 06 دی 1391, 21:14 عصر
من با Dev کامپایل کردم...

کد:
int i=10;
printf("%d\n%d\n", i+ ++i,i);

نتیجه: 22 ، 10

و کد:
int i=10;
printf("%d\n%d\n", i++ +i,i);

نتیجه ش شد: 20 ، 10

FastCode
پنج شنبه 07 دی 1391, 01:15 صبح
علتش ترتیب عکس در ارسال پارامترها در کامپایلرتون ه که استاندارد نیست
من هر کاری کردم نتونستم بدون switch اضافه ۲۱ به دست بیارم چون GCC همیشه به همون ترتیبی که مینویسید عمل میکنه.

97341

mojtaba.baghban
پنج شنبه 07 دی 1391, 12:38 عصر
ظاهرا کامپایلرهای غیر استاندارد زیاده. تو پستهای قبلی کمپایلرهای turbo و dev نتایج غیر منطقی دادند. من که از کامپایلر gcc یا g++ استفاده می‌کنم که بنظرم نتایج منطقی می‌دن.