আমি মনে করি অন্য উত্তরগুলি দিয়ে কিছু মিস হচ্ছে।
হ্যাঁ, p[i]
সংজ্ঞা অনুসারে সমান *(p+i)
, যা (কারণ সংযোজনীয় হয়) এর সমতুল্য *(i+p)
, যা (আবার []
অপারেটরের সংজ্ঞা অনুসারে ) সমতুল্য i[p]
।
(এবং এর মধ্যে array[i]
অ্যারের নামটি সুস্পষ্টভাবে অ্যারের প্রথম উপাদানটিতে পয়েন্টারে রূপান্তরিত হয়))
তবে সংযোজনের যোগাযোগের বিষয়টি এই ক্ষেত্রে সুস্পষ্ট নয়।
উভয় operands একই ধরনের, অথবা এমনকি বিভিন্ন সাংখ্যিক ধরনের একটি সাধারণ ধরন উন্নীত করছে হয়, commutativity নির্ভুল জ্ঞান করে তোলে: x + y == y + x
।
তবে এই ক্ষেত্রে আমরা নির্দিষ্টভাবে পয়েন্টার গাণিতিক সম্পর্কে বলছি, যেখানে একটি অপারেন্ড একটি পয়েন্টার এবং অন্যটি একটি পূর্ণসংখ্যা। (পূর্ণসংখ্যা + পূর্ণসংখ্যা একটি পৃথক ক্রিয়াকলাপ, এবং পয়েন্টার + পয়েন্টারটি বাজে is
+
অপারেটরের সি স্ট্যান্ডার্ডের বিবরণ ( N1570 6.5.6) বলেছেন:
অতিরিক্ত হিসাবে, উভয় অপারেন্ডের গাণিতিক টাইপ থাকবে, বা একটি অপারেন্ড একটি সম্পূর্ণ অবজেক্ট টাইপের পয়েন্টার এবং অন্যটির পূর্ণসংখ্যার টাইপ থাকবে।
এটি ঠিক যেমনটি বলতে পারত:
অতিরিক্ত হিসাবে, উভয় অপারেন্ডের গাণিতিক টাইপ থাকবে, বা বাম
অপারেন্ড একটি সম্পূর্ণ অবজেক্ট টাইপের পয়েন্টার হবে এবং ডান অপারেন্ডের
পূর্ণসংখ্যার প্রকার থাকবে।
উভয় ক্ষেত্রে i + p
এবং i[p]
অবৈধ হবে।
সি ++ পদে, আমাদের কাছে সত্যিই ওভারলোডেড +
অপারেটরগুলির দুটি সেট রয়েছে , যা আলগাভাবে বর্ণনা করা যেতে পারে:
pointer operator+(pointer p, integer i);
এবং
pointer operator+(integer i, pointer p);
যার মধ্যে শুধুমাত্র প্রথমটি প্রয়োজনীয়।
তাহলে কেন এইভাবে?
সি ++ সি এর কাছ থেকে এই সংজ্ঞাটি উত্তরাধিকার সূত্রে পেয়েছে, যা এটি বি থেকে পেয়েছে (অ্যারে ইনডেক্সিংয়ের পরিবহণের বিষয়টি স্পষ্টভাবে উল্লিখিত হয়েছে ১৯২২ এর বি এর ব্যবহারকারীদের রেফারেন্সে ), যা এটি বিসিপিএল থেকে পেয়েছে (ম্যানুয়াল ১৯ 1967 তারিখের), এটি সম্ভবত এটি থেকেও অর্জন করেছে আগের ভাষা (সিপিএল? আলগোল?))
সুতরাং অ্যারে সূচকগুলি সংযোজনের শর্তে সংজ্ঞায়িত করা হয়েছে, এবং এটি যোগফল এমনকি একটি পূর্ণসংখ্যার এমনকি ক্রমবর্ধমান, বহু দশক ধরে সি এর পূর্বপুরুষের ভাষায় ফিরে যায়।
সেই ভাষাগুলি আধুনিক সি এর চেয়ে অনেক কম শক্তভাবে টাইপ করা হয়েছিল। বিশেষত, পয়েন্টার এবং পূর্ণসংখ্যার মধ্যে পার্থক্য প্রায়শই উপেক্ষা করা হয়। (প্রাথমিক পর্যায়ে সি প্রোগ্রামাররা কখনও কখনও unsigned
ভাষার সাথে কীওয়ার্ড যুক্ত হওয়ার আগে পয়েন্টারগুলিকে স্বাক্ষরবিহীন পূর্ণসংখ্যার হিসাবে ব্যবহার করত ।) সুতরাং অপারেটরগুলি বিভিন্ন ধরণের হওয়ায় সংযোজনকে অ-পরিবহণমূলক করার ধারণাটি সম্ভবত এই ভাষাগুলির ডিজাইনারদের কাছে ঘটেনি। যদি কোনও ব্যবহারকারী দুটি "জিনিস" যুক্ত করতে চেয়েছিলেন, তবে এই "জিনিসগুলি" পূর্ণসংখ্যা, পয়েন্টার বা অন্য কিছু হোক না কেন, এটি প্রতিরোধ করার জন্য এটি ভাষাটির উপর নির্ভর করে না।
এবং কয়েক বছর ধরে, সেই নিয়মে যে কোনও পরিবর্তনই বিদ্যমান কোডটি ভেঙে ফেলবে (যদিও 1989 এএনএসআই সি মানক একটি ভাল সুযোগ হতে পারে)।
বামদিকে পয়েন্টারটি লাগাতে সি এবং / অথবা সি ++ পরিবর্তন করা এবং ডানদিকে পূর্ণসংখ্যা কিছু বিদ্যমান কোডটি ভেঙে দিতে পারে, তবে প্রকৃত অভিব্যক্তিগত ক্ষতির কোনও ক্ষতি হবে না।
সুতরাং এখন আমাদের ঠিক একই জিনিস রয়েছে arr[3]
এবং এর 3[arr]
অর্থ হ'ল যদিও পরবর্তী ফর্মটি কখনও আইওসিসি-র বাইরে উপস্থিত না হওয়া উচিত ।