এই বিষয়টিকে নিম্নলিখিত বিষয়ের একটি অনুক্রম বিবেচনা করুন:
পূর্ববর্তী কিস্তি
অনির্ধারিত আচরণ এবং ক্রম পয়েন্ট
আসুন এই মজাদার এবং সংশ্লেষিত অভিব্যক্তিটি পুনরায় ঘুরে দেখি (তাত্পর্যপূর্ণ বাক্যাংশগুলি উপরের বিষয় থেকে নেওয়া হয়েছে * হাসি *):
i += ++i;
আমরা বলি এটি অনির্ধারিত-আচরণকে আহ্বান করে। আমি অনুমান যে যখন এই বলে, আমরা পরোক্ষভাবে যে অনুমান টাইপ এর i
বিল্ট-ইন ধরনের একটি।
কি হবে যদি টাইপ এর i
একটি ব্যবহারকারী-সংজ্ঞায়িত ধরনের? বলুন এর ধরণটি Index
যা এই পোস্টে পরে সংজ্ঞায়িত হয়েছে (নীচে দেখুন)। এটি কি এখনও অপরিজ্ঞাত আচরণের জন্য প্রার্থনা করবে?
যদি হ্যাঁ, কেন? এটি কি লেখার সমতুল্য নয় i.operator+=(i.operator++());
এমনকি সিনট্যাক্টিক্যালি সহজ i.add(i.inc());
? অথবা, তারাও কি অনির্ধারিত আচরণের ডাক দেয়?
যদি না হয় তবে কেন? সর্বোপরি, টানা ধারাবাহিক পয়েন্টগুলির মধ্যে অবজেক্টটি দু'বারi
সংশোধিত হয় । অনুগ্রহ করে থাম্বের নিয়মটি স্মরণ করুন: একটি অভিব্যক্তি ধারাবাহিক "সিকোয়েন্স পয়েন্টগুলির মধ্যে একবারে একবারে কোনও জিনিসের মান পরিবর্তন করতে পারে And এবং যদি i += ++i
একটি অভিব্যক্তি হয় তবে অবশ্যই এটি অপরিজ্ঞাত আচরণের জন্য প্রার্থনা করবে If যদি তাই হয় তবে এর সমতুল্য i.operator+=(i.operator++());
এবং i.add(i.inc());
অবশ্যই অপরিবর্তিত আচরণের জন্য প্রার্থনা করতে হবে" অসত্য বলে মনে হচ্ছে! (যতদূর আমি বুঝতে পারি)
বা, i += ++i
একটি অভিব্যক্তি দিয়ে শুরু হয় না? যদি তাই হয় তবে তা কী এবং ভাবের সংজ্ঞা কী ?
যদি একটি অভিব্যক্তি, এবং একই সময়ে তার আচরণ এছাড়াও ভালভাবে সংজ্ঞায়িত, তাহলে এটি যে বোঝা একটি অভিব্যক্তি সঙ্গে যুক্ত ক্রম বিন্দুর সংখ্যা একরকম উপর নির্ভর করে টাইপ অভিব্যক্তি জড়িত operands করুন। আমি কি সঠিক (এমনকি আংশিক)?
যাইহোক, কিভাবে এই অভিব্যক্তি সম্পর্কে?
//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!
a[++i] = i; //Taken from the previous topic. But here type of `i` is Index.
আপনার প্রতিক্রিয়াতে আপনাকে এটি অবশ্যই বিবেচনা করতে হবে (যদি আপনি এটির আচরণটি নিশ্চিতভাবে জানেন তবে)। :-)
হয়
++++++i;
সি ++ 03 তে ভাল সংজ্ঞায়িত? সর্বোপরি, এটি এই,
((i.operator++()).operator++()).operator++();
class Index
{
int state;
public:
Index(int s) : state(s) {}
Index& operator++()
{
state++;
return *this;
}
Index& operator+=(const Index & index)
{
state+= index.state;
return *this;
}
operator int()
{
return state;
}
Index & add(const Index & index)
{
state += index.state;
return *this;
}
Index & inc()
{
state++;
return *this;
}
};