PDA

View Full Version : مقاله: نکته ای در مورد آرایه ها



Salar Ashgi
یک شنبه 10 شهریور 1387, 20:59 عصر
سلام ، می خواهم برای کسانی که تازه در مورد آرایه ها می خوانند ، نکته ای را بگویم ،

در سی پلاس پلاس میشه جای اندیس و نام آرایه رو عوض کرد ، به کد نگاه کنید :


#include <iostream>
#include <conio>
int main(){
int a[]={1,2,3,4};
for(int i=0;i<4;i++)
cout<<a[i]<<" ";
cout<<"\n";
cout<<"----------------------\n";
for(int i=0;i<4;i++)
cout<<i[a]<<" "; //Changing the name of array and index
cout<<"\n";
getch();
}

البته این کار از جهت برنامه نویسی کار درستی به حساب نمیاد و ممکنه باعث ایجاد خطا

در برنامه بشه ، ولی فقط جهت اطلاع و تحت عنوان نکته بود !!!!

موفق و پیروز باشید !!!!

emad_67
دوشنبه 11 شهریور 1387, 09:41 صبح
علتش اینه که وقتی می نویسی:


cout<<a[1];

c++ با اون به این شکل رفتار می کنه:


cout<<*(a+1);

حالا وقتی اینجوری هم مینویسی:


cout<<1[a];

باز هم به آدرس a یک واحد اضافه میشه و محتویات اون خونه رو برات نشون میده.
عملگر [] فقط نقش یک oveload رو بازی می کنه.

Salar Ashgi
دوشنبه 11 شهریور 1387, 11:09 صبح
علتش اینه که وقتی می نویسی:


cout<<a[1];

c++ با اون به این شکل رفتار می کنه:


cout<<*(a+1);

حالا وقتی اینجوری هم مینویسی:


cout<<1[a];

باز هم به آدرس a یک واحد اضافه میشه و محتویات اون خونه رو برات نشون میده.
عملگر [] فقط نقش یک oveload رو بازی می کنه.

=========================================

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

مورد استفاده قرار گیرند ، چرا که یک آرایه همان اشاره گری به خانه اولش است !!!

bsng110
دوشنبه 11 شهریور 1387, 16:25 عصر
هوالحکیم. سلام. جسارت نباشد، ولی به هیچ کدوم این حرف هایی که شما گفتید، ربط ندارد؟! نمی دانم تا به حال درس کامپایلر گذرانده اید یا خیر ولی اگر گذرانده باشید و یا کتابی در این زمینه خوانده باشید، می فهمید که در مورد [i[a کامپایلر باید خطای معنایی بدهد ولی اینکه چرا کامپایلر C و ++C چنین خطایی نمی دهند، بستگی به پیاده سازی کامپایلرشان دارد و الا از نظر منطقی چنین کاری کاملاً غیر معقول است. نمی دانم آیا به جای [a[i][j هم می توان نوشت [i[j][a یا نه ولی این یکی دیگه خیلی بعیده! در ضمن یادتون باشه که [] برای تایپ مبنایی int هیچ وقت گرانبار نشده! یا علی حق نگهدارتون

Salar Ashgi
دوشنبه 11 شهریور 1387, 20:24 عصر
هوالحکیم. سلام. جسارت نباشد، ولی به هیچ کدوم این حرف هایی که شما گفتید، ربط ندارد؟! نمی دانم تا به حال درس کامپایلر گذرانده اید یا خیر ولی اگر گذرانده باشید و یا کتابی در این زمینه خوانده باشید، می فهمید که در مورد [i[a کامپایلر باید خطای معنایی بدهد ولی اینکه چرا کامپایلر C و ++C چنین خطایی نمی دهند، بستگی به پیاده سازی کامپایلرشان دارد و الا از نظر منطقی چنین کاری کاملاً غیر معقول است. نمی دانم آیا به جای [a[i][j هم می توان نوشت [i[j][a یا نه ولی این یکی دیگه خیلی بعیده! در ضمن یادتون باشه که [] برای تایپ مبنایی int هیچ وقت گرانبار نشده! یا علی حق نگهدارتون

=====================
به نظر من این کار ممکنه ار لحاظ برنامه نویسی غیر اصولی باشه ولی برای کامپایلر کاملا

تعریف شده است ، چرا که کامپایلر در کار با آرایه ها از اشاره گر بهره میجوید !!!!


به هیچ کدوم این حرف هایی که شما گفتید، ربط ندارد؟!

اگه خوب دقت کرده باشید ، حرفهای من کاملا مرتبط با آنچه که توضیح دادم ، میباشد !!!!

:متفکر: ما در برنامه نویسی باید هر روز دنبال یک نکته و ترفند جدید باشیم ، وگرنه پیشرفتی

در کار نخواهد بود :متفکر:

---------------------------------
موفق و پیروز باشید در پناه حق تعالی !!!! حلول ماه مبارک و پر فضیلت رمضان را نیز به همه

برنامه نویسان گرامی تبریک می گویم !!!:لبخندساده:

emad_67
دوشنبه 11 شهریور 1387, 23:49 عصر
هوالحکیم. سلام. جسارت نباشد، ولی به هیچ کدوم این حرف هایی که شما گفتید، ربط ندارد؟! نمی دانم تا به حال درس کامپایلر گذرانده اید یا خیر ولی اگر گذرانده باشید و یا کتابی در این زمینه خوانده باشید، می فهمید که در مورد [i[a کامپایلر باید خطای معنایی بدهد ولی اینکه چرا کامپایلر C و ++C چنین خطایی نمی دهند، بستگی به پیاده سازی کامپایلرشان دارد و الا از نظر منطقی چنین کاری کاملاً غیر معقول است. نمی دانم آیا به جای [a[i][j هم می توان نوشت [i[j][a یا نه ولی این یکی دیگه خیلی بعیده!
علت اینکه در اینجور موارد خطایی داده نمیشه این هست که نوع برنامه نویسی ئی که انجام میدیم managed شده نیست و همه موارد رو باید برنامه نویس کنترل کنه. مطمئنا اگه شما توی C# بیای همچین چیزی رو بنویسی کامایلر ازت ارور میگیره. اینجور موارد خیلی زیاده مثلا می تونی یک آرایه رو با 4 تا خونه تخصیص حافظه کنی ولی 5 تا خونه از اون رو مقدار بدی یا مثلا دستورات strcpy و ..... در کل c++ هیچ کنترلی روی اشاره گر ها نداره و همه چیز رو برنامه نویس باید تعیین کنه

در ضمن یادتون باشه که [] برای تایپ مبنایی int هیچ وقت گرانبار نشده!
علت اینکه می فرمایید سربار گذاری نشده چیه؟

Nima_NF
سه شنبه 12 شهریور 1387, 04:22 صبح
خیر، علت آن است که عملگر [] به شکل زیر عمل می کند:



exp1[exp2]

*( ( exp1) + (exp1) )


پس اگر هر دو جابجا شوند، باز هم همان جواب بدست می آید.

دوستانی که منبع معتبری برای این مورد می خواهند از این لینک استفاده کنند (http://msdn.microsoft.com/en-us/library/th52k9c8.aspx)

Salar Ashgi
سه شنبه 12 شهریور 1387, 08:46 صبح
خیر، علت آن است که عملگر [] به شکل زیر عمل می کند:



exp1[exp2]


*( ( exp1) + (exp1) )



پس اگر هر دو جابجا شوند، باز هم همان جواب بدست می آید.




دوستانی که منبع معتبری برای این مورد می خواهند از این لینک استفاده کنند (http://msdn.microsoft.com/en-us/library/th52k9c8.aspx)





=======================================

قابل توجه دوست عزیز bsng110 ، منظور من هم دقیقا همین بود :لبخندساده:!!!