অপরিবর্তিত আচরণ এবং ক্রম বিন্দু


986

"সিকোয়েন্স পয়েন্ট" কী?

অপরিবর্তিত আচরণ এবং সিকোয়েন্স পয়েন্টগুলির মধ্যে কী সম্পর্ক?

আমি a[++i] = i;নিজেকে আরও ভাল বোধ করার জন্য প্রায়শই মজাদার এবং সংশ্লেষযুক্ত মতামত ব্যবহার করি। কেন আমি সেগুলি ব্যবহার বন্ধ করব?

আপনি যদি এটি পড়ে থাকেন তবে অবশ্যই অনুসরণীয় প্রশ্নটি অনির্ধারিত আচরণ এবং সিকোয়েন্স পয়েন্টগুলি পুনরায় লোড করা হয়েছে তা দেখতে ভুলবেন না ।

(দ্রষ্টব্য: এই একটি এন্ট্রি হতে বোঝানো হয় স্ট্যাক ওভারফ্লো সি ++ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী । আপনি তারপর, এই ফর্মে একটি প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী প্রদান ধারণা সমালোচনা করতে চান, মেটা যে শুরু এই সব পোস্টিং । যে কাজ করতে জায়গা হবে উত্তর সেই প্রশ্নটি সি ++ চ্যাটরুমে পর্যবেক্ষণ করা হয় , যেখানে এফএকিউ ধারণাটি প্রথম স্থানে শুরু হয়েছিল, সুতরাং আপনার উত্তরটি যারা ধারণাটি নিয়ে এসেছিল তারা খুব সম্ভবত পঠন করতে পারে।)

উত্তর:


682

সি ++ 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 এর জন্য উত্তর এখানে অনুসরণ করুন


45
*p++ = 4 অপরিবর্তিত আচরণ নয়। *p++হিসাবে ব্যাখ্যা করা হয় *(p++)p++আয় p(ক অনুলিপি) এবং পূর্ববর্তী ঠিকানায় সংরক্ষিত মান। কেন এটি ইউবি ডাকে? এটা পুরোপুরি ঠিক আছে।
প্রসূন সৌরভ

6
@ মাইক: এএফাইক, আপনি যে সি ++ স্ট্যান্ডার্ডের সাথে লিঙ্ক করতে পারেন তার কোনও (আইনী) কপি নেই।
এসবিআই

11
ঠিক আছে, তাহলে আপনার আইএসওর প্রাসঙ্গিক অর্ডার পৃষ্ঠাতে একটি লিঙ্ক থাকতে পারে। যাইহোক, এটির কথা চিন্তা করে, "সি ++ স্ট্যান্ডার্ডের প্রাথমিক জ্ঞান" এই বাক্যটি শর্তাদিতে কিছুটা বৈপরীত্য বলে মনে হচ্ছে, যেহেতু আপনি যদি স্ট্যান্ডার্ডটি পড়ছেন তবে আপনি প্রাথমিক স্তরটি পেরিয়ে গেছেন। ভাবপ্রকাশ সিনট্যাক্স, ক্রিয়াকলাপের ক্রম এবং অপারেটর ওভারলোডিংয়ের মতো আপনার ভাষাটির কোন জিনিসটি আপনার প্রাথমিক বোধের প্রয়োজন তা আমরা তালিকাভুক্ত করতে পারি?
মাইক ডিসিমোন

41
আমি নিশ্চিত না যে স্ট্যান্ডার্ডটি উদ্ধৃত করা নবাবিদের শেখানোর সর্বোত্তম উপায়
উল্টো

6
@ অ্যাড্রিয়ান প্রথম এক্সপ্রেশনটি একটি ইউবিকে আহ্বান জানায় কারণ শেষ ++iএবং অনুদানের মধ্যে কোনও ক্রম বিন্দু নেই i। দ্বিতীয় এক্সপ্রেশনটি ইউবিকে ডাকে না কারণ অভিব্যক্তিটির iমান পরিবর্তন হয় না i। দ্বিতীয় উদাহরণে অ্যাসাইনমেন্ট অপারেটর বলার আগে i++একটি সিকোয়েন্স পয়েন্ট ( ,) অনুসরণ করা হয় ।
কলিয়ুনিয়া

276

এটি আমার আগের উত্তরের অনুসরণ এবং এতে সি ++ 11 সম্পর্কিত উপাদান রয়েছে।


পূর্ব-প্রয়োজনীয়তা : সম্পর্কের প্রাথমিক জ্ঞান (গণিত)।


এটি কি সত্য যে সি ++ 11 তে কোনও সিকোয়েন্স পয়েন্ট নেই?

হ্যাঁ! এটা খুব সত্য।

সিকোয়েন্স পয়েন্টগুলি সি ++ 11 এর পরে সিকোয়েন্সড এর আগে এবং সিকোয়েন্সড পরে (এবং অসম্পূর্ণ এবং নির্ধারিতভাবে সিকোয়েন্সড ) সম্পর্কের মাধ্যমে প্রতিস্থাপন করা হয়েছে ।


এই 'পূর্বে সিকোয়েন্সড' জিনিসটি ঠিক কী?

সিকোয়েন্সড এর আগে (.91.9 / 13) একটি সম্পর্ক যা হ'ল:

একক থ্রেড দ্বারা সম্পাদিত মূল্যায়নের মধ্যে এবং কঠোর আংশিক অর্ডার 1 প্রেরণা দেয়

আনুষ্ঠানিকভাবে এটি কোনো দুই মূল্যায়ন দেওয়া মানে (নিচে দেখুন) A এবং Bযদি, Aহয় আগে সিকোয়েন্স B , তারপর সঞ্চালনের A আগে বসে থাকবে সঞ্চালনের B। তাহলে Aসামনে সিকোয়েন্স নয় Bএবং Bআগে সিকোয়েন্স নয় A, তারপর Aএবং Bহয় unsequenced 2

মূল্যায়ন Aএবং Bকরছে অনিশ্চিতভাবে সিকোয়েন্স যখন পারেন Aআগে সিকোয়েন্স করা হয় Bবা Bআগে সিকোয়েন্স করা হয় A, কিন্তু এটি অনির্দিষ্ট যা 3

[নোটস]
1: একটি কঠোর আংশিক অর্ডার হয় বাইনারি সম্পর্ক "<" একটি সেট উপর Pযা asymmetric, এবং transitiveসব জন্য, অর্থাত্, a, b, এবং cP, আমরা যে:
........ (ঝ)। যদি <b তবে then (খ <ক) ( asymmetry);
........ (২)। যদি একটি <বি এবং বি <সি হয় তবে একটি <সি ( transitivity)।
2: অনিবার্য মূল্যায়নের সম্পাদন ওভারল্যাপ করতে পারে ।
3: নির্বিচারে ক্রমযুক্ত মূল্যায়নগুলি ওভারল্যাপ করতে পারে না , তবে হয় প্রথমে কার্যকর করা যেতে পারে।


সি ++ 11 এর প্রসঙ্গে 'মূল্যায়ন' শব্দের অর্থ কী?

সি ++ ১১-এ, সাধারণভাবে একটি এক্সপ্রেশন (বা উপ-এক্সপ্রেশন) এর মূল্যায়নের অন্তর্ভুক্ত:

এখন (§1.9 / 14) বলেছেন:

একটি পূর্ণ-প্রকাশের সাথে যুক্ত প্রতিটি মান গণনা এবং পার্শ্ব প্রতিক্রিয়াটি পরবর্তী পূর্ণ-এক্সপ্রেশনটির সাথে সম্পর্কিত প্রতিটি মান গণনা এবং পার্শ্ব প্রতিক্রিয়াটির আগে ক্রমযুক্ত হয় ।

  • তুচ্ছ উদাহরণ:

    int x; x = 10; ++x;

    এর সাথে সম্পর্কিত ++xমান গণনা এবং পার্শ্ব প্রতিক্রিয়াটি মান গণনা এবং এর পার্শ্ব প্রতিক্রিয়ার পরে ক্রমযুক্ত হয়x = 10;


সুতরাং অনির্ধারিত আচরণ এবং উপরোক্ত বিষয়গুলির মধ্যে কিছু সম্পর্ক থাকতে হবে, তাই না?

হ্যাঁ! ঠিক।

(§1.9 / 15) এ এটি উল্লেখ করা হয়েছে

উল্লিখিত ব্যতীত, পৃথক অপারেটরগুলির ক্রিয়াকলাপগুলির মূল্যায়ন এবং স্বতন্ত্র এক্সপ্রেশনগুলির subexpresstions অব্যবহৃত 4

উদাহরণ স্বরূপ :

int main()
{
     int num = 19 ;
     num = (num << 3) + (num >> 3);
} 
  1. +অপারেটরের ক্রিয়াকলাপগুলির মূল্যায়ন একে অপরের সাথে তুলনামূলকভাবে অনিচ্ছাকৃত।
  2. অপারেটর <<এবং অপারেটরগুলির মূল্যায়ন >>একে অপরের সাথে তুলনামূলকভাবে অপরিবর্তিত।

4: একটি প্রোগ্রাম কার্যকর করার সময় একাধিকবার যা মূল্যায়ন করা হয়, তার subexpressions এর অনিচ্ছাকৃত এবং অনির্দিষ্টভাবে ক্রমযুক্ত মূল্যায়নগুলি বিভিন্ন মূল্যায়নে ধারাবাহিকভাবে সঞ্চালনের প্রয়োজন হয় না।

(§1.9 / 15) অপারেটরের অপারেন্ডসের মান গণনা অপারেটরের ফলাফলের মান গণনার আগে ক্রমযুক্ত হয়।

এর মানে হল x + yএর মান গণনা xএবং yমান গণনার আগে সিকোয়েন্স হয় (x + y)

অধিক গুরুত্বের সাথে

(§1.9 / 15) যদি স্কেলার অবজেক্টের কোনও পার্শ্ব প্রতিক্রিয়া হয় সেটির তুলনায় অসম্পূর্ণ se

(ক) একই স্কেলারের বস্তুর উপর অন্য একটি পার্শ্ব প্রতিক্রিয়া

অথবা

(খ) একই স্কেলারের বস্তুর মান ব্যবহার করে একটি মান গণনা।

আচরণ undefined

উদাহরণ:

int i = 5, v[10] = { };
void  f(int,  int);
  1. i = i++ * ++i; // Undefined Behaviour
  2. i = ++i + i++; // Undefined Behaviour
  3. i = ++i + ++i; // Undefined Behaviour
  4. i = v[i++]; // Undefined Behaviour
  5. i = v[++i]: // Well-defined Behavior
  6. i = i++ + 1; // Undefined Behaviour
  7. i = ++i + 1; // Well-defined Behaviour
  8. ++++i; // Well-defined Behaviour
  9. f(i = -1, i = -1); // Undefined Behaviour (see below)

কোনও ফাংশন কল করার সময় (ফাংশনটি ইনলাইন কিনা তা), প্রতিটি মান গণনা এবং পার্শ্ব প্রতিক্রিয়া যেকোন যুক্তি প্রকাশের সাথে যুক্ত, বা ডাক ফাংশন নির্ধারণকারী পোস্টফিক্স এক্সপ্রেশন সহ, এর শরীরে প্রতিটি অভিব্যক্তি বা বিবৃতি কার্যকর করার আগে ক্রমযুক্ত হয় ফাংশন বলা হয়। [ দ্রষ্টব্য: বিভিন্ন যুক্তি প্রকাশের সাথে যুক্ত মূল্য গণনা এবং পার্শ্ব প্রতিক্রিয়াগুলি অমীমাংসিত । - শেষ নোট ]

অভিব্যক্তি (5), (7)এবং (8)অনির্ধারিত আচরণ শুরু করবেন না। আরও বিস্তারিত ব্যাখ্যার জন্য নিম্নলিখিত উত্তরগুলি দেখুন।


চূড়ান্ত দ্রষ্টব্য :

পোস্টে যদি কোনও ত্রুটি পাওয়া যায় তবে একটি মন্তব্য করুন leave শক্তি ব্যবহারকারীগণ (প্রতিশ্রুতি> 20000 সহ) টাইপস এবং অন্যান্য ভুল সংশোধন করার জন্য দয়া করে পোস্ট সম্পাদনা করতে দ্বিধা করবেন না।


3
"অ্যাসিমেট্রিক" এর পরিবর্তে, আগে / পরে ক্রমযুক্ত "অ্যান্টিসিমমেট্রিক" সম্পর্ক met পরে দেওয়া আংশিক আদেশের সংজ্ঞা (যা উইকিপিডিয়াতেও সম্মত হয়) এর সংজ্ঞা অনুসারে পাঠ্যটিতে এটি পরিবর্তন করা উচিত।
TemplateRex

1
7) আইটেমটি শেষ উদাহরণে একটি ইউবি কেন? এটা হতে হবে f(i = -1, i = 1)?
মিখাইল

1
আমি "সিকোয়েন্সড এর আগে" সম্পর্কের বর্ণনা স্থির করেছিলাম এটি একটি কঠোর আংশিক আদেশ । স্পষ্টতই, একটি অভিব্যক্তি নিজের আগে ক্রমযুক্ত করা যায় না, সুতরাং সম্পর্কটি প্রতিচ্ছবিবদ্ধ হতে পারে না। অতএব এটি অসামঞ্জস্য নয় অ্যান্টি সিমমেট্রিক।
থমাসম্যাকলিউড

1
5) ভালভাবে পরিষ্কার করা আমার মনকে উড়িয়ে দিয়েছে। জোহানেস শ্যাউব দ্বারা ব্যাখ্যাটি পাওয়া পুরোপুরি সোজা ছিল না। বিশেষত যেহেতু আমি বিশ্বাস করি যে এমনকি এটির ++i( +অপারেটর যে এটি ব্যবহার করছে তার আগে মূল্যায়ন করা হচ্ছে ), এখনও মানকটি বলে না যে এর পার্শ্ব প্রতিক্রিয়াটি শেষ হতে হবে। তবে প্রকৃতপক্ষে, কারণ এটি একটি lvalueযা iনিজেই একটি রেফারেন্স দেয়, মূল্যায়ন শেষ হওয়ার কারণে এটি অবশ্যই পার্শ্ব প্রতিক্রিয়া শেষ করতে হবে, সুতরাং মানটি আপ টু ডেট হতে হবে। আসলে এটি পাওয়ার জন্য এটি ছিল উন্মাদ অংশ।
v.oddou

"আইএসও সি ++ কমিটির সদস্যরা ভেবেছিলেন যে সিকোয়েন্স পয়েন্টস স্টাফগুলি বোঝা বেশ কঠিন ছিল। তাই তারা আরও স্পষ্ট ভাষায় এবং বর্ধিত নির্ভুলতার জন্য কেবলমাত্র উল্লিখিত সম্পর্কের সাথে এটি প্রতিস্থাপনের সিদ্ধান্ত নিয়েছে।" - আপনি কি এই দাবির জন্য একটি রেফারেন্স পেয়েছেন? আমার কাছে মনে হয় যে নতুন সম্পর্কগুলি বোঝা শক্ত।
এমএম

30

সি ++ 17 ( N4659) এর মধ্যে আইডিয়োমেটিক সি ++ এর জন্য এক্সপ্রেশন মূল্যায়ন আদেশ সংশোধন করার প্রস্তাব রয়েছে যা অভিব্যক্তি মূল্যায়নের একটি কঠোর ক্রমকে সংজ্ঞায়িত করে।

বিশেষত, নিম্নলিখিত বাক্য

8.18 নিয়োগ এবং যৌগিক নিয়োগ অপারেটর :
....

সমস্ত ক্ষেত্রে, অ্যাসাইনমেন্টটি ডান এবং বাম অপারেন্ডগুলির মান গণনা এবং অ্যাসাইনমেন্ট এক্সপ্রেশনটির মান গণনার আগে ক্রমযুক্ত হয়। বাম অপারেন্ডের আগে ডান অপরেন্ডটি সিকোয়েন্সড হয়।

একসাথে নিম্নলিখিত স্পষ্টির সাথে

একটি অভিব্যক্তি এক্স একটি অভিব্যক্তি আগে সিকোয়েন্স করা হয়েছে ওয়াই যদি প্রত্যেক মান হিসাব এবং অভিব্যক্তি সঙ্গে যুক্ত প্রত্যেক পার্শ্ব প্রতিক্রিয়া এক্স প্রত্যেক মান হিসাব এবং অভিব্যক্তি সঙ্গে যুক্ত প্রত্যেক পার্শ্ব প্রতিক্রিয়া সামনে সিকোয়েন্স হয় ওয়াই

পূর্বনির্ধারিত আচরণের বেশ কয়েকটি কেসকে বৈধ করুন, যার মধ্যে প্রশ্ন রয়েছে:

a[++i] = i;

তবে অন্যান্য বেশ কয়েকটি অনুরূপ ক্ষেত্রে এখনও অপরিবর্তিত আচরণ হতে পারে।

ইন N4140:

i = i++ + 1; // the behavior is undefined

কিন্তু N4659

i = i++ + 1; // the value of i is incremented
i = i++ + i; // the behavior is undefined

অবশ্যই, সি ++ 17 কমপ্লায়েন্ট কম্পাইলার ব্যবহার করার অর্থ এই নয় যে কোনও ব্যক্তিকে এই জাতীয় এক্সপ্রেশন লেখা শুরু করা উচিত।


i = i++ + 1;সি ++ ১ 17-এ কেন সংজ্ঞায়িত আচরণ করা হয়েছে, আমি মনে করি এমনকি যদি "বাম অপারেন্ডের আগে ডান অপারেন্ডটি ধারাবাহিক হয়" তবে "আই ++" এর জন্য পরিবর্তন এবং অ্যাসাইনমেন্টের পার্শ্ব প্রতিক্রিয়াটি অনিবার্য, দয়া করে এগুলি ব্যাখ্যা করার জন্য আরও বিশদ দিন
জ্যাক এক্স

@ জ্যাকএক্স আমি উত্তরটি প্রসারিত করেছি :)।
অ্যালেক্সড

হ্যাঁ, আমি মনে করি বাক্যটির ব্যাখ্যার বিশদটি "বাম অপারেন্ডের পূর্বে ডান অপারেন্ডটি অনুক্রমযুক্ত" আরও দরকারী uch যেমন "বাম অপারেন্ডের আগে ডান অপারেন্ডটি সিকোয়েন্সড হয়" মানে ডান অপারেন্ডের সাথে সম্পর্কিত মান গণনা এবং পার্শ্ব প্রতিক্রিয়া বাম অপারেন্ডের আগে ক্রমযুক্ত। যেমনটি আপনি করেছেন :-)
জ্যাক এক্স

11

আমি অনুমান করছি পরিবর্তনের মূল কারণ রয়েছে, এটি কেবল পুরানো ব্যাখ্যা পরিষ্কার করার জন্য কসমেটিক নয়: কারণটি একমত। বিস্তারের অনির্ধারিত ক্রমটি কেবল কয়েকটি সম্ভাব্য সিরিয়াল ক্রমগুলির মধ্যে একটি মাত্র নির্বাচন, অর্ডারিংয়ের আগে এবং পরে এটি বেশ আলাদা, কারণ যদি কোনও নির্দিষ্ট অর্ডিং না থাকে তবে সমকালীন মূল্যায়ন সম্ভব: পুরানো বিধিগুলির সাথে তেমন নয়। উদাহরণস্বরূপ:

f (a,b)

পূর্বে হয় তখন বি, বা, বি পরে ক। এখন, ক এবং বি আন্তঃবাহিত নির্দেশাবলী বা এমনকি বিভিন্ন কোরের সাথে মূল্যায়ন করা যেতে পারে।


5
যদিও আমি বিশ্বাস করি যে, যদি 'ক' বা 'বি' তে কোনও ফাংশন কল অন্তর্ভুক্ত থাকে তবে সেগুলি অনির্দিষ্টকালের পরিবর্তে অযৌক্তিকর পরিবর্তে সিকোয়েন্সড হয়, যার অর্থ এটি যে কোনও পার্শ্ব-প্রতিক্রিয়া হওয়ার আগেই একটির থেকে সমস্ত পার্শ্ব প্রতিক্রিয়া হওয়া দরকার অন্যটি, যদিও সংকলকটি প্রথমে কোনটি যায় সে সম্পর্কে সামঞ্জস্যতার প্রয়োজন নেই। যদি এটি আর সত্য না হয়, তবে এটি প্রচুর কোডটি ভেঙে দেবে যা অপারেশনগুলিকে ওভারল্যাপিংয়ের উপর নির্ভর করে না (যেমন যদি 'একটি' এবং 'বি' প্রতিটি সেট আপ, ব্যবহার এবং নীচে অংশীদারি স্ট্যাটিক অবস্থা)।
সুপারক্যাট

2

ইন C99(ISO/IEC 9899:TC3)যা এই আলোচনা দূর পর্যন্ত নিম্নলিখিত steteents evaluaiton ক্রম সংক্রান্ত তৈরি করা হয় অনুপস্থিত বলে মনে হয়।

[...] সুবে এক্সপ্রেশনগুলির মূল্যায়নের ক্রম এবং পার্শ্ব প্রতিক্রিয়াগুলির ক্রমটি উভয়ই অনির্দিষ্ট। (বিভাগ 6.5 পৃষ্ঠা 67)

অপারেশনগুলির মূল্যায়নের ক্রমটি অনির্ধারিত। যদি কোনও অ্যাসাইনমেন্ট অপারেটরের ফলাফল পরিবর্তন করতে বা পরবর্তী ক্রমিক পয়েন্টের পরে এটি অ্যাক্সেস করার চেষ্টা করা হয়, তবে আচরণটি [sic] অপরিজ্ঞাত। (বিভাগ 6.5.16 পৃষ্ঠা 91)


2
প্রশ্নটি সি ++ নয় এবং সি হিসাবে ট্যাগ করা হয়েছে, এটি ভাল কারণ সি ++ 17 এর আচরণটি পুরানো সংস্করণগুলির আচরণ থেকে একেবারেই আলাদা - এবং সি 11, সি 99, সি 90 ইত্যাদির আচরণের সাথে কোনও সম্পর্ক রাখে না বা খুব সামান্য থাকে Or এটির সাথে সম্পর্কিত মোট কথা, আমি এটিকে সরিয়ে দেওয়ার পরামর্শ দিই। আরও উল্লেখযোগ্যভাবে, আমাদের সি এর সমতুল্য প্রশ্নোত্তর খুঁজে বের করা এবং এটি ঠিক আছে কিনা তা নিশ্চিত করা প্রয়োজন (এবং উল্লেখ্য যে সি ++ ১ particular, বিশেষত, নিয়মগুলি পরিবর্তন করে - সি ++ 11 এর পূর্বে আচরণটি কমবেশি একই রকম ছিল সি 11-তে, যদিও সিটিতে এটি বর্ণনাকারীর অক্ষরটি এখনও 'সিকোয়েন্স পয়েন্টগুলি' ব্যবহার করে যেখানে সি ++ 11 এবং পরবর্তীকালে তা ব্যবহার করে না
জোনাথন লেফলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.