ورود

View Full Version : سوال: خروجی برنامه ی c++



اقای برنامه نویس
سه شنبه 27 شهریور 1397, 00:14 صبح
سلام.
یک سوال داشتم .
به نظر من خروجی این برنامه 11 باید باشه :

#include <iostream>
using namespace std; class A { public: A() { a.a = a.b = 1; } struct { int a, b; } a; int b(void); }; int A::b(void) { int x = a.a; a.a = a.b; a.b = x; return x; }; int main(void) {
A a; a.a.a = 0; a.b(); cout << a.b()<< a.a.b << endl;
system("pause");
return 0;
}


اما خروجی واقعیش 10 هست ! چرا میگه تو a.a.b صفر هست ؟
حالا اگر به جای این دستور :

cout << a.b()<< a.a.b << endl;

این دستور رو بنویسیم :

cout << a.b();cout << a.a.b << endl;

خروجی برنامه 11 میشه . میشه راهنمایی کنید چرا اینجوریه ؟
ممنون .

farhad_shiri_ex
سه شنبه 27 شهریور 1397, 08:21 صبح
#include <iostream>
using namespace std;
class A {
public:
A() {
a.a = a.b = 1;
}
struct {
int a, b;
} a;
int b(void);
};

int A::b(void) {
int x = a.a;
cout << "x: -> " << x << endl;
a.a = a.b;
cout << "a.a -> " <<a.a << endl;
a.b = x;
cout << "a.b: -> " << a.b << endl;
cout << "x: -> " << x << endl;
return x;
};

int main(void) {
A a;
a.a.a = 0;
a.b();
cout << "---------------" << endl;
//because cout right to left evaluate object to print
//cout << "a.b() -> " << a.b() << "a.a.b -> " << a.a.b <<endl;

cout << "---------------" << endl;
cout << a.b()<< endl;
//because a.b() set the new value in to a.a.b print the last value
cout << a.a.b << endl;
//system("pause");
return 0;
}

البته من کد شما را اینطوری ویرایش کردم که واضحتر بشه!
ولی در هر حال به علت اینکه دستور های outstream از راست به چپ ارزیابی می شوند بنابراین در خط اول آخرین مقدار a.a.b برابر با صفر هست و بعد از نمایش این مقدار تابع ()a.b صدا زده می شود. ولی در دو خط پایین شما دوتا دستور outstream استفاده کرده اید بنابراین آخرین تغییری که تابع ()a.b بر روی a.a.b ایجاد کرده است 1 هست و به همین علت outstream دوم هم عدد 1 را نشان میدهد.