PDA

View Full Version : سوال: تفاوت قرارگیری پارامترهای توابع در کامپایلرهای Borland C++ و VSC++.Net



sourcecode
سه شنبه 24 تیر 1393, 23:16 عصر
من دستور زیر را در Borland C++‎ اجرا می کنم

Int x=10;
Printf("%d%d%d%d",++x,x,x++,x);

// OR
//cout<<endl<<++x<<x<<x++<<x;


و به خاطر اینکه پارامترهای توابع از راست به چپ درون Stack قرار می گیرد خروجی به صورت زیر چاب می شود .
12111010

حال همین دستور را در Visual C++‎.Net اجرا می کنم خروجی به صورت زیر است ؟؟؟؟!!!!!
12121012

آیا روش قرارگیری پارامترها در کامپایلرهای Borland و VSC++‎ با هم تفاوت دارد یا به دلایل دیگر !!!!!!!!! .

rahnema1
یک شنبه 05 مرداد 1393, 12:32 عصر
در واقع از نظر استاندارد سی پلاس پلاس ترتیبی جهت ورود پارامترهای یک تابع وجود ندارد و چون معلوم نیست کدوم یک از اونها زودتر اجرا میشه و یک متغیر چند بار داره اصلاح میشه این جور نوشتن کد اشتباه و منجر به undefined behavior میشه

2020s1371
دوشنبه 06 مرداد 1393, 05:25 صبح
در واقع از نظر استاندارد سی پلاس پلاس ترتیبی جهت ورود پارامترهای یک تابع وجود ندارد ...
برای بقیه توابع قبول ولی برای توابع خود زبان قدری پذیرش حرفتون سخته... میشه منبع بدین (گشتم ولی چیز خاصی دستگیرم نشد)

تا اونجایی که من تو ذهنمه علامت کاما باید باعث شه که نتیجه چپ به راست منتقل شه یعنی اول چپ ترین بعد سمت راستش بعد سمت راستش بعد...تاآخر

rahnema1
دوشنبه 06 مرداد 1393, 09:38 صبح
برای بقیه توابع قبول ولی برای توابع خود زبان قدری پذیرش حرفتون سخته... میشه منبع بدین (گشتم ولی چیز خاصی دستگیرم نشد)

چه کسی گفته «برای بقیه توابع قبول» ؟ من گفتم برای تمام توابع.
میشه بگید کجا را گشتید؟ من که منبع را گفتم : « استاندارد سی پلاس پلاس» می تونید از اینجا دانلود کنید
http://www.open-std.org/jtc1/sc22/wg21
بخش های 1.9 و 5.2.2


تا اونجایی که من تو ذهنمه علامت کاما باید باعث شه که نتیجه چپ به راست منتقل شه یعنی اول چپ ترین بعد سمت راستش بعد سمت راستش بعد...تاآخر
ببینید اینجا تفاوت وجود داره بین «علامت کاما» و «عملگر کاما»
وقتی به عنوان جداکننده آرگومان های تابع به کار میره بهش میگن علامت کاما و ( یا بعضی موارد دیگه)
اون نکته ای که شما اشاره کردید در مورد عملگر کاما هست که ترتیب برآورد عملوند ها از چپ به راست هست
حالا یک سوال اگه بخواهیم از عملگر کاما داخل جایی استفاده کنیم که علامت کام وجود داره (مثلا بین آرگومانها تابع) در این صورت عملگر حتما باید داخل پرانتز قرار بگیره
این مثال خود استاندارد
f(a, (t=3 , t+2), c);
داخل پرانتز داخلی عملگر وجود داره و بیرون از اون علامت

sourcecode
شنبه 25 مرداد 1393, 21:59 عصر
من که به جواب سوالم نرسیدم ؟؟؟

rahnema1
شنبه 25 مرداد 1393, 22:53 عصر
من که به جواب سوالم نرسیدم ؟؟؟

می شه دلیلش را بگید گفتم که آرگومانها ترتیب ندارن نه راست به چپ و نه به راست

sourcecode
یک شنبه 26 مرداد 1393, 21:01 عصر
نفهمیدم چون در کتاب آقای مقسمی گفته که پارامترها از چب به راست درون پشته قرار میگیره در حالی که شما می گید ( در واقع از نظر استاندارد سی پلاس پلاس ترتیبی جهت ورود پارامترهای یک تابع وجود ندارد ) .
مشکل من اینه !!!!!!!!!!!!!!!!!!!!!!!!!!!

rahnema1
یک شنبه 26 مرداد 1393, 21:28 عصر
نفهمیدم چون در کتاب آقای مقسمی گفته که پارامترها از چب به راست درون پشته قرار میگیره در حالی که شما می گید ( در واقع از نظر استاندارد سی پلاس پلاس ترتیبی جهت ورود پارامترهای یک تابع وجود ندارد ) .
مشکل من اینه !!!!!!!!!!!!!!!!!!!!!!!!!!!

ضمن احترام به تمام مولفین و مدرسین عزیز باز هم تکرار می کنم از نظر استاندار همینه که قبلا هم گفتم اگه به اون بخشهایی که رفرنس دادم مراجعه می کردید براتون مشخص می شد این هم متن استاندارد و شماره بخشهایی که این جملات در اون قرار دارند
1.9 Value computations and side effects associated with different argument expressions are unsequenced.

5.2.2 When a function is called, each parameter shall be initialized with its corresponding argument. [ Note: Such initializations are indeterminately sequenced with respect to each other ]

5.2.2 The evaluations of the postfix expression and of the argument expressions are all unsequenced relative to one another

sourcecode
سه شنبه 28 مرداد 1393, 22:28 عصر
دوست عزیز میشه بیشتر در مورد سایت http://www.open-std.org/jtc1/sc22/wg21 توضیح بدید که دقیقا چیه - چی داره .
ممنون

rahnema1
سه شنبه 28 مرداد 1393, 22:38 عصر
دوست عزیز میشه بیشتر در مورد سایت http://www.open-std.org/jtc1/sc22/wg21 توضیح بدید که دقیقا چیه - چی داره .
ممنون

آخرین پیش نویس استاندارد فعلی یعنی c++11 در این pdf قرار داره که همون جاست
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf

چیزهای دیگه هم هست