সি ++ 98 এবং সি ++ 03
এই উত্তরটি সি ++ স্ট্যান্ডার্ডের পুরানো সংস্করণগুলির জন্য। স্ট্যান্ডার্ডটির সি ++ 11 এবং সি ++ 14 সংস্করণগুলিতে আনুষ্ঠানিকভাবে 'সিকোয়েন্স পয়েন্টস' থাকে না; অপারেশনগুলি 'পূর্বে সিকোয়েন্সড' বা 'অনিচ্ছাকৃত' বা 'অনিচ্ছাকৃতভাবে সিকোয়েন্সড' পরিবর্তে হয়। নেট ইফেক্টটি মূলত একই, তবে পরিভাষাটি আলাদা।
দাবি অস্বীকার : ঠিক আছে। এই উত্তরটি কিছুটা দীর্ঘ। সুতরাং এটি পড়ার সময় ধৈর্য রাখুন। আপনি যদি ইতিমধ্যে এই জিনিসগুলি জানেন তবে সেগুলি পুনরায় পড়লে আপনি পাগল হবেন না।
প্রাক-প্রয়োজনীয়তা : সি ++ স্ট্যান্ডার্ডের প্রাথমিক জ্ঞান
সিকোয়েন্স পয়েন্টগুলি কী কী?
স্ট্যান্ডার্ড বলে
ক্রম পয়েন্ট নামক এক্সিকিউশন সিকোয়েন্সের নির্দিষ্ট নির্দিষ্ট পয়েন্টগুলিতে , পূর্ববর্তী মূল্যায়নের সমস্ত পার্শ্ব প্রতিক্রিয়া সম্পূর্ণ হবে এবং পরবর্তী মূল্যায়নের কোনও পার্শ্ব প্রতিক্রিয়া সংঘটিত হবে না। (§1.9 / 7)
ক্ষতিকর দিক? পার্শ্ব প্রতিক্রিয়া কি?
একটি অভিব্যক্তির মূল্যায়ন কিছু উত্পাদন করে এবং অতিরিক্ত প্রয়োগের পরিবেশের অবস্থার পরিবর্তে যদি বলা হয় যে এক্সপ্রেশন (এর মূল্যায়ন) এর কিছু পার্শ্ব প্রতিক্রিয়া রয়েছে s
উদাহরণ স্বরূপ:
int x = y++; //where y is also an int
ইনিশিয়ালেশন অপারেশন ছাড়াও অপারেটরের y
পার্শ্ব প্রতিক্রিয়ার কারণে এর মান পরিবর্তন হয় changed++
এ পর্যন্ত সব ঠিকই. সিকোয়েন্স পয়েন্টগুলিতে এগিয়ে চলছে। Comp.lang.c লেখক প্রদত্ত সিক পয়েন্টগুলির একটি বিকল্প সংজ্ঞা Steve Summit
:
সিকোয়েন্স পয়েন্ট হ'ল একটি সময় যেখানে ধুলা স্থির হয়ে গেছে এবং এখন পর্যন্ত যে সমস্ত পার্শ্ব প্রতিক্রিয়া দেখা গেছে সেগুলি সম্পূর্ণ হওয়ার গ্যারান্টিযুক্ত।
সি ++ স্ট্যান্ডার্ডে তালিকাবদ্ধ সাধারণ সিকোয়েন্স পয়েন্টগুলি কী কী?
ঐগুলি:
পূর্ণ প্রকাশের মূল্যায়নের শেষে ( §1.9/16
) (একটি সম্পূর্ণ-এক্সপ্রেশনটি এমন একটি অভিব্যক্তি যা অন্য কোনও অভিব্যক্তির subexpression নয়)) 1
উদাহরণ:
int a = 5; // ; is a sequence point here
প্রথম প্রকাশ ( §1.9/18
) 2 মূল্যায়নের পরে নিম্নলিখিত প্রতিটি এক্সপ্রেশন মূল্যায়নে
a && b (§5.14)
a || b (§5.15)
a ? b : c (§5.16)
a , b (§5.18)
(এখানে এ, বি একটি কমা অপারেটর; func(a,a++)
,
এটি কমা অপারেটর নয়, এটি কেবল যুক্তিগুলির মধ্যে একটি বিভাজক a
এবং a++
এইভাবে আচরণটি অপরিজ্ঞাত হয় (যদি a
এটি আদিম ধরণের হিসাবে বিবেচনা করা হয়))
ফাংশন বডি ( §1.9/17
) এর কোনও অভিব্যক্তি বা বিবৃতি কার্যকর করার আগে ঘটে যা সমস্ত ফাংশন আর্গুমেন্টের (যদি থাকে তবে) মূল্যায়নের পরে একটি ফাংশন কলের (ফাংশনটি ইনলাইন রয়েছে কিনা) at
1: দ্রষ্টব্য: একটি পূর্ণ-এক্সপ্রেশন মূল্যায়নের মধ্যে বর্ণনামূলকভাবে পূর্ণ-প্রকাশের অংশ নয় এমন subexpressions এর মূল্যায়ন অন্তর্ভুক্ত থাকতে পারে। উদাহরণস্বরূপ, ডিফল্ট আর্গুমেন্ট এক্সপ্রেশন (8.3.6) মূল্যায়নের সাথে জড়িত সুব এক্সপ্রেশনগুলি ফাংশনকে কল করে এমন এক্সপ্রেশনটিতে তৈরি করা বলে মনে করা হয়, ডিফল্ট আর্গুমেন্টকে সংজ্ঞায়িত করে এমন অভিব্যক্তি নয়
২: নির্দেশিত অপারেটরগুলি হ'ল বিল্ট-ইন অপারেটরগুলি, যেমন ক্লজ ৫-এ বর্ণিত হয়েছে, যখন এই অপারেটরগুলির মধ্যে কোনও একটি বৈধ প্রসঙ্গে ওভারলোড হয় (অনুচ্ছেদ ১৩), সুতরাং এইভাবে কোনও ব্যবহারকারী-সংজ্ঞায়িত অপারেটর ফাংশনকে ডিজাইনিং করে, এক্সপ্রেশনটি একটি ফাংশন প্রার্থনার নকশা এবং অপারেশনগুলি তাদের মধ্যে একটি অন্তর্নিহিত ক্রম বিন্দু ছাড়াই একটি যুক্তি তালিকা তৈরি করে।
অপরিবর্তিত আচরণ কী?
স্ট্যান্ডার্ড বিভাগের অনির্ধারিত আচরণ সংজ্ঞায়িত §1.3.12
হিসাবে
আচরণ, যেমন কোনও ভ্রান্ত প্রোগ্রাম নির্মাণ বা ভুল তথ্য ব্যবহারের ফলে উদ্ভূত হতে পারে, যার জন্য এই আন্তর্জাতিক স্ট্যান্ডার্ডটির কোনও প্রয়োজন নেই 3 ।
এই আন্তর্জাতিক স্ট্যান্ডার্ড আচরণের কোনও সুস্পষ্ট সংজ্ঞা বর্ণনার বিবরণ বাদ দিলে অপরিজ্ঞাত আচরণও আশা করা যায়।
3: অনুমোদিত অনির্ধারিত আচরণ পরিস্থিতিটিকে অনাকাঙ্ক্ষিত ফলাফলের সাথে পুরোপুরি উপেক্ষা করা থেকে শুরু করে, পরিবেশের একটি ডকুমেন্টেড পদ্ধতিতে অনুবাদ (ডায়গনিস্টিক বার্তা জারির সাথে বা বহির্গমন) অনুবাদ বা সম্পাদন বন্ধ করে দেওয়া পর্যন্ত অনুবাদ বা প্রোগ্রাম সম্পাদনের সময় আচরণ করা থেকে শুরু করে (ডায়াগনস্টিক বার্তা জারি করে)
সংক্ষেপে, অপরিজ্ঞাত আচরণের অর্থ আপনার নাক থেকে উড়ে আসা ডিমেন থেকে আপনার গার্লফ্রেন্ডের গর্ভবতী হওয়া পর্যন্ত যা কিছু ঘটতে পারে।
অনির্ধারিত আচরণ এবং সিকোয়েন্স পয়েন্টগুলির মধ্যে কী সম্পর্ক?
আমি প্রবেশের আগে আপনাকে অবশ্যই অপরিজ্ঞাত আচরণ, অনির্ধারিত আচরণ এবং বাস্তবায়ন সংজ্ঞায়িত আচরণের মধ্যে পার্থক্য (গুলি) জানতে হবে ।
এটাও আপনার অবশ্যই জানা উচিত the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified
।
উদাহরণ স্বরূপ:
int x = 5, y = 6;
int z = x++ + y++; //it is unspecified whether x++ or y++ will be evaluated first.
এখানে আরও একটি উদাহরণ ।
এখন স্ট্যান্ডার্ড ইন §5/4
বলে
- 1) পূর্ববর্তী এবং পরবর্তী সিকোয়েন্স পয়েন্টের মধ্যে একটি স্কেলার অবজেক্টের তার সঞ্চিত মানটি একবারে অভিব্যক্তির মূল্যায়নের মাধ্যমে একবারে পরিবর্তিত হবে।
এর মানে কী?
অনানুষ্ঠানিকভাবে এর অর্থ হ'ল দুটি সিকোয়েন্স পয়েন্টের মধ্যে একটি ভেরিয়েবল একাধিকবার পরিবর্তন করা উচিত নয়। একটি অভিব্যক্তি বিবৃতিতে, এটি next sequence point
সাধারণত সমাপ্তি সেমিকোলনে থাকে এবং previous sequence point
এটি পূর্ববর্তী বিবরণের শেষে রয়েছে। একটি প্রকাশের মধ্যে অন্তর্বর্তীও থাকতে পারে sequence points
।
উপরোক্ত বাক্য থেকে নিম্নলিখিত অভিব্যক্তিগুলি অনির্ধারিত আচরণের জন্য আহ্বান জানায়:
i++ * ++i; // UB, i is modified more than once btw two SPs
i = ++i; // UB, same as above
++i = 2; // UB, same as above
i = ++i + 1; // UB, same as above
++++++i; // UB, parsed as (++(++(++i)))
i = (i, ++i, ++i); // UB, there's no SP between `++i` (right most) and assignment to `i` (`i` is modified more than once btw two SPs)
তবে নিম্নলিখিত প্রকাশগুলি ঠিক আছে:
i = (i, ++i, 1) + 1; // well defined (AFAIK)
i = (++i, i++, i); // well defined
int j = i;
j = (++i, i++, j*i); // well defined
- 2) তদ্ব্যতীত, পূর্বের মানটি কেবলমাত্র সংরক্ষণ করা হবে তা নির্ধারণের জন্য অ্যাক্সেস করা হবে।
এর মানে কী? এর অর্থ যদি কোনও বস্তু একটি সম্পূর্ণ অভিব্যক্তিতে লিখিত হয়, একই অভিব্যক্তির মধ্যে এটির যে কোনও এবং সমস্ত অ্যাকসেস অবশ্যই লিখার জন্য মানের গণনার সাথে জড়িত থাকতে হবে ।
উদাহরণস্বরূপ, i = i + 1
সমস্ত অ্যাক্সেসে i
(এলএইচএস এবং আরএইচএসে) লিখিত হওয়া মানের গণনার সাথে সরাসরি জড়িত । সুতরাং এটি ঠিক আছে।
এই নিয়মটি কার্যকরভাবে সংশোধন করার আগে অ্যাক্সেসগুলিতে তাদের আইনী ভাব প্রকাশকে সীমাবদ্ধ করে।
উদাহরণ 1:
std::printf("%d %d", i,++i); // invokes Undefined Behaviour because of Rule no 2
উদাহরণ 2:
a[i] = i++ // or a[++i] = i or a[i++] = ++i etc
অনুমোদিত নয় কারণ এর i
( অ্যাক্সেসের a[i]
) একের অ্যাক্সেসের সাথে মানটির কোনও সম্পর্ক নেই যা শেষ হয়ে যায় আমি (যা এর মধ্যে ঘটে i++
) সংরক্ষণ করা হয়, এবং তাই সংজ্ঞায়নের জন্য কোনও ভাল উপায় নেই - হয় আমাদের বোঝার জন্য বা সংকলকটির - বর্ধিত মান সংরক্ষণের আগে বা পরে অ্যাক্সেস হওয়া উচিত কিনা। সুতরাং আচরণটি অপরিজ্ঞাত।
উদাহরণ 3:
int x = i + i++ ;// Similar to above
সি ++ 11 এর জন্য উত্তর এখানে অনুসরণ করুন ।
*p++ = 4
অপরিবর্তিত আচরণ নয়।*p++
হিসাবে ব্যাখ্যা করা হয়*(p++)
।p++
আয়p
(ক অনুলিপি) এবং পূর্ববর্তী ঠিকানায় সংরক্ষিত মান। কেন এটি ইউবি ডাকে? এটা পুরোপুরি ঠিক আছে।