সি এবং সি ++ এ অপরিবর্তিত আচরণ কী? অনির্দিষ্ট আচরণ এবং বাস্তবায়ন-সংজ্ঞায়িত আচরণ সম্পর্কে কী? তাদের মধ্যে পার্থক্য কী?
সি এবং সি ++ এ অপরিবর্তিত আচরণ কী? অনির্দিষ্ট আচরণ এবং বাস্তবায়ন-সংজ্ঞায়িত আচরণ সম্পর্কে কী? তাদের মধ্যে পার্থক্য কী?
উত্তর:
সি এবং সি ++ ভাষার সেই দিকগুলির মধ্যে একটি অপরিজ্ঞাত আচরণ যা অন্য ভাষা থেকে আগত প্রোগ্রামারদের জন্য আশ্চর্য হতে পারে (অন্যান্য ভাষাগুলি এটিকে আরও ভাল করে আড়াল করার চেষ্টা করে)। মূলত, সি ++ প্রোগ্রামগুলি লেখা সম্ভব যা পূর্বাভাসযোগ্য পদ্ধতিতে আচরণ করে না, যদিও অনেক সি ++ সংকলক প্রোগ্রামটিতে কোনও ত্রুটির খবর দেয় না!
আসুন একটি ক্লাসিক উদাহরণ দেখুন:
#include <iostream>
int main()
{
char* p = "hello!\n"; // yes I know, deprecated conversion
p[0] = 'y';
p[5] = 'w';
std::cout << p;
}
ভেরিয়েবলটি p
স্ট্রিং আক্ষরিকের দিকে নির্দেশ করে "hello!\n"
এবং নীচে দুটি অ্যাসাইনমেন্ট সেই স্ট্রিং আক্ষরিক সংশোধন করার চেষ্টা করে। এই প্রোগ্রামটি কি করে? সি ++ স্ট্যান্ডার্ডের ১১.১৪.৫ অনুচ্ছেদ অনুযায়ী, এটি অপরিজ্ঞাত আচরণের জন্য আহ্বান জানিয়েছে :
একটি স্ট্রিং আক্ষরিক সংশোধন করার চেষ্টা করার প্রভাবটি সংজ্ঞায়িত।
আমি লোকেরা চিৎকার করতে শুনতে পেয়েছি "তবে অপেক্ষা করুন, আমি এটি কোনও সমস্যা সঙ্কলন করে আউটপুট পেতে yellow
পারি" বা "আপনি কী বোঝাতে চান তা বোঝা যাচ্ছে না, স্ট্রিং আক্ষরিকাগুলি কেবল পঠনযোগ্য মেমরিতে সংরক্ষণ করা হয়, সুতরাং প্রথম অ্যাসাইনমেন্টের চেষ্টাটি একটি কোষের ফলাফলের ফলাফল"। অনির্ধারিত আচরণের সাথে ঠিক এটাই সমস্যা। মূলত, একবার আপনি সংজ্ঞায়িত আচরণ (এমনকি অনুনাসিক অসুরগুলি) শুরু করলে মানকটি কিছু হতে দেয়। আপনার ভাষার মানসিক মডেল অনুসারে যদি "সঠিক" আচরণ হয়, তবে সেই মডেলটি কেবল ভুল wrong সি ++ স্ট্যান্ডার্ডের একমাত্র ভোট, সময়কাল।
অনির্ধারিত আচরণ অন্যান্য উদাহরণ তার সীমা অতিক্রম একটি অ্যারের অ্যাক্সেস অন্তর্ভুক্ত, নাল পয়েন্টার dereferencing , বস্তু অ্যাক্সেস পর তাদের জীবদ্দশায় শেষ হয়েছে বা লেখার অভিযোগে চালাক এক্সপ্রেশন মত i++ + ++i
।
সি ++ স্ট্যান্ডার্ডের ১.৯ বিভাগে অপরিজ্ঞিত আচরণের দুটি কম বিপজ্জনক ভাই, অনির্দিষ্ট আচরণ এবং প্রয়োগ-সংজ্ঞায়িত আচরণের কথাও উল্লেখ করা হয়েছে :
এই আন্তর্জাতিক স্ট্যান্ডার্ডের শব্দার্থ বিবরণ একটি প্যারামিটারাইজড ননডেটারিস্টেমিক অ্যাবস্ট্রাক্ট মেশিনকে সংজ্ঞায়িত করে।
বিমূর্ত মেশিনের কয়েকটি বিষয় এবং ক্রিয়াকলাপগুলি এই আন্তর্জাতিক স্ট্যান্ডার্ডে বাস্তবায়ন-সংজ্ঞায়িত হিসাবে বর্ণনা করা হয়েছে (উদাহরণস্বরূপ,
sizeof(int)
)। এগুলি বিমূর্ত মেশিনের প্যারামিটার গঠন করে। প্রতিটি বাস্তবায়নের ক্ষেত্রে এই বিষয়গুলির বৈশিষ্ট্য এবং আচরণের বর্ণনা দেওয়ার সাথে ডকুমেন্টেশন অন্তর্ভুক্ত থাকবে।বিমূর্ত মেশিনের কিছু অন্যান্য দিক এবং ক্রিয়াকলাপ এই আন্তর্জাতিক স্ট্যান্ডার্ডে অনির্ধারিত হিসাবে বর্ণনা করা হয়েছে (উদাহরণস্বরূপ, কোনও ফাংশনে আর্গুমেন্টের মূল্যায়নের ক্রম)। যেখানে সম্ভব, এই আন্তর্জাতিক স্ট্যান্ডার্ড অনুমতিযোগ্য আচরণগুলির একটি সেট সংজ্ঞায়িত করে। এগুলি অ্যাবস্ট্রাক্ট মেশিনের ননডেটেরিস্টেমিক দিকগুলি সংজ্ঞায়িত করে।
কিছু অন্যান্য ক্রিয়াকলাপ এই আন্তর্জাতিক স্ট্যান্ডার্ডে অপরিজ্ঞাত হিসাবে বর্ণনা করা হয়েছে (উদাহরণস্বরূপ, নাল পয়েন্টারকে অবজ্ঞা করার প্রভাব)। [ দ্রষ্টব্য : এই আন্তর্জাতিক স্ট্যান্ডার্ডটি এমন প্রোগ্রামগুলির আচরণের জন্য কোনও আবশ্যকতা আরোপ করে না যা অপরিজ্ঞাত আচরণ করে। - শেষ নোট ]
বিশেষত, বিভাগ 1.3.24 বলে:
অনুমানযোগ্য অনির্ধারিত আচরণ পরিস্থিতিটি অনির্দেশ্য ফলাফলের সাথে পুরোপুরি উপেক্ষা করা থেকে শুরু করে, পরিবেশের বৈশিষ্ট্যযুক্ত একটি ডকুমেন্টেড পদ্ধতিতে অনুবাদ বা প্রোগ্রামের সম্পাদনের সময় আচরণ করা (ডায়াগনস্টিক বার্তা জারি করা বা ছাড়াই), একটি অনুবাদ বা কার্যকরকরণ (ইস্যু সহ) ডায়গনিস্টিক বার্তার)।
অপরিবর্তিত আচরণে দৌড়াতে আপনি কী করতে পারেন? মূলত, আপনাকে লেখকরা ভাল সি ++ বই পড়তে হবে যারা জানেন তারা কী বিষয়ে কথা বলছেন। ইন্টারনেট টিউটোরিয়াল স্ক্রু। স্ক্রু বালচিল্ড।
int f(){int a; return a;}
: a
ফাংশন কলগুলির মধ্যে মানটির পরিবর্তন হতে পারে।
ভাল, এটি মূলত স্ট্যান্ডার্ড থেকে একটি সরাসরি কপি-পেস্ট
৩.৪.১ 1 বাস্তবায়ন-সংজ্ঞায়িত আচরণ অনির্দিষ্ট আচরণ যেখানে প্রতিটি প্রয়োগ কীভাবে পছন্দ করা হয় তা দলিল করে
2 উদাহরণ বাস্তবায়ন-সংজ্ঞায়িত আচরণের একটি উদাহরণ হ'ল অর্ডার বিটের প্রচার যখন একটি স্বাক্ষরকৃত পূর্ণসংখ্যা ডানদিকে সরানো হয়।
3.4.3 1 অনির্ধারিত আচরণ আচরণ, একটি nonportable বা ভ্রান্ত কর্মসূচি কনস্ট্রাক্ট বা ভ্রান্ত তথ্য, যার জন্য ব্যবহার উপর এই ইন্টারন্যাশনাল স্ট্যান্ডার্ড কোন প্রয়োজনীয়তা imposes
2 দ্রষ্টব্য সম্ভাব্য অপরিজ্ঞাত আচরণটি পরিস্থিতিটি অনির্দেশ্য ফলাফলের সাথে পুরোপুরি উপেক্ষা করা থেকে শুরু করে, পরিবেশের একটি ডকুমেন্টেড পদ্ধতিতে অনুবাদ করা বা প্রোগ্রাম সম্পাদনের সময় আচরণ করা (ডায়াগনস্টিক বার্তা জারি করা বা ছাড়াই), একটি অনুবাদ বা কার্যকরকরণ (সহ) ডায়াগনস্টিক বার্তা জারি)।
3 উদাহরণ অপরিবর্তিত আচরণের একটি উদাহরণ হল পূর্ণসংখ্যার ওভারফ্লোতে আচরণ।
৩.৪.৪ এক অনির্ধারিত আচরণের ব্যবহারের অনির্ধারিত ব্যবহারের ব্যবহার, বা অন্য আচরণ যেখানে এই আন্তর্জাতিক স্ট্যান্ডার্ডটি দুই বা ততোধিক সম্ভাব্যতা সরবরাহ করে এবং কোনও প্রয়োজনে কোন প্রয়োজনে বেছে নেওয়া হয়েছে তার জন্য আরও কোনও প্রয়োজনীয়তা চাপায় না
2 উদাহরণ অনির্দিষ্ট আচরণের একটি উদাহরণ হ'ল ক্রমটির পক্ষে যুক্তিগুলি মূল্যায়ন করা হয়।
int foo(int x) { if (x >= 0) launch_missiles(); return x << 1; }
একটি সংকলক প্রদত্ত নির্ধারণ করতে পারে যেহেতু ক্ষেপণাস্ত্রগুলি প্রবর্তন না করে এমন ফাংশনটি চালনার সমস্ত উপায় অনির্ধারিত আচরণের ডাক দেয়, এটি কলটিকে launch_missiles()
নিঃশর্ত অবস্থায় রাখতে পারে।
স্ট্যান্ডার্ডগুলির কঠোর সংজ্ঞা তুলনায় বোঝার পক্ষে সহজ কথা বলা সহজ হতে পারে।
বাস্তবায়ন-সংজ্ঞায়িত আচরণ
ভাষাটি বলে যে আমাদের কাছে ডেটা-প্রকার রয়েছে। সংকলক বিক্রেতারা নির্দিষ্ট করে যে তারা কোন মাপ ব্যবহার করবে এবং তারা কী করেছে তার একটি ডকুমেন্টেশন সরবরাহ করবে।
অপরিবর্তিত আচরণ
আপনি কিছু ভুল করছেন। উদাহরণস্বরূপ, int
এটির মধ্যে আপনার খুব বড় মান রয়েছে যা মানানসই নয় char
। আপনি কিভাবে এই মান রাখবেন char
? আসলে কোন উপায় নেই! যে কোনও কিছু ঘটতে পারে, তবে সবচেয়ে বুদ্ধিমান জিনিসটি হ'ল সেই ইন্টের প্রথম বাইটটি নিয়ে putোকানো char
। প্রথম বাইট নির্ধারণের জন্য এটি করা ঠিক ভুল, তবে হুডের নীচে কী ঘটে তা স্থির করে।
অনির্দিষ্ট আচরণ
এই দুটির কোন কাজটি প্রথমে কার্যকর করা হয়?
void fun(int n, int m);
int fun1()
{
cout << "fun1";
return 1;
}
int fun2()
{
cout << "fun2";
return 2;
}
...
fun(fun1(), fun2()); // which one is executed first?
বাম থেকে ডানে বা ডান থেকে বামে ভাষা মূল্যায়ন নির্দিষ্ট করে না! সুতরাং একটি অনির্ধারিত আচরণের ফলে একটি অনির্ধারিত আচরণের ফলাফল হতে পারে বা নাও হতে পারে তবে অবশ্যই আপনার প্রোগ্রামটি একটি অনির্ধারিত আচরণ তৈরি করবে না।
@ ই এসকে আমি মনে করি আপনার প্রশ্নটি আরও স্পষ্ট করার জন্য উত্তরটি সম্পাদনা করার উপযুক্ত :)
জন্য
fun(fun1(), fun2());
ব্যবহার "বাস্তবায়ন ডিফাইন্ড" নয়? সংকলক একটি বা অন্য কোর্স চয়ন করতে হবে, সর্বোপরি?
বাস্তবায়ন-সংজ্ঞায়িত এবং অনির্ধারিত মধ্যে পার্থক্য হ'ল কম্পাইলারটি প্রথম ক্ষেত্রে একটি আচরণ বেছে নেওয়ার কথা বলে তবে এটি দ্বিতীয় ক্ষেত্রে করতে হয় না। উদাহরণস্বরূপ, একটি বাস্তবায়নের অবশ্যই একটি এবং একমাত্র সংজ্ঞা থাকতে হবে sizeof(int)
। সুতরাং, এটি sizeof(int)
প্রোগ্রামের কিছু অংশের জন্য 4 এবং অন্যদের জন্য 8 টি বলতে পারে না । অনির্ধারিত আচরণের বিপরীতে, যেখানে সংকলক ঠিক বলতে পারে আমি এই তর্কগুলি বাম-থেকে-ডানদিকে মূল্যায়ন করব এবং পরবর্তী ফাংশনের যুক্তিগুলি ডান থেকে বামে মূল্যায়ন করা হবে। এটি একই প্রোগ্রামে ঘটতে পারে, এজন্য এটিকে অনির্দিষ্ট বলা হয় । আসলে, সি ++ আরও সহজ করা যেতে পারে যদি কিছু অনির্দিষ্ট আচরণের নির্দিষ্ট করা হয়। তার জন্য এখানে ডঃ স্ট্রোস্ট্রপের জবাবটি দেখুন :
দাবি করা হয় যে সংকলককে এই স্বাধীনতা প্রদান এবং "বাম থেকে ডানদিকে সাধারণ মূল্যায়নের" প্রয়োজনীয়তার মধ্যে পার্থক্য উল্লেখযোগ্য হতে পারে। আমি অপ্রকাশিত, তবে অগণিত সংকলক স্বাধীনতার সুযোগ নিয়ে "কিছুটা বাইরে" এবং কিছু লোক আবেগের সাথে যে স্বাধীনতা রক্ষা করেছে, একটি পরিবর্তন কঠিন হবে এবং সি এবং সি ++ ওয়ার্ল্ডের দূরবর্তী কোণগুলিতে প্রবেশ করতে কয়েক দশক সময় লাগতে পারে। আমি হতাশ হয়েছি যে সমস্ত সংকলক ++ i + i ++ এর মতো কোডের বিরুদ্ধে সতর্ক করে না। একইভাবে, যুক্তিগুলির মূল্যায়নের ক্রমটি অনির্ধারিত।
আইএমওতে অনেকগুলি "জিনিস" অপরিজ্ঞাত, অনির্ধারিত, বাস্তবায়ন-সংজ্ঞায়িত ইত্যাদি রয়েছে However তবে, এটি বলা সহজ এবং এর উদাহরণ দেওয়াও সহজ, তবে এটি ঠিক করা শক্ত। এটিও লক্ষ করা উচিত যে বেশিরভাগ সমস্যা এড়ানো এবং পোর্টেবল কোড তৈরি করা এতটা কঠিন নয়।
fun(fun1(), fun2());
আচরণ নয় "implementation defined"
? সংকলক একটি বা অন্য কোর্স চয়ন করতে হবে, সর্বোপরি?
"I am gonna evaluate these arguments left-to-right and the next function's arguments are evaluated right-to-left"
আমি বুঝি যে এই can
ঘটে। আমরা আজকাল যে সংকলকগুলিকে ব্যবহার করি তা কি সত্যিই হয়?
অফিসিয়াল সি রেশনেল ডকুমেন্ট থেকে
শর্তাদি অনির্ধারিত আচরণ, অপরিজ্ঞাত আচরণ এবং বাস্তবায়ন-সংজ্ঞায়িত আচরণগুলি এমন প্রোগ্রামগুলি লেখার ফলাফলকে শ্রেণিবদ্ধ করতে ব্যবহৃত হয় যার বৈশিষ্ট্যগুলি স্ট্যান্ডার্ড পুরোপুরি বর্ণনা করে না বা পারে না। এই শ্রেণীবদ্ধকরণটি গ্রহণের লক্ষ্য হ'ল বাস্তবায়নের মধ্যে একটি নির্দিষ্ট জাতকে বাজারজাতকরণের একটি কার্যকর শক্তি হিসাবে চিহ্নিত করার পাশাপাশি স্ট্যান্ডার্ডের সাথে সামঞ্জস্যের ছাঁটাই না সরিয়ে নির্দিষ্ট জনপ্রিয় বর্ধনের অনুমতি দেওয়া allow স্ট্যান্ডার্ডের পরিশিষ্ট এফ এই তিনটি বিভাগের মধ্যে পড়ে এমন আচরণগুলি তালিকাভুক্ত করে।
অনির্ধারিত আচরণ প্রয়োগকারীকে অনুবাদ প্রোগ্রামগুলিতে কিছু অক্ষর দেয়। প্রোগ্রামটি অনুবাদ করতে ব্যর্থ হওয়া পর্যন্ত এই অক্ষাংশ প্রসারিত হয় না।
অপরিবর্তিত আচরণ বাস্তবায়নকারীকে নির্দিষ্ট কিছু প্রোগ্রামের ত্রুটিগুলি সনাক্ত করতে না দেয় যা নির্ণয় করা কঠিন। এটি সম্ভাব্য অনুসারে ভাষা সম্প্রসারণের ক্ষেত্রগুলিও চিহ্নিত করে: বাস্তবায়নকারী আনুষ্ঠানিকভাবে অপরিজ্ঞাত আচরণের সংজ্ঞা প্রদান করে ভাষাটিকে বাড়িয়ে তুলতে পারে।
বাস্তবায়ন-সংজ্ঞায়িত আচরণ কোনও প্রয়োগকারীকে যথাযথ পদ্ধতির চয়ন করার স্বাধীনতা দেয় তবে ব্যবহারকারীকে এই পছন্দটি ব্যাখ্যা করা প্রয়োজন explained বাস্তবায়ন সংজ্ঞায়িত হিসাবে মনোনীত আচরণগুলি সাধারণত সেগুলি হয় যার মধ্যে ব্যবহারকারী বাস্তবায়নের সংজ্ঞা অনুসারে অর্থপূর্ণ কোডিং সিদ্ধান্ত নিতে পারে make বাস্তবায়ন সংজ্ঞা কতটা বিস্তৃত হওয়া উচিত তা সিদ্ধান্ত নেওয়ার সময় প্রয়োগকারীদের এই মানদণ্ডটি মনে রাখা উচিত। অনির্দিষ্ট আচরণের মতোই, বাস্তবায়ন-সংজ্ঞায়িত আচরণযুক্ত উত্সটি অনুবাদ করতে কেবল ব্যর্থ হওয়া পর্যাপ্ত প্রতিক্রিয়া নয়।
অনির্ধারিত আচরণ বনাম অনির্ধারিত আচরণের এর একটি সংক্ষিপ্ত বিবরণ রয়েছে।
তাদের চূড়ান্ত সারাংশ:
সংক্ষেপে বলতে গেলে, অনির্ধারিত আচরণ সাধারণত এমন কিছু যা আপনার সফটওয়্যারটি পোর্টেবল করার প্রয়োজন হয় না তা না হওয়া উচিত worry বিপরীতে, অপরিজ্ঞাত আচরণ সর্বদা অনাকাঙ্ক্ষিত এবং কখনই ঘটে না।
Orতিহাসিকভাবে, বাস্তবায়ন-সংজ্ঞায়িত আচরণ এবং অপরিজ্ঞাত আচরণ উভয়ই এমন পরিস্থিতি উপস্থাপন করে যেখানে স্ট্যান্ডার্ডের লেখকরা প্রত্যাশা করেছিলেন যে মান বাস্তবায়ন লেখার লোকেরা আচরণগত গ্যারান্টির সিদ্ধান্ত নেওয়ার জন্য রায় ব্যবহার করবে, যদি কোনও হয়, চলমান উদ্দেশ্য প্রয়োগের ক্ষেত্রে প্রোগ্রামগুলির জন্য কার্যকর হবে উদ্দেশ্য লক্ষ্য। হাই-এন্ড নম্বর-ক্রাঞ্চিং কোডের প্রয়োজনীয়তা নিম্ন-স্তরের সিস্টেম কোডগুলির থেকে একেবারেই আলাদা এবং ইউবি এবং আইডিবি উভয়ই সংকলক লেখককে এই বিভিন্ন প্রয়োজন মেটাতে নমনীয়তা দেয়। কোনও বিভাগের ম্যান্ডেটই নয় যে বাস্তবায়নগুলি এমনভাবে আচরণ করে যা কোনও নির্দিষ্ট উদ্দেশ্যে, এমনকি যে কোনও উদ্দেশ্যেই কার্যকর। কোনও মানের উদ্দেশ্যে উপযুক্ত বলে দাবি করা গুণমানের বাস্তবায়নগুলি তবে এই জাতীয় উদ্দেশ্যে উপযুক্তভাবে আচরণ করা উচিতমানকটির এটির প্রয়োজন আছে কি না ।
বাস্তবায়ন-সংজ্ঞায়িত আচরণ এবং অপরিজ্ঞাত আচরণের মধ্যে একমাত্র পার্থক্য হ'ল পূর্বের প্রয়োজন যে বাস্তবায়ন কিছুই করতে পারে না তেমন ক্ষেত্রে কার্যকরভাবে কার্যকর হতে পারে এমন ক্ষেত্রেও বাস্তবায়নগুলি একটি সামঞ্জস্যপূর্ণ আচরণকে সংজ্ঞায়িত করে এবং দলিল করে । তাদের মধ্যে বিভাজন রেখাটি সাধারণত আচরণগুলি সংজ্ঞায়িত করার জন্য বাস্তবায়নের জন্য কার্যকর হবে কিনা (সংকলক লেখকরা যখন ব্যবহারিক আচরণের ক্ষেত্রে স্ট্যান্ডার্ডের প্রয়োজন হয় বা না তখন কার্যকর আচরণগুলি সংজ্ঞায়িত করা উচিত) তবে সেখানে এমন কোনও বাস্তবায়ন সংঘটিত হতে পারে যেখানে আচরণের সংজ্ঞা একই সাথে ব্যয়বহুল হতে পারে কিনা? এবং অকেজো । এই রায় কার্যকর হতে পারে এমন রায় কোনও উপায়ে, আকার বা আকারে দেয় না, অন্য প্ল্যাটফর্মগুলিতে একটি সংজ্ঞায়িত আচরণকে সমর্থন করার উপযোগিতা সম্পর্কে কোনও রায় বোঝায় না।
দুর্ভাগ্যক্রমে, ১৯৯০ এর দশকের মাঝামাঝি থেকে সংকলক লেখকরা আচরণগত আদেশের অভাবকে এই রায় হিসাবে ব্যাখ্যা করতে শুরু করেছেন যে প্রয়োগ ক্ষেত্রগুলিতে এমনকি জীবনযাত্রার গ্যারান্টিটি মূল্যবান নয়, এমনকি এমন সিস্টেমে যেখানে তাদের ব্যবহারিকভাবে কিছুই ব্যয় হয় না। যুক্তিযুক্তিকে যুক্তিসঙ্গত রায় প্রয়োগের আমন্ত্রণ হিসাবে বিবেচনা করার পরিবর্তে সংকলক লেখকরা এটি না করার অজুহাত হিসাবে আচরণ করা শুরু করেছেন ।
উদাহরণস্বরূপ, নিম্নলিখিত কোড দেওয়া:
int scaled_velocity(int v, unsigned char pow)
{
if (v > 250)
v = 250;
if (v < -250)
v = -250;
return v << pow;
}
একটি দু'টির পরিপূরক বাস্তবায়নের v << pow
ক্ষেত্রে v
ইতিবাচক বা নেতিবাচক কিনা তা বিবেচনা না করেই ভাবটিকে দু'টির পরিপূরক স্থান হিসাবে বিবেচনা করতে কোনও প্রচেষ্টা ব্যয় করতে হবে না ।
তবে আজকের কয়েকটি সংকলক লেখকের মধ্যে পছন্দসই দর্শনটি প্রস্তাব করবে যেহেতু v
প্রোগ্রামটি যদি অনির্ধারিত আচরণে জড়িত হয় কেবল তখনই নেতিবাচক হতে পারে, প্রোগ্রামের ক্লিপটি নেতিবাচক পরিসরের কোনও কারণ নেই v
। যদিও নেতিবাচক মানগুলির বাম-স্থানান্তর তাত্পর্যগুলির প্রতিটি একক সংকলককে সমর্থন করা হত এবং প্রচুর বিদ্যমান কোড সেই আচরণের উপর নির্ভর করে, আধুনিক দর্শন এই সত্যটির ব্যাখ্যা করবে যে স্ট্যান্ডার্ড বলেছে যে বাম-সরিয়ে নেতিবাচক মানগুলি ইউবি হিসাবে রয়েছে ইঙ্গিত দিয়ে যে সংকলক লেখকরা এটিকে অবহেলা করতে দ্বিধা বোধ করা উচিত।
<<
নেতিবাচক সংখ্যার উপর ইউবি হ'ল এটি একটি বাজে ছোট্ট ফাঁদ এবং আমি এটির স্মরণ করিয়ে আনন্দিত!
i+j>k
1 বা 0 ফলন না করে এমন ক্ষেত্রে যদি এটির অতিরিক্ত যত্ন নেই তবে শর্ত থাকে যে এটির অন্য কোনও পার্শ্ব প্রতিক্রিয়া নেই , একটি সংকলক কিছু বিস্তৃত অপ্টিমাইজেশন করতে সক্ষম হতে পারে যা প্রোগ্রামার কোডটি লিখলে এটি সম্ভব হয় না (int)((unsigned)i+j) > k
।
সি ++ স্ট্যান্ডার্ড n3337 § 1.3.10 বাস্তবায়ন-সংজ্ঞায়িত আচরণ
একটি সুগঠিত প্রোগ্রামের জন্য আচরণ এবং সঠিক ডেটা তৈরি করা, যা বাস্তবায়নের উপর এবং প্রতিটি বাস্তবায়নের নথিতে নির্ভর করে
কখনও কখনও সি ++ স্ট্যান্ডার্ড কিছু নির্মাণের উপর নির্দিষ্ট আচরণ চাপায় না বরং পরিবর্তে বলে যে একটি নির্দিষ্ট, ভাল সংজ্ঞায়িত আচরণটি বেছে নিতে হবে এবং নির্দিষ্ট প্রয়োগ (লাইব্রেরির সংস্করণ) দ্বারা বর্ণনা করতে হবে । সুতরাং ব্যবহারকারী স্ট্যান্ডার্ড এটিকে বর্ণনা না করেও প্রোগ্রামটি ঠিক কীভাবে আচরণ করবে তা এখনও ব্যবহারকারী জানতে পারবেন।
C ++ স্ট্যান্ডার্ডের n3337 § 1.3.24 অনির্ধারিত আচরণ
এই আন্তর্জাতিক স্ট্যান্ডার্ডটি কোনও প্রয়োজনীয়তার জন্য চাপিয়ে দেয় না এমন আচরণ [দ্রষ্টব্য: এই আন্তর্জাতিক স্ট্যান্ডার্ড আচরণের কোনও স্পষ্ট সংজ্ঞা বাদ দিলে বা যখন কোনও প্রোগ্রাম একটি ভ্রান্ত নির্মাণ বা ভুল ডেটা ব্যবহার করে তখন অপরিজ্ঞাত আচরণের আশা করা যেতে পারে। অনুমানযোগ্য অনির্ধারিত আচরণ পরিস্থিতিটি অনির্দেশ্য ফলাফলের সাথে পুরোপুরি উপেক্ষা করা থেকে শুরু করে, পরিবেশের বৈশিষ্ট্যযুক্ত একটি ডকুমেন্টেড পদ্ধতিতে অনুবাদ বা প্রোগ্রামের সম্পাদনার সময় আচরণ করা (ডায়াগনস্টিক বার্তা জারি করা বা ছাড়াই), কোনও অনুবাদ বা কার্যকরকরণ (ইস্যু সহ) ডায়গনিস্টিক বার্তার)। অনেক ভ্রান্ত প্রোগ্রাম নির্মাণগুলি নির্ধারিত আচরণকে উত্সাহ দেয় না; সেগুলি নির্ণয়ের প্রয়োজন। - শেষ নোট]
যখন প্রোগ্রামটি মুখোমুখি হয় যা সি ++ স্ট্যান্ডার্ড অনুযায়ী সংজ্ঞায়িত নয় তবে এটি যা করতে চায় তা করার অনুমতি দেওয়া হয় (সম্ভবত আমাকে ইমেল পাঠাতে পারে অথবা আপনাকে ইমেল পাঠাতে পারে অথবা কোডটি সম্পূর্ণ উপেক্ষা করতে পারে)।
C ++ স্ট্যান্ডার্ডের n3337 § 1.3.25 অনির্দিষ্ট আচরণ
একটি সুগঠিত প্রোগ্রামের জন্য আচরণ এবং সঠিক ডেটা, যা বাস্তবায়নের উপর নির্ভর করে [দ্রষ্টব্য: কোন আচরণটি ঘটে তা দলিল করার জন্য প্রয়োগকরণের প্রয়োজন হয় না। সম্ভাব্য আচরণগুলির পরিসরটি সাধারণত এই আন্তর্জাতিক মানক দ্বারা বর্ণিত হয়। - শেষ নোট]
সি ++ স্ট্যান্ডার্ড কিছু নির্মাণে নির্দিষ্ট আচরণ চাপায় না বরং পরিবর্তে বলে যে একটি নির্দিষ্ট, ভাল সংজ্ঞায়িত আচরণ বেছে নিতে হবে ( বট বর্ণিত প্রয়োজন নেই ) নির্দিষ্ট প্রয়োগের দ্বারা (গ্রন্থাগারের সংস্করণ) বেছে নেওয়া উচিত। সুতরাং যখন কোনও বিবরণ সরবরাহ করা হয়নি তখন ব্যবহারকারীর পক্ষে ঠিক কীভাবে প্রোগ্রামটি আচরণ করবে তা জানা মুশকিল।
বাস্তবায়ন সংজ্ঞায়িত-
প্রয়োগকারীরা চান, ভাল ডকুমেন্টেড হওয়া উচিত, মান পছন্দ দেয় তবে সংকলন নিশ্চিত করে
অনির্দিষ্ট -
বাস্তবায়ন সংজ্ঞায়িত হিসাবে একই কিন্তু নথিভুক্ত
Undefined-
কিছু হতে পারে, এটি যত্ন নিন।
uint32_t s;
, 1u<<s
যখন মূল্যায়ন s
হয় 33 হয় তখন সম্ভবত 0 বা ফলন 2 পাওয়া যায়, তবে অন্য কিছু হতাশ না করে। তবে নতুন সংকলকগণ মূল্যায়নের 1u<<s
ফলে একটি সংকলকটি এটি নির্ধারণ করতে পারে কারণ এটি s
অবশ্যই আগে থেকেই 32-এরও কম হওয়া উচিত ছিল, যে অভিব্যক্তিটির আগে বা পরে কোনও কোড যা কেবল s
32 বা তার বেশি বা তার বেশি হলে প্রাসঙ্গিক হতে পারে তা বাদ দেওয়া যেতে পারে।