PDA

View Full Version : سوال: a++ دقیقاً چگونه عمل می کند؟



Amir93
چهارشنبه 01 آذر 1391, 19:40 عصر
چرا خروجی برنامه ی زیر 10 و 36 و12 است؟
دستور ++ قبل از متغیر اکر در یک خط چند بار استفاده شود ، ابتدا همی زیاد شده و عملیات انجام می شود یا یکی یکی زیاد می شود؟ مثلا درکد زیر 2+3+4 می شود یا 4+4+4 ؟ به هر حال خروجی برنامه هیچ یک از این دو نیست! پس این کد دقیقاً چگونه کار می کند؟




#include <stdio.h>
#include <conio.h>
int main() {
int a=1,b,c,d;
b=(++a)+(++a)+(++a);
a=1;
c=(++a)*(++a)*(++a);
a=1;
d=(++a)+((++a)+(++a));
printf("a=1 \nb=(++a)+(++a)+(++a)=%d"
"\nc=(++a)*(++a)*(++a)=%d"
"\nd=(++a)+((++a)+(++a))=%d \na=%d\n",b,c,d,a);
getch();

return 0;

}

smemamian
پنج شنبه 02 آذر 1391, 08:18 صبح
به مقادیر i و k و j توجه کند :

int i=3 , j , k = 0 ;

k = ++i; //i=4 , k=4
k = i++; //i=4 , k=3
k = --i; //i=2 , k=2
k = i--; //i=2 , k=3
i = j = k--; //i=0 , j=0 , k=-1

shahramlp
پنج شنبه 02 آذر 1391, 12:12 عصر
سلام.از جوابی که میدم 100٪ مطمئن نیستم ولی خوب یه چیزای پیدا کردم شاید درست باشه اگه نیست اساتید بگن که من اصلاح کنم.والا توی ویکی‌پدیا اینو نوشته بود
"ٰSince the increment/decrement operator modifies its operand, use of such an operand more than once within the same expression can produce undefined results" (http://en.wikipedia.org/wiki/Increment_and_decrement_operators)
که یعنی اگه در یک عبارت که از اپراتورهای ++ و -- برای یک متغیر استفاده شده استفاده‌ی مجدد از همون متغیر باعث ایجاد خروجی تعریف نشده خواهد بود پس منم طبق این گفته اومدم این تغییراتو توی برنامتون دادم

#include <stdio.h>
#include <conio.h>
int main() {
int a=1,b,c,d,e=1,f=1;
b=(++a)+(++e)+(++f);
a=1;e=1;f=1;
c=(++a)*(++e)*(++f);
a=1;e=1;f=1;
d=(++a)+((++e)+(++f));
printf("a=1\nb=(++a)+(++a)+(++a)=%d\nc=(++a)*(++a)*(++a)=% d\nd=(++a)+((++a)+(++a))=%d \na=%d\n",b,c,d,a);
getch();

return 0;
}
و جواب 6و8و6 رو نمایش داد.

مسعود اقدسی فام
پنج شنبه 02 آذر 1391, 13:10 عصر
سلام.از جوابی که میدم 100٪ مطمئن نیستم ولی خوب یه چیزای پیدا کردم شاید درست باشه اگه نیست اساتید بگن که من اصلاح کنم.والا توی ویکی‌پدیا اینو نوشته بود
"ٰSince the increment/decrement operator modifies its operand, use of such an operand more than once within the same expression can produce undefined results" (http://en.wikipedia.org/wiki/Increment_and_decrement_operators)
که یعنی اگه در یک عبارت که از اپراتورهای ++ و -- برای یک متغیر استفاده شده استفاده‌ی مجدد از همون متغیر باعث ایجاد خروجی تعریف نشده خواهد بود پس منم طبق این گفته اومدم این تغییراتو توی برنامتون دادم

#include <stdio.h>
#include <conio.h>
int main() {
int a=1,b,c,d,e=1,f=1;
b=(++a)+(++e)+(++f);
a=1;e=1;f=1;
c=(++a)*(++e)*(++f);
a=1;e=1;f=1;
d=(++a)+((++e)+(++f));
printf("a=1\nb=(++a)+(++a)+(++a)=%d\nc=(++a)*(++a)*(++a)=% d\nd=(++a)+((++a)+(++a))=%d \na=%d\n",b,c,d,a);
getch();

return 0;
}
و جواب 6و8و6 رو نمایش داد.

منظور از تعریف نشده یک نتیجه نامشخص هستش. درسته؟ یعنی ممکنه هر جوری کامپایل شده باشه اون عبارت و نتیجه قابل پیش‌بینی نیست.

ممکنه جواب این مساله همین باشه. من رو سیستم خودم امتخان نکردم. ولی شاید جواب سیستم من با سیستم شما متفاوت باشه که ناشی از کامپایلرها هم می‌تونه باشه.

فکر کنم برای همینم هست که همیشه توضیه می‌شه حدالامکان ساده و گویا بنویسید. هیچ برنامه‌نویس حرفه‌ای از عبارتی مثل عبارت صورت مساله استفاده نمی‌کنه. ولی خب سوال امتحانی ممکنه بیاد که همه رو گیج کنه!!! حتی سوال کنکور.