ورود

View Full Version : سوال: نحوه کامپایل این کد



reza69
چهارشنبه 25 مرداد 1391, 14:38 عصر
سلام
چرا نتیجه ی این کد بعد از اجرا 4422 می شود؟

#include<iostream.h>
main()
{
int i=3;
cout<<i--<<++i<<i++<<--i;
}

مسعود اقدسی فام
چهارشنبه 25 مرداد 1391, 16:09 عصر
سلام
چرا نتیجه ی این کد بعد از اجرا 4422 می شود؟

#include<iostream.h>
main()
{
int i=3;
cout<<i--<<++i<<i++<<--i;
}


محاسبات از راست به چپ انجام می‌شه. اول i-- که 2 می‌شه، بعد ++i که 2 چاپ می‌شه و بعد i برابر 3 می‌شه. بعد i++ که i را 4 می‌کنه و جاپ. در آخر --i که چهار رو چاپ می‌کنه و بعد یه واحد از i کم می‌کنه.
پارامترهای توابع و سربارگذاری عملگرها تا جایی که می‌دونم در اکثر کامپایلرها از راست به چپ به تابع ارسال می‌شه. دلیل اصلی هم قرار گرفتن اونها در پشته هست. آخرین پارامتر اول فرستاده می‌شه تا آخرین آرگومانی باشه که تابع دریافت می‌کنه.

Sarv 123
پنج شنبه 26 مرداد 1391, 00:00 صبح
از هر دوی شما ممنونم نکته جدید و جالبی بود واسم.

reza69
پنج شنبه 26 مرداد 1391, 06:33 صبح
اول i-- که 2 می‌شه، بعد ++i که 2 چاپ می‌شه?
چرا اگه i-- بشه 2 چاپ میشه بعد ++i باید 2 یکی اضافه بشه بشه 3
میشه یکی یکی برام توضیح بدین که چرا جواب میشه:4422

مسعود اقدسی فام
پنج شنبه 26 مرداد 1391, 16:36 عصر
اول i-- که 2 می‌شه، بعد ++i که 2 چاپ می‌شه?
چرا اگه i-- بشه 2 چاپ میشه بعد ++i باید 2 یکی اضافه بشه بشه 3
میشه یکی یکی برام توضیح بدین که چرا جواب میشه:4422

اون بر می گرده به تفاوت ++i و i++.

++i اول i رو در عملیات دخیل می‌کنه و بعد یه واحد اضافه می‌کنه. اما i++ اول یه واحد اضافه می‌کنه و بعد وارد عملیات می‌شه.

پس اول که 3 بود، با i-- یه واحد کم می شه و چاپ می شه. یعنی شده 2. بعد که به ++i می خوره، اول 2 رو چاپ می کنه و بعد یه واحد بهش اضافه می کنه و می شه 3. پس تا الان دو تا 2 شده. یعنی 22. البته دقت کن که وقتی می گم چاپ می شه، یعنی می ره برای چاپ. ترتیب چاپ از چپ به راسته. یعنی این اعداد هنوز چاپ نشدن تا اولین عبارت هم محاسبه بشه.
مرحله بعد i++ که بازم اول یه واحد اضافه می کنه و می شه 4 و بعد می ره برای چاپ. و در آخر ++i اول 4 رو می فرسته برای چاپ و بعد عدد رو 5 می کنه. پس اعداد از چپ به راست 4 و 4 و 2 و 2 می شن. یعنی 4422

reza69
جمعه 27 مرداد 1391, 17:05 عصر
سلام یه سوال دیگه داشتم این کد چی میگه

if(i%2)
i++

این if که هیچ عملگر مقایسه ای نداره.

مسعود اقدسی فام
جمعه 27 مرداد 1391, 17:28 عصر
سلام یه سوال دیگه داشتم این کد چی میگه

if(i%2)
i++

این if که هیچ عملگر مقایسه ای نداره.

در زبان‌های C و ++C عدد صفر ارزش نادرست و هر عدد غیرصفر (دقت کنید که نه فقط یک) ارزش درست داره. پس عبارتی مثل




if(i%2)



رو اینطور می شه تفسیر کرد که باقیمانده یه عدد صحیح بر دو یا صفر می شه یا یک. اگه صفر شد، شرط به صورت ( if( 0 در می یاد که همونطور که گفتم صفر به معنی نادرست هست و عبارت بدنه اجرا نمی شه. اما اگه باقیمانده یک شد به صورت ( if( 1 در می یاد که ارزش درستی داره و به مقدار i یه واحد اضافه می شه.

در واقع این کد اگه i فرد باشه با اضافه کردن یک، به زوج تبدیل می کنه. اگه زوج باشه کار خاصی نمی کنه.

reza69
شنبه 28 مرداد 1391, 05:09 صبح
خیلی ممنون من این 2تا سوال رو از سوالات کنکور کاردانی به کارشناسی گفتم که برام خیلی مجهول بود.
باز هم از استاد خودم آقای مسعود اقدسی فام تشکر میکنم.

#target
شنبه 28 مرداد 1391, 05:22 صبح
خیلی ممنون من این 2تا سوال رو از سوالات کنکور کاردانی به کارشناسی گفتم که برام خیلی مجهول بود.
جدا اون سوال cout داخل کنکور اومده بود ؟؟؟؟ چون تو هر کامپایلر ممکنه ی جور نتیجه بده !! مثلا Digital Mars ( و فکر کنم GNU Gcc ) اون زو کامپایل کنی نتیجه 3 3 3 3 میده !

Sarv 123
شنبه 28 مرداد 1391, 09:28 صبح
اگه سوال کاردانی به کارشناسی بوده میشه بگین مال چه سالی؟

ممنون

مسعود اقدسی فام
شنبه 28 مرداد 1391, 16:32 عصر
جدا اون سوال cout داخل کنکور اومده بود ؟؟؟؟ چون تو هر کامپایلر ممکنه ی جور نتیجه بده !! مثلا Digital Mars ( و فکر کنم GNU Gcc ) اون زو کامپایل کنی نتیجه 3 3 3 3 میده !

منم گفته بودم که اکثر کامپایلرها و نه همه. ولی معمولا جایی مثل کنکور از اونطور کامپایلرهایی که شما گفتید سوال نمی‌دن. باز GNU gcc کمی آشناتره. ولی اونم باید مطمئن شد عملکردش چطوریه و بازم اگه بچه‌های کاردانی درسی از اینا نمی‌خونن فکر نکنم بیاد.
همیشه سوالات کنکور همچین ابهامات و مشکلاتی داشته و داره متاسفانه. بدترینش اونه که می‌پرسه این قطعه کد چند تا اشتباه داره! یه کامپایلری یه عبارتی رو خطا می‌گیره و یکی نه.

قربونت رضا جان. لفظ استاد برای من خیلی بزرگتر از قد و قامتمه. :)

reza69
دوشنبه 30 مرداد 1391, 06:18 صبح
منم گفته بودم که اکثر کامپایلرها و نه همه. ولی معمولا جایی مثل کنکور از اونطور کامپایلرهایی که شما گفتید سوال نمی‌دن. باز GNU gcc کمی آشناتره. ولی اونم باید مطمئن شد عملکردش چطوریه و بازم اگه بچه‌های کاردانی درسی از اینا نمی‌خونن فکر نکنم بیاد.
همیشه سوالات کنکور همچین ابهامات و مشکلاتی داشته و داره متاسفانه. بدترینش اونه که می‌پرسه این قطعه کد چند تا اشتباه داره! یه کامپایلری یه عبارتی رو خطا می‌گیره و یکی نه.
قربونت رضا جان. لفظ استاد برای من خیلی بزرگتر از قد و قامتمه. :)
خواهش میکنم شما بزرگوارید.
راستی Digital Mars و GNU Gcc چیه؟
این سوالاتی که گفتم مال کنکور نبود آزمون آزمایشی بود اگه کسی خواست بگه تا براش هم سوالات کنکور هم این آزمونهای آزمایشی با جواب رو بزارم.
دانلود آزمون (http://uplod.ir/xu9gaz8o5ru7/soalate_azmayeshi.zip.htm)

mojtaba5
شنبه 04 شهریور 1391, 23:58 عصر
خروجی این برنامه 3333 میشه.

mojtaba5
یک شنبه 05 شهریور 1391, 00:02 صبح
همیشه سوالات کنکور همچین ابهامات و مشکلاتی داشته و داره متاسفانه. بدترینش اونه که می‌پرسه این قطعه کد چند تا اشتباه داره! یه کامپایلری یه عبارتی رو خطا می‌گیره و یکی نه.


دوست عزیز این گونه سوالات ربطی به کامپایلر ندارند، اینا خطاهای سینتکس دستور زبان هستن که باید بلد باشید.

soorena
پنج شنبه 09 شهریور 1391, 14:53 عصر
ینا خطاهای سینتکس دستور زبان هستن که باید بلد باشید.
سلام

می‌شه لطفا در مورد این جملتون بیشتر توضیح بدید اینی که گفتید یعنی‌ چی‌؟ اگه خطای نحوی یا همونsyntax error هستش پس چرا برنامه کامپایل می‌شه؟

مسعود اقدسی فام
پنج شنبه 09 شهریور 1391, 21:00 عصر
دوست عزیز این گونه سوالات ربطی به کامپایلر ندارند، اینا خطاهای سینتکس دستور زبان هستن که باید بلد باشید.

خطایی رو می‌شتاسم که یه کامپایلر خطا داده و یکی نداده. اصلا هم از نظر سینتکس مشکلی نداره. یعنی دو کامپایلر سینتکس مختلفی دارن ظاهرا. بگم خندتون می‌گیره که چرا باید به همچین چیزی خطا می‌گیره. اصلا چیز مهمی نیست.

#target
پنج شنبه 09 شهریور 1391, 21:35 عصر
خطایی رو می‌شتاسم که یه کامپایلر خطا داده و یکی نداده. اصلا هم از نظر سینتکس مشکلی نداره. یعنی دو کامپایلر سینتکس مختلفی دارن ظاهرا. بگم خندتون می‌گیره که چرا باید به همچین چیزی خطا می‌گیره. اصلا چیز مهمی نیست.

بی زحمت اگه امکان داره بذارین کنجکاو شدم !

مسعود اقدسی فام
پنج شنبه 09 شهریور 1391, 21:56 عصر
برای یکی از رفقا پیش اومده بود.

یه کدی بود این شکلی:




vector<vector<int>> hasan;




++g به << گیر داده بود که با عملگر << اشتباه می‌گیرم. Visual Studio گیر نداده بود ولی.

یه خط فاصله بینشون می‌ذاشتی حل بود!

البته در مورد ++g مطمئن نیستم که اون بود. خلاصه یه کامپایلری. ولی VS رو خودم امتحان کردم.