PDA

View Full Version : دلیل رفتار عجیب کامپایلر c چیست؟



modir
شنبه 29 مهر 1385, 11:24 صبح
سلام
قبلا از اینکه سوالم ممکنه خیلی ابتدایی باشه عذرخواهی می کنم:خجالت:
ببنید من تازه کار کردن با زبان c رو شروع کردم توی این دوتا مثال با نتیجه عجیبی برخورد کردم:
اولیش اینه:



#include<stdio.h>
#include<conio.h>
main()
{clrscr();
char a=-100;
printf("%d%u" ,a,a);
getch();
}

خروجی این برنامه کوچک با چیزهایی که من خوندم بایدیک عدد منفی 100 باشه و یک عدد156 ولی خروجی عددمنفی 10065436 است در حالیکه کاراکتر من از نوع char و یک بایتی است
سوال دوم من هم این مثال است :


#include<stdio.h>
#include<conio.h>
main()
{clrscr();
int a=2 ,b;
b=a++-a++;
printf("%d%5d",a++-a++,b);
getch();
}

در این مثال هم باید خروجی ها برابر باشد ولی در کمال تعجب برای خروجی اول عدد منفی 1 و برای خروجی دوم عدد 0 را نشان میدهد
می خواستم ببینم این رفتار کامپایلر c برای چیست ؟

mousamk
شنبه 29 مهر 1385, 13:31 عصر
من خودم دقیقاً جواب سوالات شما رو نمی دونم ولی هر دو برنامه شما رو در vs 2005 اجرا کردم، اما نتیجه اجرای برنامه با آنچه شما گفته اید تفاوت دارد.

برای برنامه اول عدد منفی 1004294967196 به دست آمد که ظاهراً وقتی می خواهید عدد را به صورت unsigned بنویسید، کامپایلر ابتدا آن را به int تبدیل می کند و سپس آن را به صورت بی علامت می نویسد. معمولاً در سیستم های ما int 32 بیتی است ولی عدد شما 16 بیتی شده است. مطمئناً برنامه تان را با یکی از کامپایلرهای قدیمی تحت dos نوشته اید.

برای برنامه دوم هم نتیجه اجرا دو تا صفر بود:متفکر:

Mohammad_Mnt
شنبه 29 مهر 1385, 14:23 عصر
بین d% و u% فاصله بذار ببین درست می شه ؟

modir
شنبه 29 مهر 1385, 14:24 عصر
من با Turbo C++ 4.5 تحت ویندوز نوشتم و این نتایج رو داد

بین d% و u% فاصله هم گذاشتم ولی باز همون نتایج رو نشون میده

h.bathaie
یک شنبه 30 مهر 1385, 02:01 صبح
دوست عزیز
ظاهرا دانشجو هستید . از این جور مسائل فقط تو دانشگاه ها مطرح میشه . منم کلی با این چیز ها سر و کله زدم .ولی هیچکدوم تو کار بدردم نخورد . برای تست زدن خوبه آدم اینارو بدونه ولی برای کار نه ..

M A R S H A L
پنج شنبه 25 آبان 1385, 17:20 عصر
دوست عزیز...
شما با اصول زبان مشکل دارید. با محدوده متغییرها و تقدم آنها و نوع عملکرد و...
در مورد مثال اول وقتی شما در دستور پرینت u% رو آوردی (u=unsigned) در واقع برنامه سعی میکنه که 100- رو به صورت بدون علامت چاپ کنه که و چون عدد شما منفی هست مقدار 100 رو از مقدار بالای قابل گنجیدن در 2 بایت که میشه 65536 کم میکنه (این به علت قضیه Bounds Checking) هست که برنامه اشکالی هنگام کامپایل نداره ولی نتیجه نادرستی خواهد داشت.
و در مورد مثال دوم فقط توجه داشته باش که هر جایی شما ++a را قرار دادید، در واقع بعد از هر دفعه اجرای دستور ++a یک واحد به a اضافه کردید و مقدار a که در خط هفتم هست با مقداری که هنگام تعریف در اون قرار دادید و حتی مقدار خط ششم ، متفاوت هست.
موفق باشید.

r_kashani
جمعه 26 آبان 1385, 21:33 عصر
:گریه: :گریه: :عصبانی++:

ms_zandy
دوشنبه 21 آبان 1386, 17:44 عصر
در کد دوم شما در یک دستور دو بار استفاده کردید
که در کامپایلر قدیمی مثل Turbo ,vc++98,... رفتار متفاوتی نشان داده می شود
اما از سال 1999 طبق استاندارد 99 این (b=a++-a++;)دستور غلط است مثل vc8,vc7