PDA

View Full Version : کمک - چگونگی محاسبه شرط



f_cpuf
جمعه 31 اردیبهشت 1389, 16:01 عصر
#include<iostream.h>
main(){
int x=0,t=0;
while (x*=(x++<=10))
t+=x++;
cout<< t // 36
<<endl
<<x; // 0
}من در مورد برنامه بالا چند تا سوال داشتم اگر جواب بدید ممنون میشم.

1-شرط پایان حلقه چی هست؟مقدار x و یا عبارت (10=>++x) و یا چیز دیگه؟

2-در آخر کار یعنی زمانی که x برابر 12 هست و شرط چک میشه و شرط نادرست میشه و مقدار x برابر 0 میشه و از حلقه خارج میشه وهمین صفر را در خروجی چاپ میکند.اما سوال اینجاست که مگر x پس افزایشی نیست؟مگر نباید بعد انجام ضرب که مقدار x صفر میشود،یک واحد اضافه بشه و خروجی x برابر 1 بشه؟

3- اصلا در چنین شرایطی اول شرط چک میشه یا این که اول عبارت پس افزایشی محاسبه میشه؟

pashaie
جمعه 31 اردیبهشت 1389, 17:13 عصر
1-شرط پایان حلقه چی هست؟مقدار x و یا عبارت (10=>++x) و یا چیز دیگه؟
مقدار x



2-در آخر کار یعنی زمانی که x برابر 12 هست و شرط چک میشه و شرط نادرست میشه و مقدار x برابر 0 میشه و از حلقه خارج میشه وهمین صفر را در خروجی چاپ میکند.اما سوال اینجاست که مگر x پس افزایشی نیست؟مگر نباید بعد انجام ضرب که مقدار x صفر میشود،یک واحد اضافه بشه و خروجی x برابر 1 بشه؟

چون شما داری کار غیر قانونی می کنی!
طبق قانون عبارات (بخش 5، پاراگراف 4 از ISO C++ استاندارد) شما نباید در یه عبارت مقدار یه متغییر رو دو بار عوض کنی:


"Except where noted, the order of evaluation of operands of
individual operators and subexpressions of individual
expressions, and the order in which side effects take place,
is unspecified. Between the previous and next sequence
point a scalar object shall have its stored value modified at
most once by the evaluation of an expression. Furthermore,
the prior value shall be accessed only to determine the value
to be stored. The requirements of this paragraph shall be met
for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined.

[Example:
i = v[i++]; // the behavior is unspecified
i = 7, i++, i++; // i becomes 9
i = ++i + 1; // the behavior is unspecified
i = i + 1; // the value of i is incremented
-end example]"




3- اصلا در چنین شرایطی اول شرط چک میشه یا این که اول عبارت پس افزایشی محاسبه میشه؟
در چنین شرایطی هیچ چیزی رو نمیشه از قبل پیش بینی کرد! ممکنه یه جا یه چیزی بگه یه جای دیگه یه چیز دیگه!

به عنوان مثال، به نظر شما این کد چه عبارتی رو چاپ می کنه؟


#include<iostream.h>
#include<conio.h>
void main()
{
int a,add;
a=5;
add = (++a)+(++a);
cout<<add;
getch();
}

درست حدس زدید! :لبخند: 14 رو چاپ می کنه!

آهان! تا یادم نرفته مرجع رو معرفی کنم که ملت بدونن این کلمات غلمبه سلمبه ای که گفتم از کجام درآوردم! یه وقت خیال نکنن نشستم استاندار c++ رو خونده باشم!

http://en.allexperts.com/q/C-1040/Pre-post-increment.htm?rd=1

f_cpuf
جمعه 31 اردیبهشت 1389, 19:53 عصر
از این که جواب دادید ممنونم.

یعنی به همین دلیل کد زیر خروجی متفاوت میده؟ من یه جا دیگه پرسیدم دوستان گفتند که این کدها مثل هم هست و نباید جواب متفاوت بده

اما من تو 3 و 4.5 که دارم امتحان میکنم خروجی متفاوتی میده

:متعجب:

#include<iostream.h>
main(){
int x=-5,y=-2;
int i=(x + y+ ++x);
cout<< i<<endl; // Out ==> -11
x=-5;
i=(x + y+ ++x);
cout<< i<<endl; // Out ==> -10
}