View Full Version : سوال: کاربرد کلمه کلیدی auto
motherboard
سه شنبه 28 مرداد 1393, 16:02 عصر
سلام.می خواستم بدونم کاربرد کلمه کلیدی auto چیست؟
parvizwpf
سه شنبه 28 مرداد 1393, 16:15 عصر
auto double x, y;
متغیرهای x,y متغیرهای محلی از کلاس ذخیره سازی اتوماتیک هستند ، این متغیرها فقط در نزدیکترین جفت براکت ، بدنه اصلی که در آن تعریف شده اند وجود دارند.
وسیله ای هست برای صرفه جویی در مصرف حافظه.فقط زمانی در حافظه وجود دارند که بلوکی که در آن هستند در حال اجرا باشد.
motherboard
سه شنبه 28 مرداد 1393, 16:24 عصر
auto double x, y;
متغیرهای x,y متغیرهای محلی از کلاس ذخیره سازی اتوماتیک هستند ، این متغیرها فقط در نزدیکترین جفت براکت ، بدنه اصلی که در آن تعریف شده اند وجود دارند.
وسیله ای هست برای صرفه جویی در مصرف حافظه.فقط زمانی در حافظه وجود دارند که بلوکی که در آن هستند در حال اجرا باشد.
ایا میشه اون رو یک جور متغیر داینامیکی تعریف کرد!!! به این صورت که در موقع استفاده حافظه براش تخصیص داده میشه و در موقعی که استفاده نداره به صورت اتوماتیک و بدون نیاز به delete حافظه تخصیص داده شده از اون گرفته میشه!! ایا میشه این طور هم تعریف کرد؟
sa1378
سه شنبه 28 مرداد 1393, 16:24 عصر
فکر کنم اگه auto رو قبل از تعریف ننویسین هم خودش همینجوری تعریف میشه
motherboard
سه شنبه 28 مرداد 1393, 16:27 عصر
فکر کنم اگه auto رو قبل از تعریف ننویسین هم خودش همینجوری تعریف میشه
اون وقت اگه این کار رو نکنیم چه فرقی با متغیرهای معمولی داره؟؟؟؟
parvizwpf
سه شنبه 28 مرداد 1393, 17:04 عصر
شما ترجمه دایتل رو بخونید همه چی دستگیرتون میشه. یا منابع زیادی وجود داره
motherboard
سه شنبه 28 مرداد 1393, 17:10 عصر
شما ترجمه دایتل رو بخونید همه چی دستگیرتون میشه. یا منابع زیادی وجود داره
می خوام بدونم ایا تعریفی که کردم لااقل از نظر شما قابل قبول بود؟
parvizwpf
سه شنبه 28 مرداد 1393, 17:25 عصر
تقریبا آره. اینو خود پروسس سی کنترل میکنه. دوستمون هم گفت پیش فرض اعمال میشه
motherboard
سه شنبه 28 مرداد 1393, 18:29 عصر
تقریبا آره. اینو خود پروسس سی کنترل میکنه. دوستمون هم گفت پیش فرض اعمال میشه
یعنی وقتی می نویسیم int x به طور پیشفرض auto در نظر گرفته میشه؟
omid_kma
سه شنبه 28 مرداد 1393, 18:53 عصر
فکر کنم اگه auto رو قبل از تعریف ننویسین هم خودش همینجوری تعریف میشه
توی C++ به این شکل نیست چیزی که میگید مربوط میشه به زبان هایی که dynammic هستن مثل php .
یعنی وقتی می نویسیم int x به طور پیشفرض auto در نظر گرفته میشه؟
وقتی که کامپایلر میخواد کدی رو کامپایل کنه باید تمامی انواع نوعشون مشخص باشن پس وقتی که مینویسین int x پیش فرض auto در نظر گرفته نمیشه .
وقتی که auto x=5 شما می نویسید بصورت خودکار کامپایلر در مرحله preprocessing کردن کد اول کدتون رو با یک template به این شکل عوض می کنه
template<class T>
void function(T);
بعد هر نوعی که T بود رو بجای auto میزاره
پس auto a=5 تبدیل میشه به int a=5 و بعد کد تغییر یافته تحویل داده میشه
به parser optimizer , assembler ,linker و نهایتا فایل خروجی تولید میشه .
ایا میشه اون رو یک جور متغیر داینامیکی تعریف کرد!!! به این صورت که در موقع استفاده حافظه براش تخصیص داده میشه و در موقعی که استفاده نداره به صورت اتوماتیک و بدون نیاز به delete حافظه تخصیص داده شده از اون گرفته میشه!! ایا میشه این طور هم تعریف کرد؟
تقریبا همین طوره البته int x =4 که با auto x =4 برابره تفاوتی که با گرفتن حافظه با new داره اینه که مورد اول از stack استفاده می کنه مورد دوم از heap که استفاده از stack به مراتب سریع تره .
متغیرهای x,y متغیرهای محلی از کلاس ذخیره سازی اتوماتیک هستند ، این متغیرها فقط در نزدیکترین جفت براکت ، بدنه اصلی که در آن تعریف شده اند وجود دارند.
وسیله ای هست برای صرفه جویی در مصرف حافظه.فقط زمانی در حافظه وجود دارند که بلوکی که در آن هستند در حال اجرا باشد.
که کاملا اشتباه هست تعریف به شکل auto هیچ ربطی به صرفه جویی در مصرف حافظه نداره !!!
متغیر auto رو میشه بصورت global هم تعریف کرد پس این که کجا وجود دارند بستگی به این داره که کجا تعریف شدن !
در مورد auto قبلا این جا کامل توضیح داده شده : http://www.7khatcode.com/3180/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-c-11?show=3180#q3180
rahnema1
سه شنبه 28 مرداد 1393, 19:36 عصر
در استاندارد جدید کاربرد auto تغییر پیدا کرده. با استفاده از auto می تونید یک متغیر تعریف کنیم بدون اینکه نوع اون را بدونیم خود کامپایلر از روی مقداری که به متغیر اختصاص می دهیم می فهمه که نوعش چیه
http://en.cppreference.com/w/cpp/language/auto
ciavosh
پنج شنبه 30 مرداد 1393, 12:21 عصر
اگر متغیرها درون توابع بدون درج کلمه کلیدی auto تعربف شوند به صورت ضمنی auto در نظر گرفته می شود ولی این موضوع برای متغیرهایی که به صورت گلوبال تعریف می شوند صادق نیست (که به طور ضمنی static در نظر گرفته می شوند). این متغیر در پشته تخصیص می یابد. تا آنجایی که من اطلاع دارم کلیه متغیرها در پشته تعریف می شوند مگر اینکه از new استفاده شود. درسته؟
implicit رو ضمنی ترجمه کردم.
rahnema1
پنج شنبه 30 مرداد 1393, 13:53 عصر
اگر متغیرها درون توابع بدون درج کلمه کلیدی auto تعربف شوند به صورت ضمنی auto در نظر گرفته می شود ولی این موضوع برای متغیرهایی که به صورت گلوبال تعریف می شوند صادق نیست (که به طور ضمنی static در نظر گرفته می شوند). این متغیر در پشته تخصیص می یابد. تا آنجایی که من اطلاع دارم کلیه متغیرها در پشته تعریف می شوند مگر اینکه از new استفاده شود. درسته؟
implicit رو ضمنی ترجمه کردم.
در پستهای بالا گفته شده کاربرد کلمه کلیدی auto در استاندارد جدید فرق کرده و با این که شما می گویید متفاوته
متغیرهای static در پشته ذخیره نمیشن بلکه به همراه heap در قسمت data segment قرار دارند:
http://en.wikipedia.org/wiki/Data_segment
omid_kma
پنج شنبه 30 مرداد 1393, 15:25 عصر
د ولی این موضوع برای متغیرهایی که به صورت گلوبال تعریف می شوند صادق نیست (که به طور ضمنی static در نظر گرفته می شوند)
این حرفتون درست نیست متغیر های Global داخل یک namespace مربوط به translation unit برنامه قرار می گیرن (global namespace )
جایی از استاندارد این که "متغیر گلوبال" ضمنی static در نظر گرفته میشه ذکر نشده
وقتی متغیر گلوبال static تعریف میشه 2 چیز میشه ازش برداشت کرد :
1_ داشتن حافظه به شکل static یعنی از اول تا آخر برنامه حافظه متغیر ثابت هست (اگر متغیر گلوبال static هم تعریف نشه این مورد براش برقراره)
2_ internal linkage یعنی این که از داخلtranslation unit های دیگه قابل دسترسی نیست( که این مورد برای متغیر گلوبال که static نباشه برقرار نیست )
تا آنجایی که من اطلاع دارم کلیه متغیرها در پشته تعریف می شوند مگر اینکه از new استفاده شود. درسته؟
نه درست نیست متغیر می تونه داخل data segment یا text segment هم قرار بگیره .
صحبت های جناب rahnama هم درسته متغیر های گلوبال داخل data segment قرار میگیرن(البته اگر const باشن احتمالا زمان optimize کد مقدار داخل text segment جایگزین میشه)
rahnema1
پنج شنبه 30 مرداد 1393, 16:09 عصر
(البته اگر const باشن احتمالا زمان optimize کد مقدار داخل text segment جایگزین میشه)
این را اطمینان دارید؟
omid_kma
پنج شنبه 30 مرداد 1393, 16:37 عصر
این که آیا واقعا حذف میشه یا نه کاملا بستگی به کد داره اگر کامپایلر بتونه تمام جاهایی که اون متغیر ثابت گلوبال استفاده شده رو با مقدار معادل جایگزین کنه متغیر const چونdead code به حساب میاد حذف میشه و دیگه داخل datasegment قرار نمی گیره.
مثلا این کد خیلی بدیهی رو فرض کنید :
const int VAR = 5;
int main()
{
volatile int a= VAR;
}
کد اسمبلی تولیدی :
; Listing generated by Microsoft (R) Optimizing Compiler Version 18.00.21005.1
TITLE test
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB OLDNAMES
EXTRN @__security_check_cookie@4:PROC
PUBLIC _main
; COMDAT _main
_TEXT SEGMENT
_a$ = -4 ; size = 4
_main PROC ; COMDAT
; Line 3
push ebp
mov ebp, esp
push ecx
; Line 4
mov DWORD PTR _a$[ebp], 5 ;inja 5 gozashte shode
; Line 5
xor eax, eax
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
این جا همون طوری که مشخصه متغیر const ای که تعریف شده داخل data segment هم اثری ازش نیست
motherboard
پنج شنبه 30 مرداد 1393, 16:56 عصر
افرین به شما.عجب بحثی شد.چیزی که متوجه نشدم عبارت volatile می باشد.این دیگر چیست؟
omid_kma
پنج شنبه 30 مرداد 1393, 17:01 عصر
در int a=VAR چون a تعریف شده ولی دیگه استفاده نشده در حالت عادی توسط کامپایلر حذف میشه volatile (http://www.7khatcode.com/4495/volatile-%D8%AF%D8%B1-c-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F?show=4495#q4495)ا این اتفاق جلوگیری می کنه
motherboard
پنج شنبه 30 مرداد 1393, 17:08 عصر
در int a=VAR چون a تعریف شده ولی دیگه استفاده نشده در حالت عادی توسط کامپایلر حذف میشه volatile (http://www.7khatcode.com/4495/volatile-%D8%AF%D8%B1-c-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F?show=4495#q4495)ا این اتفاق جلوگیری می کنه
من الان از dev و نسخه 4 استفاده می کنم.من تو کتاب ها به این مورد بر نخوردم.ایا در IDE که من دارم.قابل استفاده است.؟ناگفته نماند که من کدبلاکس و نسخه جدید اون رو دارم.ولی به این dev عادت کردم.!!! احتمالا این ها تو11 C++ معرفی شده؟
omid_kma
پنج شنبه 30 مرداد 1393, 17:14 عصر
نه volatile خیلی قدیمی تره داخل C هم حتی وجود داره .
در مورد dev من اطلاعی ندارم (حقیقتش تا حالا از نزدیک هم ندیدمش ) ولی اجتمالا قابل استفادست
motherboard
جمعه 31 مرداد 1393, 22:52 عصر
سلام.ایا کد پردازنده زیر هم مانند auto به صورت اتوماتیک از نوع مقدار اطلاع پیدا می کنه؟؟؟
#define PI 3.14159
rahnema1
جمعه 31 مرداد 1393, 22:56 عصر
سلام.ایا کد پردازنده زیر هم مانند auto به صورت اتوماتیک از نوع مقدار اطلاع پیدا می کنه؟؟؟
#define PI 3.14159
قبل از کامپایل هر جا PI باشه به جاش 3.14 ریپلیس میشه
خب 3.14 هم میدونیم یک ثابت اعشاریه که به صورت پیش فرض double در نظر گرفته میشه
motherboard
جمعه 31 مرداد 1393, 23:48 عصر
به نظر من دو تا کد زیر با همدیگر برابری می کنند.نظر دوستان چیست؟
const auto PI=3.14;
#define PI 3.14159
ciavosh
جمعه 31 مرداد 1393, 23:58 عصر
حتماً در ++C بایستی از مورد اول استفاده شود تا کامپایلر بتواند Type Checking را به صورت مطلوب انجام دهد و خطاهای احتمالی را بیابد.
motherboard
شنبه 01 شهریور 1393, 00:01 صبح
حتماً در ++C بایستی از مورد اول استفاده شود تا کامپایلر بتواند Type Checking را به صورت مطلوب انجام دهد و خطاهای احتمالی را بیابد.
منظورتون از Type Checking چیست؟ممنون میشم اگر مختصری شرح دهید.
omid_kma
شنبه 01 شهریور 1393, 01:12 صبح
به نظر من دو تا کد زیر با همدیگر برابری می کنند.نظر دوستان چیست؟
const auto PI=3.14;
#define PI 3.14159
برابر که نه نیستند ولی const مزیت هایی داره که داخل این لینک ذکر شده : Const دربرابر define (http://www.7khatcode.com/179/const-%D8%AF%D8%B1-%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1-%23define?show=179#q179)
ciavosh
شنبه 01 شهریور 1393, 09:25 صبح
منظورتون از Type Checking چیست؟ممنون میشم اگر مختصری شرح دهید.
از مکانیسم های ایمنی مهم کامپایلر می باشد. مثلاً کد زیر به دلیل چک های کامپایلر، کامپایل نخواهد شد.
int a = 10;
int* p = a;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.