PDA

View Full Version : امضای تابع



sahar_karimi
یک شنبه 18 تیر 1385, 09:33 صبح
یک سوال داشتم
در صورتی که امضای تابع Q به صورت (int Q (*int, *int باشد رفتار زبان c++ در برابر قطعه کد زیر چیست؟
( Q (& (a+b), & b

sh_roohani
یک شنبه 18 تیر 1385, 19:41 عصر
سلام،
راستش تا اونجایی که می دونم، عملگر & روی l-value ها کار می کنه، ولی این a + b یک r-value به شمار می ره. بنابراین احتمالا شما پیغام خطای زمان کامپایل می گیرید.

Mahdi_Delphi
دوشنبه 19 تیر 1385, 07:35 صبح
عملگر & روی l-value ها کار می کنه، ولی این a + b یک r-value به شمار می ره. بنابراین احتمالا شما پیغام خطای زمان کامپایل می گیرید

تایید میشه.

sahar_karimi
دوشنبه 19 تیر 1385, 09:42 صبح
l-value یعنی چی میشه بیشتر توضیح بدید؟

sh_roohani
دوشنبه 19 تیر 1385, 09:58 صبح
سلام،
عرض می شه که l-value هر چیزیه که به کاربردن اون در سمت چپ یک عبارت تخصیص منطقی باشه. مثلا


a = b + c;
در این کد، a یک l-value به شمار می ره. ولی در کد زیر


a + b = c;
a + b یک l-value نیست، چون خودش مولد یه مقداره، اما مقداری نمی تونیم توش بریزیم. بنابراین اصلا این کد غلطه.
راستش از نظر کامپایلر a + b جای مشخصی در حافظه نیست که برگرداندن آدرس اون کار درستی باشه، بلکه ممکنه در تبدیل اون به ماشین کد مقدار a در یه رجیستر ریخته بشه و بعد مقدار b به اون اضافه بشه که برگردوندن آدرس یه رجیستر با عملگر & منطقی نیست. ولی a جای مشخصی با آدرس معلوم هست.

امیدوارم این چیزایی که نوشتم به دردتون بخوره.

sahar_karimi
دوشنبه 19 تیر 1385, 10:32 صبح
نمیشه اینطور گفت که چون پارامترهای تابع دارند به خانه حافظه ای که محتویات صحیح در انها هست اشاره میکنند پس در هنگام صدازدن ابتدا جمع مقدار اول a+b حساب میشود و در حافظه موقتی ذخیره میشود و سپس ادرس این خانه از حافظه به همراه ادرس حافظه b به تابع داده میشود

someCoder
دوشنبه 19 تیر 1385, 11:12 صبح
نمیشه اینطور گفت که چون پارامترهای تابع دارند به خانه حافظه ای که محتویات صحیح در انها هست اشاره میکنند پس در هنگام صدازدن ابتدا جمع مقدار اول a+b حساب میشود و در حافظه موقتی ذخیره میشود و سپس ادرس این خانه از حافظه به همراه ادرس حافظه b به تابع داده میشود
نه!
چون معلوم نیست که حافظه موقتی از RAM استفاده کنه! مثلا احتمال زیاد از register ها استفاده میشه که آدرس ندارند.