অতিরিক্ত লোড && এবং || এর আসলে কোনও কারণ আছে কি? শর্ট সার্কিট না?


137

অপারেটরগুলির সংক্ষিপ্ত সার্কিট আচরণ &&এবং ||প্রোগ্রামারদের জন্য একটি আশ্চর্যজনক সরঞ্জাম।

তবে কেন তারা অতিরিক্ত বোঝা চাপালে এই আচরণটি হারাবে? আমি বুঝতে পারি যে অপারেটরগুলি কেবল ফাংশনগুলির জন্য সিনট্যাকটিক চিনি তবে অপারেটরদের boolআচরণের জন্য এটি কেন এই একক ধরণের মধ্যে সীমাবদ্ধ থাকবে? এর পিছনে কি কোনও প্রযুক্তিগত যুক্তি রয়েছে?


1
@PiotrS। এই প্রশ্ন সম্ভবত উত্তর। আমার ধারণা, এই উদ্দেশ্যে স্ট্যান্ডার্ডটি একটি নতুন সিনট্যাক্সকে সংজ্ঞায়িত করতে পারে। সম্ভবত মত operator&&(const Foo& lhs, const Foo& rhs) : (lhs.bars == 0)
iFreilicht

1
@PiotrS বিবেচনা .: ত্রি-রাষ্ট্র যুক্তিবিজ্ঞান: {true, false, nil}। যেহেতু nil&& x == nilএটি শর্ট সার্কিট হতে পারে।
MSalters

1
@ এসএমএলটাররা: বিবেচনা করুন std::valarray<bool> a, b, c;, আপনি কীভাবে a || b || cসংক্ষিপ্তসার্কিট বলে মনে করেন ?
পিয়োটার স্কটনিকিকে

4
@ পাইওটিআরএস: আমি যুক্তি দিচ্ছি যে সংক্ষিপ্ত সার্কিটের জন্য কমপক্ষে একটি নন-বিউল টাইপ রয়েছে sense আমি যুক্তি দিচ্ছি না যে শর্টকার্কুইটিং প্রতিটি নন- বুল টাইপের জন্য অর্থবোধ করে
এমসাল্টারস

3
এটি এখনও কেউ উল্লেখ করেনি, তবে পশ্চাদপদ সামঞ্জস্যের বিষয়টিও রয়েছে। যদি এই শর্ট সার্কিট প্রয়োগ হয় এমন পরিস্থিতিতে সীমাবদ্ধ করার জন্য যদি বিশেষ যত্ন নিবেদিত না হয় তবে এই ধরনের সংক্ষিপ্ত সার্কিটগুলি বিদ্যমান কোডটি ওভারলোড operator&&বা ভেঙে ফেলতে পারে operator||এবং উভয় অপারেশনকে মূল্যায়ন করার উপর নির্ভর করে। পশ্চাতে বিদ্যমান সামঞ্জস্য বজায় রাখা গুরুত্বপূর্ণ (বা হওয়া উচিত) কোনও বিদ্যমান ভাষার বৈশিষ্ট্য যুক্ত করার সময়।
ডেভিড হামেন

উত্তর:


151

সমস্ত নকশা প্রক্রিয়া পারস্পরিক বেমানান লক্ষ্যগুলির মধ্যে সমঝোতার ফলে। দুর্ভাগ্যক্রমে, &&সি ++ এ ওভারলোডেড অপারেটরের জন্য নকশা প্রক্রিয়াটি একটি বিভ্রান্তিমূলক পরিণতি তৈরি করেছে: আপনি যে বৈশিষ্ট্যটি চান তা &&- এর সংক্ষিপ্ত-সার্কিট আচরণ - বাদ দেওয়া হয়েছে।

এই দুর্ভাগ্যজনক জায়গায় সেই নকশা প্রক্রিয়াটি কীভাবে শেষ হয়েছিল তার বিশদ, আমি যাদের জানি না। পরবর্তী ডিজাইন প্রক্রিয়া কীভাবে এই অপ্রীতিকর ফলাফলটিকে বিবেচনায় নিয়েছিল তা দেখার জন্য এটি প্রাসঙ্গিক। C #, ওভারলোড &&অপারেটর হয় সংক্ষিপ্ত circuiting। সি # এর ডিজাইনাররা কীভাবে এটি অর্জন করলেন?

অন্য উত্তরগুলির মধ্যে একটিতে "ল্যাম্বদা উত্তোলন" পরামর্শ দেয়। এটাই:

A && B

নৈতিকভাবে এর সমতুল্য কিছু হিসাবে উপলব্ধি করা যেতে পারে:

operator_&& ( A, ()=> B )

যেখানে দ্বিতীয় যুক্তি অলস মূল্যায়নের জন্য কিছু ব্যবস্থা ব্যবহার করে যাতে মূল্যায়ন করা হলে, অভিব্যক্তির পার্শ্ব প্রতিক্রিয়া এবং মান উত্পন্ন হয়। অতিরিক্ত লোড অপারেটরের বাস্তবায়ন যখন প্রয়োজন হবে তখনই অলস মূল্যায়ন করবে।

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

বরং, সি # সমাধানটি সমস্যার দুটি পৃথক সমস্যার মধ্যে ভেঙে দেয়:

  • আমাদের কি ডান হাতের ক্রম মূল্যায়ন করা উচিত?
  • যদি উপরের উত্তরটি "হ্যাঁ" হয়, তবে আমরা কীভাবে দুটি অপারেশন একত্রিত করব?

সুতরাং &&সরাসরি ওভারলোডকে অবৈধ করে সমস্যার সমাধান করা হয়েছে। বরং, সি # তে আপনাকে অবশ্যই দুটি অপারেটরকে ওভারলোড করতে হবে , যার প্রতিটিই এই দুটি প্রশ্নের একটির উত্তর দেয়।

class C
{
    // Is this thing "false-ish"? If yes, we can skip computing the right
    // hand size of an &&
    public static bool operator false (C c) { whatever }

    // If we didn't skip the RHS, how do we combine them?
    public static C operator & (C left, C right) { whatever }
    ...

(একদিকে: প্রকৃতপক্ষে, তিন। সি # এর প্রয়োজনে যদি অপারেটর falseসরবরাহ করা হয় তবে অপারেটরটিও সরবরাহ trueকরতে হবে, যা প্রশ্নের উত্তর দেয়: এই জিনিসটি কি "সত্য-ইশ?" উভয় প্রয়োজন।)

ফর্মের একটি বিবৃতি বিবেচনা করুন:

C cresult = cleft && cright;

সংকলক এর জন্য কোড তৈরি করে আপনি ভেবেছিলেন যে আপনি এই সিডো-সি লিখেছেন: #

C cresult;
C tempLeft = cleft;
cresult = C.false(tempLeft) ? tempLeft : C.&(tempLeft, cright);

আপনি দেখতে পাচ্ছেন, বাম দিকটি সর্বদা মূল্যায়ন করা হয়। যদি এটি "মিথ্যা-ইশ" হতে দৃ determined়প্রতিজ্ঞ হয় তবে ফলাফল এটি। অন্যথায়, ডান হাতটি মূল্যায়ন করা হয়, এবং উত্সাহী ব্যবহারকারী-সংজ্ঞায়িত অপারেটরকে অনুরোধ &করা হয়।

||অপারেটর অপারেটর একজন আবাহন সত্য এবং উৎসুক হিসাবে, অনুরূপ ভাবে সংজ্ঞায়িত করা হয় |অপারেটর:

cresult = C.true(tempLeft) ? tempLeft : C.|(tempLeft , cright);

চারটি অপারেটর সংজ্ঞা দ্বারা - true, false, &এবং |- C # এর আপনি না শুধুমাত্র বলতে পারবেন cleft && crightকিন্তু অ শর্ট-সার্কিট cleft & cright, এবং এছাড়াও if (cleft) if (cright) ..., এবং c ? consequence : alternativeএবং while(c), ইত্যাদি।

এখন, আমি বলেছি যে সমস্ত নকশা প্রক্রিয়া সমঝোতার ফলাফল। এখানে সি # ভাষা ডিজাইনাররা সংক্ষিপ্ত-সংক্রমণ &&এবং ||ডান পেতে সক্ষম হয়েছে , তবে এটি করার জন্য দু'টির পরিবর্তে চারটি অপারেটরকে ওভারলোড করা দরকার যা কিছু লোক বিভ্রান্তিকর বলে মনে হয়। অপারেটর ট্রু / ভুয়া বৈশিষ্ট্যটি সি # এর মধ্যে স্বল্পতম বোঝা বৈশিষ্ট্যগুলির মধ্যে একটি। সি ++ ব্যবহারকারীদের কাছে পরিচিত একটি বুদ্ধিমান এবং সহজবোধ্য ভাষা থাকার লক্ষ্যটি সংক্ষিপ্ত সার্কিট করার ইচ্ছা এবং ল্যাম্বডা উত্তোলন বা অলস মূল্যায়নের অন্যান্য ধরণের প্রয়োগ না করার আকাঙ্ক্ষার দ্বারা বিরোধিত হয়েছিল। আমি মনে করি যে একটি যুক্তিসঙ্গত আপস অবস্থান ছিল, কিন্তু এটা উপলব্ধি করা যে গুরুত্বপূর্ণ হল সমঝোতার অবস্থান। শুধু একটি বিভিন্ন সি ++ এর ডিজাইনারদের চেয়ে সমঝোতার অবস্থান।

যদি এই জাতীয় অপারেটরগুলির জন্য ভাষা নকশার বিষয় আপনার আগ্রহী হয়, তবে সি # কেন অপারেটর বুলিয়ানগুলিতে এই অপারেটরগুলি সংজ্ঞায়িত করে না তা নিয়ে আমার সিরিজটি পড়ার বিষয়টি বিবেচনা করুন:

http://ericlippert.com/2012/03/26/null-is-not-false-part-one/


1
@ প্রতিলিপি: আপনি এই প্রশ্ন এবং উত্তরগুলি পড়তে আগ্রহী হতে পারেন: স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 5965968/…
এরিক লিপার্ট

5
এই ক্ষেত্রে, আমি মনে করি যে সমঝোতা ন্যায়সঙ্গত হওয়ার চেয়ে বেশি। জটিল কাপড় এমন কিছু বিষয় যা শুধুমাত্র একটি বর্গ গ্রন্থাগার স্থপতি সঙ্গে সংশ্লিষ্ট করা আবশ্যক, এবং এই জটিলতা বিনিময়ে, এটা তোলে খরচ গ্রন্থাগার সহজ এবং আরও বেশি ধারণাসম্পন্ন করুন।
কোডি গ্রে

1
@ এরিকলিপার্ট আমি বিশ্বাস করি যে এনভিশন উল্লেখ করেছেন যে তিনি এই পোস্টটি দেখেছেন এবং ভেবেছিলেন এটি আপনিই ছিলেন ... তারপরে তিনি দেখেন যে তিনি ঠিক আছেন। তিনি বলছিলেন না যে your postএটি অপ্রাসঙ্গিক। His noticing your distinct writing styleঅপ্রাসঙ্গিক।
ওয়ার্নারসিডি

5
মাইক্রোসফ্ট টিম (1) সি # তে সঠিক কাজ করার লক্ষ্যে ভাল প্রচেষ্টা করার জন্য এবং (২) এটি না পাওয়ার চেয়ে আরও বেশি বার পাওয়ার জন্য পর্যাপ্ত ক্রেডিট পায় না।
কোডেনহেম

2
@ ভু: আপনি যদি অন্তর্নিহিত রূপান্তরটি প্রয়োগ করতে চান boolতবে আপনি ব্যবহার করতে পারেন &&এবং ||প্রয়োগ না করে operator true/falseবা operator &/|সি # তে কোনও সমস্যা নেই। সমস্যাটি ঠিক এমন পরিস্থিতিতে দেখা দেয় যেখানে boolসম্ভাব্য রূপান্তর নেই , বা যেখানে পছন্দসই নয়।
এরিক লিপার্ট

43

মুল বক্তব্যটি হ'ল (সি ++ 98 এর সীমানার মধ্যে) ডান-হাতের অপারেন্ডটি যুক্তি হিসাবে ওভারলোডেড অপারেটর ফাংশনে পাঠানো হবে। এটি করার ফলে এটি ইতিমধ্যে মূল্যায়ন করা হবে । কোড operator||()বা operator&&()কোড করতে পারে বা করতে পারে না এমন কিছুই নেই যা এড়াতে পারে।

মূল অপারেটরটি আলাদা, কারণ এটি কোনও ফাংশন নয়, তবে ভাষার নিম্ন স্তরে প্রয়োগ করা হয়।

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

(লম্বডাসকে স্ট্যান্ডার্ডে আনতে তাদের 16 বছর সময় লেগেছে ...)

শব্দার্থক ব্যবহার হিসাবে, বিবেচনা করুন:

objectA && objectB

এটি এই পর্যন্ত সিদ্ধ হয়:

template< typename T >
ClassA.operator&&( T const & objectB )

রূপান্তরকারী অপারেটরকে কল boolকরা এবং ভাষার সংজ্ঞাটির জন্য আপনি কীভাবে এই শব্দগুলিতে রাখবেন তা ছাড়া আপনি এখানে অবজেক্টবি (অজানা টাইপের) সাথে ঠিক কী করতে চান তা চিন্তা করুন ।

এবং আপনি যদি কনকে রূপান্তর করতে ডাকছেন, ভাল ...

objectA && obectB

একই জিনিস, এখন এটা করে? তাহলে প্রথম জায়গায় ওভারলোড কেন?


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

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

9
@ আইফ্রেইলিচট: boolউভয় শ্রেণীর জন্য রূপান্তরকারী অপারেটরের সমস্ত সদস্যের ভেরিয়েবলের অ্যাক্সেস রয়েছে এবং বিল্টিন অপারেটরের সাথে কাজ করে। আর কিছু কিন্তু রূপান্তর-টু-bool, যাহাই হউক না কেন শর্ট সার্কিট নিরীক্ষার জন্য শব্দার্থিক অর্থে দেখা যায় না! সিনট্যাক্টিকাল নয়, সিনটেমিক দৃষ্টিকোণ থেকে এটির কাছে যাওয়ার চেষ্টা করুন : আপনি কী অর্জন করতে চাইছেন, কীভাবে আপনি এটির দিকে যাবেন না।
দেবসোলার

1
আমাকে স্বীকার করতে হবে যে আমি একজনের কথা ভাবতে পারি না। সংক্ষিপ্ত সার্কিটের উপস্থিতির একমাত্র কারণ হ'ল এটি বুলিয়ানদের ক্রিয়াকলাপের জন্য সময় সাশ্রয় করে এবং সমস্ত যুক্তি মূল্যায়নের আগে আপনি কোনও অভিব্যক্তির ফলাফল জানতে পারবেন। অন্যান্য এবং অপারেশনগুলির সাথে, এটি কেস নয় এবং সে কারণেই &এবং &&একই অপারেটরও নয়। আমাকে তা বুঝতে সাহায্য করার জন্য ধন্যবাদ।
iFreilicht

8
@ iFreilicht: বরং, শর্ট সার্কিটের উদ্দেশ্য কারণ বাম হাতের গণনা ডান হাতের পূর্বশর্তের সত্যকে প্রতিষ্ঠিত করতে পারেif (x != NULL && x->foo)গতির জন্য নয়, সুরক্ষার জন্য শর্ট সার্কিট প্রয়োজন।
এরিক লিপার্ট

26

একটি বৈশিষ্ট্য চিন্তা করতে হবে, নকশা করা, বাস্তবায়ন, ডকুমেন্টেড এবং শিপড।

এখন আমরা এটি ভেবেছিলাম, আসুন এখন কেন এটি সহজ হতে পারে তা দেখুন (এবং তা করা এখন কঠিন)। এছাড়াও মনে রাখবেন যে কেবলমাত্র সীমিত পরিমাণে সংস্থান আছে, তাই এটি যুক্ত করে অন্য কিছু কাটা থাকতে পারে (আপনি এর জন্য কী করতে চান?)।


তত্ত্ব অনুসারে, সমস্ত অপারেটর কেবলমাত্র একটি "অপ্রাপ্তবয়স্ক" অতিরিক্ত ভাষা-বৈশিষ্ট্য সহ সংক্ষিপ্ত-প্রচারের আচরণ করতে পারত , সি ++ 11 হিসাবে (যখন ল্যাম্বডাস চালু হয়েছিল, ১৯৯৯ সালে "সি সহ ক্লাস" শুরুর 32 বছর পরে, এখনও একটি সম্মানজনক 16 সি ++ 98 এর পরে):

সি ++ এর প্রয়োজন কেবল অলস-মূল্যায়ন - একটি গোপন ল্যাম্বডা - হিসাবে প্রয়োজনীয় এবং অনুমতিপ্রাপ্ত (প্রাক শর্তগুলি পূরণ করা) অবধি মূল্যায়ন এড়াতে আর্গুমেন্টটি বর্ণনা করার জন্য একটি উপায় প্রয়োজন।


তাত্ত্বিক বৈশিষ্ট্যটি দেখতে কেমন হবে (মনে রাখবেন যে কোনও নতুন বৈশিষ্ট্য ব্যাপকভাবে ব্যবহারযোগ্য হবে)?

একটি টীকা lazyযা কোনও ফাংশন-আর্গুমেন্টে প্রয়োগ করা হয়েছে তা ফাংশনটিকে কোনও ফান্টারের প্রত্যাশায় একটি টেমপ্লেট করে তোলে এবং সংকলকটি অভিব্যক্তিকে একটি ফান্টারে পরিণত করে:

A operator&&(B b, __lazy C c) {return c;}

// And be called like
exp_b && exp_c;
// or
operator&&(exp_b, exp_c);

এটি প্রচ্ছদের নীচে দেখতে পাবেন:

template<class Func> A operator&&(B b, Func& f) {auto&& c = f(); return c;}
// With `f` restricted to no-argument functors returning a `C`.

// And the call:
operator&&(exp_b, [&]{return exp_c;});

বিশেষ লক্ষ করুন যে ল্যাম্বদা লুকিয়ে থাকে, এবং একবারে ডাকা হবে। প্রচলিত-সাফল্য-এক্সপ্রেশন-নির্মূলকরণের হ্রাস সম্ভাবনা বাদ দিয়ে এর কারণে কোনও কার্য-সম্পাদন-অবক্ষয়
হওয়া উচিত না ।


বাস্তবায়ন-জটিলতা এবং ধারণাগত জটিলতার পাশাপাশি (প্রতিটি বৈশিষ্ট্য উভয়ই বাড়িয়ে তোলে, যদি না অন্য কিছু বৈশিষ্ট্যের জন্য এই জটিলতাগুলিকে পর্যাপ্ত পরিমাণে কমিয়ে দেয়), আসুন আরেকটি গুরুত্বপূর্ণ বিবেচনাটি দেখি: পিছনে-সামঞ্জস্যতা।

যদিও এই ভাষা-বৈশিষ্ট্যটি কোনও কোড ভঙ্গ করবে না, তবে এটির সুবিধা গ্রহণ করে এটি কোনও সূক্ষ্মভাবে পরিবর্তিত করবে, যার অর্থ বিদ্যমান গ্রন্থাগারগুলিতে যে কোনও ব্যবহার নিঃশব্দে পরিবর্তন হবে।

বিটিডাব্লু: এই বৈশিষ্ট্যটি ব্যবহার করা সহজ, যদিও বিভাজনের সি # সমাধানের চেয়ে কঠোরতর &&এবং ||পৃথক সংজ্ঞায়নের জন্য দুটি ফাংশনে রূপান্তরিত।


6
@iFreilicht: "X এক্সের বৈশিষ্ট্যটি কেন উপস্থিত নেই?" ফর্মটির কোনও প্রশ্ন? একই উত্তর রয়েছে: বৈশিষ্ট্যটির উপস্থিতি অবশ্যই একটি ভাল ধারণা হিসাবে বিবেচিত, ডিজাইন, নির্দিষ্ট, প্রয়োগ, পরীক্ষা, নথিভুক্ত এবং শেষ ব্যবহারকারীর কাছে প্রেরণ করা উচিত। যদি সেগুলির কোনও একটি না ঘটে, তবে কোনও বৈশিষ্ট্য নেই। আপনার প্রস্তাবিত বৈশিষ্ট্যটির সাথে সেগুলির একটি ঘটেনি; কোনটি aতিহাসিক গবেষণার সমস্যা তা খুঁজে বের করা; এই বিষয়গুলির মধ্যে কোনটি কখনই করা হয়নি সে বিষয়ে যত্নশীল হলে ডিজাইন কমিটির লোকজনের সাথে কথা বলা শুরু করুন।
এরিক লিপার্ট

1
@ এরিকলিপার্ট: এবং এটি কোন কারণের উপর নির্ভর করে এটি প্রয়োগ না করা পর্যন্ত পুনরাবৃত্তি করুন: সম্ভবত এটি খুব জটিল বলে মনে করা হয়েছিল, এবং নুন পুনরায় মূল্যায়ন করার কথা ভাবেনি। অথবা পুনরায় মূল্যায়ন আগের অধিষ্ঠানের চেয়ে প্রত্যাখ্যান করার বিভিন্ন কারণে শেষ হয়েছে। : (BTW আপনার মন্তব্যের সারকথা যোগ করা হয়েছে)
Deduplicator

@ ডেডুকিপ্লেটর এক্সপ্রেশন টেমপ্লেট সহ অলস কীওয়ার্ড বা ল্যাম্বডাসের প্রয়োজন নেই।
সুমেন্ট

Aতিহাসিক দিকটি বিবেচনা করে মনে রাখবেন যে মূল অ্যালগল 68 ভাষার একটি "প্রক্রিয়াজাতকরণ" জবরদস্তি ছিল (পাশাপাশি অবক্ষয়, যার অর্থ যখন প্রসঙ্গটি ফাংশনের ধরণের পরিবর্তে ফলাফলের প্রকারের পরিবর্তে ফলাফলের প্রয়োজন হয় তখন স্পষ্টভাবে একটি প্যারামিটারলেস ফাংশন বলা হয়) calling এর অর্থ এই যে একটি অবস্থান টাইপ টি একটি অভিব্যক্তি যে প্রকার "parameterless ফাংশন ফিরে টি" (বানান "এর একটি মান প্রয়োজন proc টি" কম্পিউটারে কাজ করার একটি ভাষা 68 মধ্যে) পরোক্ষভাবে প্রকাশ দেওয়া (অন্তর্নিহিত ল্যামডা) ফিরে ফাংশন বডির রূপান্তরিত করা হবে। ভাষাটির 1973 সংশোধনীতে বৈশিষ্ট্যটি সরানো হয়েছিল (অবনমিতকরণের মতো নয়)।
মার্ক ভ্যান লিউউইন

... সি ++ এর জন্য অনুরূপ পদ্ধতির অপারেটরগুলি &&"পয়েন্টার রিটার্নিং টি ফাংশন করার জন্য" টাইপের একটি যুক্তি গ্রহণ করা এবং একটি অতিরিক্ত রূপান্তর বিধি গ্রহণ করতে পছন্দ করে যা টি টাইপের একটি আর্গুমেন্ট এক্সপ্রেশনকে সুস্পষ্টভাবে ল্যাম্বডা অভিব্যক্তিতে রূপান্তরিত করতে দেয় allows দ্রষ্টব্য যে এটি কোনও সাধারণ রূপান্তর নয়, কারণ এটি সিনট্যাকটিক স্তরে করা আবশ্যক: রানটাইমটি টাইপের টির কোনও মানকে একটি ফাংশনে রূপান্তর করা কোনও উপকারে আসেনি কারণ মূল্যায়ন ইতিমধ্যে সম্পন্ন হত।
মার্ক ভ্যান লিউউইন

13

পূর্ববর্তী যুক্তিযুক্তকরণ সহ, মূলত কারণ

  • শর্ট সার্কিটের গ্যারান্টিযুক্ত (নতুন সিনট্যাক্স প্রবর্তন না করে) অপারেটরদের সীমাবদ্ধ রাখতে হবে ফলাফলআসল প্রথম যুক্তি রূপান্তরিত bool, এবং

  • সংক্ষিপ্ত সার্কিট সহজেই অন্যান্য উপায়ে প্রকাশ করা যেতে পারে, যখন প্রয়োজন হয়।


উদাহরণস্বরূপ, যদি কোনও শ্রেণি Tসংযুক্ত থাকে &&এবং ||অপারেটর থাকে, তবে এক্সপ্রেশন

auto x = a && b || c;

যেখানে a, bএবং cধরনের এক্সপ্রেশন হয় T, যেমন সংক্ষিপ্ত circuiting সঙ্গে প্রকাশ করা যেতে পারে

auto&& and_arg = a;
auto&& and_result = (and_arg? and_arg && b : and_arg);
auto x = (and_result? and_result : and_result || c);

বা সম্ভবত আরও স্পষ্ট হিসাবে

auto x = [&]() -> T_op_result
{
    auto&& and_arg = a;
    auto&& and_result = (and_arg? and_arg && b : and_arg);
    if( and_result ) { return and_result; } else { return and_result || b; }
}();

অপারেটর আমন্ত্রণগুলি থেকে আপাতর অপ্রয়োজনীয় কোনও পার্শ্ব প্রতিক্রিয়া সংরক্ষণ করে।


ল্যাম্বডা পুনর্লিখনটি আরও ভার্বোজ হলেও এর আরও ভাল এনক্যাপসুলেশন একজনকে এ জাতীয় অপারেটরগুলি সংজ্ঞায়িত করতে দেয় ।

আমি নিম্নলিখিত সকলের (এখনও কিছুটা ইনফ্লুয়েঞ্জা) স্ট্যান্ডার্ড-কনফরমেন্সের বিষয়ে পুরোপুরি নিশ্চিত নই, তবে এটি ভিজ্যুয়াল সি ++ 12.0 (2013) এবং মিনজিডাব্লু জি ++ 4.8.2 এর সাথে পরিষ্কারভাবে সংকলন করেছে:

#include <iostream>
using namespace std;

void say( char const* s ) { cout << s; }

struct S
{
    using Op_result = S;

    bool value;
    auto is_true() const -> bool { say( "!! " ); return value; }

    friend
    auto operator&&( S const a, S const b )
        -> S
    { say( "&& " ); return a.value? b : a; }

    friend
    auto operator||( S const a, S const b )
        -> S
    { say( "|| " ); return a.value? a : b; }

    friend
    auto operator<<( ostream& stream, S const o )
        -> ostream&
    { return stream << o.value; }

};

template< class T >
auto is_true( T const& x ) -> bool { return !!x; }

template<>
auto is_true( S const& x ) -> bool { return x.is_true(); }

#define SHORTED_AND( a, b ) \
[&]() \
{ \
    auto&& and_arg = (a); \
    return (is_true( and_arg )? and_arg && (b) : and_arg); \
}()

#define SHORTED_OR( a, b ) \
[&]() \
{ \
    auto&& or_arg = (a); \
    return (is_true( or_arg )? or_arg : or_arg || (b)); \
}()

auto main()
    -> int
{
    cout << boolalpha;
    for( int a = 0; a <= 1; ++a )
    {
        for( int b = 0; b <= 1; ++b )
        {
            for( int c = 0; c <= 1; ++c )
            {
                S oa{!!a}, ob{!!b}, oc{!!c};
                cout << a << b << c << " -> ";
                auto x = SHORTED_OR( SHORTED_AND( oa, ob ), oc );
                cout << x << endl;
            }
        }
    }
}

আউটপুট:

000 -> !! !! || মিথ্যা
001 -> !! !! || সত্য
010 -> !! !! || মিথ্যা
011 -> !! !! || সত্য
100 -> !! && !! || মিথ্যা
101 -> !! && !! || সত্য
110 -> !! && !! সত্য
111 -> !! && !! সত্য

এখানে প্রতিটি !!ঠুং ঠুং শব্দ একটি রূপান্তর দেখায় bool, অর্থাত্ একটি আর্গুমেন্ট মান চেক।

যেহেতু একটি সংকলক সহজেই একই কাজ করতে পারে এবং অতিরিক্ত এটি অনুকূল করতে পারে, এটি সম্ভবত প্রদর্শিত বাস্তবায়ন এবং অসম্ভবতার যে কোনও দাবি অবশ্যই অসম্ভবতার দাবি হিসাবে একই শ্রেণিতে রাখতে হবে, সাধারণত, সাধারণত বোলকস।


আমি আপনার শর্ট সার্কিটের বিকল্পগুলি পছন্দ করি, বিশেষত ত্রৈমাসিকের যা সম্ভবত আপনি যতটা পেতে পারেন তার কাছাকাছি।
আইফ্রেইলিচ্ট

আপনি এর শর্ট সার্কিটটি মিস করছেন &&- এখানে if (!a) { return some_false_ish_T(); }আপনার নিজের প্রথম বুলেটের মতো একটি অতিরিক্ত লাইন থাকা দরকার : শর্ট সার্কিটটি বোলে রূপান্তরযোগ্য পরামিতি সম্পর্কে, ফলাফলগুলি নয়।
অ্যার্ন মের্টজ

@ আর্নেমার্টজ: "মিসিং" সম্পর্কে আপনার মন্তব্য আপাত অর্থহীন। এটি কী সম্পর্কে মন্তব্য, হ্যাঁ আমি এটি সম্পর্কে অবহিত। রূপান্তর boolকরা প্রয়োজন কি শর্ট-সার্কিট।
চিয়ার্স এবং এইচটিএইচ - Alf

@ Cheersandhth.-আলফ অনুপস্থিত সম্পর্কে মন্তব্য আপনার উত্তর প্রথম সংস্করণ যেখানে আপনি শর্ট সার্কিট করেনি ছিল ||কিন্তু &&। অন্যান্য মন্তব্য লক্ষ্যে হয়েছিল "অবধি সীমিত করতে হবে ফলাফল আপনার প্রথম বুলেট পয়েন্ট মধ্যে bool করার পরিবর্তনীয়" - এটি "অবধি সীমিত পড়া উচিত পরামিতি নিচ bool করার পরিবর্তনীয়"।
আরনে মের্টজ

@ আরনেমার্টজ: ঠিক আছে, পুনরায় সংস্করণ করছি, দুঃখিত আমি ধীর সম্পাদনা করছি। পুনরায় সীমাবদ্ধ, না এটি অপারেটর ফলাফল যা সীমাবদ্ধ রাখতে হবে, কারণ boolঅভিব্যক্তিতে আরও অপারেটরগুলির সংক্ষিপ্ত সঞ্চালনের জন্য এটি রূপান্তর করতে হবে । যেমন, লজিক্যাল ওআর-এর সংক্ষিপ্ত-সঞ্চালনের জন্য পরীক্ষার ফলাফলকে a && bরূপান্তর করতে boolহবে a && b || c
চিয়ার্স এবং এইচটিএইচ - Alf

5

tl; dr : অতিমাত্রায় ব্যয় (বিশেষ সিনট্যাক্সের প্রয়োজন) এর তুলনায় খুব কম চাহিদার (বৈশিষ্ট্যটি কে ব্যবহার করবেন?) কারণে এটি চেষ্টা করার মতো নয়।

প্রথম জিনিসটি যা মনে আসে তা হ'ল অপারেটর ওভারলোডিং কেবল ফাংশনগুলি লেখার এক অভিনব উপায়, যেখানে অপারেটরগুলির বুলিয়ান সংস্করণ ||এবং &&বুটলিন স্টাফ। এর অর্থ x = y && zহ'ল সংকলকটিতে তাদের শর্ট সার্কিট করার স্বাধীনতা রয়েছে, যখন ননবুলিয়ান সহ এক্সপ্রেশন yএবং zএর মতো কোনও ফাংশনে ডাকতে হবে X operator&& (Y, Z)। এর অর্থ y && zহ'ল এটি লেখার এক অভিনব উপায় operator&&(y,z)যা কেবলমাত্র একটি অদ্ভুত নামযুক্ত ফাংশনের কল মাত্র যেখানে দুটি পরামিতি ফাংশনটি কল করার আগে মূল্যায়ন করতে হবে (এমন কোনও কিছু যা সংক্ষিপ্ত-সার্কিট এপ্রোপিয়েট হিসাবে বিবেচিত হবে) including

তবে, কেউ যুক্তি দিতে পারে যে &&অপারেটরদের অনুবাদ কিছুটা পরিশীলিত করা সম্ভব হওয়া উচিত , যেমন এটি newঅপারেটরের পক্ষে যা operator newকনস্ট্রাক্টর কল দ্বারা ফাংশনটি কল করার জন্য অনুবাদ করা হয়।

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

X operator&&(Y const& y, Z const& z)
{
  if (shortcircuitCondition(y))
    return shortcircuitEvaluation(y);

  <"Syntax for an evaluation-Point for z here">

  return actualImplementation(y,z);
}

একজন খুব কমই ওভারলোড করতে চায় operator||এবং operator&&কারণ খুব কমই এমন একটি ঘটনা ঘটে যেখানে লিখন a && bআসলে ননবুলিয়ান প্রসঙ্গে স্বজ্ঞাত হয়। আমার জানা ব্যতিক্রমগুলি হ'ল এক্সপ্রেশন টেম্পলেটগুলি, যেমন এমবেডড ডিএসএল-এর জন্য। এবং শর্ট সার্কিট মূল্যায়ন থেকে এই কয়েকটি ক্ষেত্রে কেবলমাত্র কয়েকটি মুখ্য উপকার পাবেন। এক্সপ্রেশন টেম্পলেটগুলি সাধারণত হয় না, কারণ এগুলি প্রকাশের গাছগুলি তৈরি করতে ব্যবহৃত হয় যা পরে মূল্যায়ন করা হয়, সুতরাং আপনার সর্বদা অভিব্যক্তির উভয় পক্ষের প্রয়োজন।

সংক্ষেপে: সংকলক লেখক বা মানক লেখক উভয়ই হুপের মধ্য দিয়ে ঝাঁপিয়ে পড়ার এবং অতিরিক্ত জটিল বাক্য গঠনটি সংজ্ঞায়িত ও বাস্তবায়নের প্রয়োজনীয়তা অনুভব করেনি, কারণ মিলিয়নের মধ্যে একজনের ধারণা থাকতে পারে যে ব্যবহারকারীর সংজ্ঞা দেওয়া operator&&এবং সংক্ষিপ্ত-সার্কিট করা ভাল হবে operator||- এই সিদ্ধান্তে পৌঁছানোর জন্য যে হাত প্রতি যুক্তি লেখার চেয়ে কম প্রচেষ্টা নয়।


খরচ কি আসলেই বেশি? ডি প্রোগ্রামিং ল্যাঙ্গুয়েজটি এমন প্যারামিটারগুলি ঘোষণা করতে দেয় lazyযা আর্গুমেন্ট হিসাবে প্রদত্ত অভিব্যক্তিটিকে বেনামে ফাংশনে রূপান্তরিত করে। এটি তথাকথিত ফাংশনটিকে সেই যুক্তিটি কল করার পছন্দ দেয় বা না। সুতরাং ভাষাটিতে ইতিমধ্যে ল্যাম্বডাস থাকলে অতিরিক্ত সিনট্যাক্সের প্রয়োজন খুব ছোট very "সিউডোকোড": এক্স এবং (এ এ, অলস বি খ) {যদি (কনড (ক)) short সংক্ষিপ্ত ফিরে (ক); } অন্য {প্রকৃত (ক, খ ()); }}
ব্ল্যাকজ্যাক

@ ব্ল্যাকজ্যাক যে অলস প্যারামিটারটি একটি গ্রহণ করে প্রয়োগ করা যেতে পারে std::function<B()>যা একটি নির্দিষ্ট ওভারহেড বহন করতে পারে। অথবা আপনি যদি ইনলাইন করতে ইচ্ছুক হন তবে এটি তৈরি করুন template <class F> X and(A a, F&& f){ ... actual(a,F()) ...}। এবং এটি "সাধারণ" Bপ্যারামিটারের সাহায্যে ওভারলোড হতে পারে , তাই কলকারী কোন সংস্করণটি চয়ন করবেন তা সিদ্ধান্ত নিতে পারে। lazyসিনট্যাক্স আরও বেশি সুবিধাজনক হতে কিন্তু একটি নির্দিষ্ট কর্মক্ষমতা ট্রেড বন্ধ হয়েছে পারে।
আর্নে মের্টজ

1
সঙ্গে সমস্যা এক std::functionবনাম lazyযে প্রথম একাধিক বার মূল্যায়ন করা যেতে পারে। এখনও fooব্যবহার করা foo+fooহয় এমন একটি অলস প্যারামিটার কেবল একবারই মূল্যায়ন করা হয়।
MSalters

"শর্ট সার্কিটের ব্যবহারগুলি এমন ক্ষেত্রে সীমাবদ্ধ থাকবে যেখানে ওয়াই এক্স এর কাছে পৌঁছনীয়" ... না, এটি কেবলমাত্র সেই ক্ষেত্রেই সীমাবদ্ধ যেগুলি একা Xভিত্তিতে গণনা করা Yযায়। খুব আলাদা। std::ostream& operator||(char* a, lazy char*b) {if (a) return std::cout<<a;return std::cout<<b;}। যদি না আপনি "রূপান্তর" এর খুব নৈমিত্তিক ব্যবহার ব্যবহার না করেন।
মাকিং হাঁস

1
@ সুমেন্ট তারা পারেন তবে আপনি নিজের operator&&হাতে একটি শর্ট-সার্কিট কাস্টমটির যুক্তিও লিখতে পারেন । প্রশ্নটি যদি সম্ভব হয় তবে তা নয় তবে কেন একটি ছোট সুবিধাজনক উপায় নেই।
আরনে মের্টজ

5

অলসতার পরিচয় দেওয়ার একমাত্র উপায় লাম্বদাস নয়। অলস মূল্যায়ন সি ++ তে এক্সপ্রেশন টেমপ্লেটগুলি ব্যবহার করে তুলনামূলকভাবে সোজা-এগিয়ে । কীওয়ার্ডের প্রয়োজন নেই lazyএবং এটি C ++ 98 এ প্রয়োগ করা যেতে পারে। এক্সপ্রেশন গাছগুলির উপরে ইতিমধ্যে উল্লেখ করা হয়েছে। এক্সপ্রেশন টেমপ্লেটগুলি দরিদ্র (তবে চতুর) মানুষের অভিব্যক্তি গাছ। কৌশলটি হ'ল Exprটেমপ্লেটের পুনরাবৃত্তভাবে নেস্ট করা ইনস্ট্যান্টেশনের গাছটিকে এক্সপ্রেশনটিকে রূপান্তর করা । গাছটি নির্মাণের পরে আলাদাভাবে মূল্যায়ন করা হয়।

নিম্নলিখিত কোডটি ক্লাসের জন্য সংক্ষিপ্ত-প্রচারিত &&এবং ||অপারেটরগুলি প্রয়োগ করে Sযতক্ষণ এটি সরবরাহ করে logical_andএবং logical_orবিনামূল্যে ফাংশন সরবরাহ করে এবং এটি রূপান্তরযোগ্য bool। কোডটি C ++ 14 এ রয়েছে তবে ধারণাটি C ++ 98 তেও প্রযোজ্য। সরাসরি উদাহরণ দেখুন ।

#include <iostream>

struct S
{
  bool val;

  explicit S(int i) : val(i) {}  
  explicit S(bool b) : val(b) {}

  template <class Expr>
  S (const Expr & expr)
   : val(evaluate(expr).val)
  { }

  template <class Expr>
  S & operator = (const Expr & expr)
  {
    val = evaluate(expr).val;
    return *this;
  }

  explicit operator bool () const 
  {
    return val;
  }
};

S logical_and (const S & lhs, const S & rhs)
{
    std::cout << "&& ";
    return S{lhs.val && rhs.val};
}

S logical_or (const S & lhs, const S & rhs)
{
    std::cout << "|| ";
    return S{lhs.val || rhs.val};
}


const S & evaluate(const S &s) 
{
  return s;
}

template <class Expr>
S evaluate(const Expr & expr) 
{
  return expr.eval();
}

struct And 
{
  template <class LExpr, class RExpr>
  S operator ()(const LExpr & l, const RExpr & r) const
  {
    const S & temp = evaluate(l);
    return temp? logical_and(temp, evaluate(r)) : temp;
  }
};

struct Or 
{
  template <class LExpr, class RExpr>
  S operator ()(const LExpr & l, const RExpr & r) const
  {
    const S & temp = evaluate(l);
    return temp? temp : logical_or(temp, evaluate(r));
  }
};


template <class Op, class LExpr, class RExpr>
struct Expr
{
  Op op;
  const LExpr &lhs;
  const RExpr &rhs;

  Expr(const LExpr& l, const RExpr & r)
   : lhs(l),
     rhs(r)
  {}

  S eval() const 
  {
    return op(lhs, rhs);
  }
};

template <class LExpr>
auto operator && (const LExpr & lhs, const S & rhs)
{
  return Expr<And, LExpr, S> (lhs, rhs);
}

template <class LExpr, class Op, class L, class R>
auto operator && (const LExpr & lhs, const Expr<Op,L,R> & rhs)
{
  return Expr<And, LExpr, Expr<Op,L,R>> (lhs, rhs);
}

template <class LExpr>
auto operator || (const LExpr & lhs, const S & rhs)
{
  return Expr<Or, LExpr, S> (lhs, rhs);
}

template <class LExpr, class Op, class L, class R>
auto operator || (const LExpr & lhs, const Expr<Op,L,R> & rhs)
{
  return Expr<Or, LExpr, Expr<Op,L,R>> (lhs, rhs);
}

std::ostream & operator << (std::ostream & o, const S & s)
{
  o << s.val;
  return o;
}

S and_result(S s1, S s2, S s3)
{
  return s1 && s2 && s3;
}

S or_result(S s1, S s2, S s3)
{
  return s1 || s2 || s3;
}

int main(void) 
{
  for(int i=0; i<= 1; ++i)
    for(int j=0; j<= 1; ++j)
      for(int k=0; k<= 1; ++k)
        std::cout << and_result(S{i}, S{j}, S{k}) << std::endl;

  for(int i=0; i<= 1; ++i)
    for(int j=0; j<= 1; ++j)
      for(int k=0; k<= 1; ++k)
        std::cout << or_result(S{i}, S{j}, S{k}) << std::endl;

  return 0;
}

5

লজিকাল অপারেটরদের সংক্ষিপ্তসার্কিট করার অনুমতি দেওয়া হয়েছে কারণ এটি সম্পর্কিত সত্য সারণীগুলির মূল্যায়নে "অপ্টিমাইজেশন" is এটি যুক্তি নিজেই একটি ফাংশন , এবং এই যুক্তি সংজ্ঞায়িত করা হয়।

অতিরিক্ত লোড হওয়া &&এবং ||শর্ট সার্কিট না করার কোনও কারণ আছে কি ?

কাস্টম ওভারলোডেড লজিকাল অপারেটরগুলি এই সত্যের ছকগুলির যুক্তি অনুসরণ করতে বাধ্য নয়।

তবে কেন তারা অতিরিক্ত বোঝা চাপালে এই আচরণটি হারাবে?

সুতরাং পুরো ক্রিয়াটি স্বাভাবিক হিসাবে মূল্যায়ন করা দরকার। সংকলকটিকে এটি অবশ্যই একটি সাধারণ ওভারলোডেড অপারেটর (বা ফাংশন) হিসাবে বিবেচনা করবে এবং এটি এখনও অন্য কোনও ফাংশনের মতোই আশাবাদ প্রয়োগ করতে পারে।

লোক বিভিন্ন কারণে লজিকাল অপারেটরদের ওভারলোড করে। উদাহরণ স্বরূপ; একটি নির্দিষ্ট ডোমেনে তাদের নির্দিষ্ট অর্থ থাকতে পারে যা লোকেরা অভ্যস্ত "সাধারণ" যৌক্তিক নয়।


4

"এবং" এবং "বা" এর সত্য সারণীর কারণে সংক্ষিপ্তসারকিট হয়। আপনি কীভাবে জানবেন যে ব্যবহারকারী কোন অপারেশন সংজ্ঞায়িত করতে চলেছে এবং আপনি কীভাবে জানবেন যে আপনাকে দ্বিতীয় অপারেটরের মূল্যায়ন করতে হবে না?


মন্তব্যগুলিতে এবং @ প্রতিলিপিগুলির উত্তরে উল্লিখিত হিসাবে, একটি অতিরিক্ত ভাষা বৈশিষ্ট্য দিয়ে এটি সম্ভব হবে। আমি জানি যে এটি এখন কাজ করে না। আমার প্রশ্নটি এমন বৈশিষ্ট্যটি না থাকার পিছনে যুক্তিটি কী তা ছিল।
আইফ্রেইলিচ্ট

তবে এটি অবশ্যই একটি জটিল বৈশিষ্ট্য হবে, এটি বিবেচনা করে আমাদের এর ব্যবহারকারীর সংজ্ঞা সম্পর্কে একটি অনুমান করতে হবে!
এনজে-এথ

: (<condition>)অপারেটর ঘোষণার পরে দ্বিতীয় অবস্থার মূল্যায়ন হয় না এমন শর্তটি নির্দিষ্ট করার বিষয়ে কী হয়?
iFreilicht

@ আইফ্রেইলিচট: আপনার এখনও বিকল্প অ্যানারি ফাংশন বডি দরকার।
MSalters

3

কিন্তু বুলের জন্য অপারেটরদের এই আচরণ রয়েছে, কেন এটি এই একক ধরণের মধ্যে সীমাবদ্ধ করা উচিত?

আমি কেবল এই এক অংশের উত্তর দিতে চাই। কারণটি হ'ল ওভারলোডেড অপারেটরগুলি যেমন বিল্ট-ইন &&এবং ||এক্সপ্রেশনগুলি ফাংশন দিয়ে প্রয়োগ করা হয় না।

সংক্ষেপে নির্দিষ্ট অভিব্যক্তিগুলির সংকলকটির বুঝতে অন্তর্নির্মিত সংক্ষিপ্ত-সার্কিট যুক্তিযুক্ত হওয়া সহজ। এটি ঠিক অন্য কোনও অন্তর্নির্মিত নিয়ন্ত্রণ প্রবাহের মতো।

তবে অপারেটর ওভারলোডিং এর পরিবর্তে ফাংশনগুলির সাথে প্রয়োগ করা হয়, যার নির্দিষ্ট বিধি রয়েছে যার মধ্যে একটি হ'ল ফাংশন বলার আগে আর্গুমেন্ট হিসাবে ব্যবহৃত সমস্ত এক্সপ্রেশনকে মূল্যায়ন করা হয়। স্পষ্টতই বিভিন্ন বিধি সংজ্ঞায়িত করা যেতে পারে, তবে এটি একটি বড় কাজ।


1
আমি ভাবছি যদি কোন বিবেচনার প্রশ্ন দেয়া হয়েছিল কিনা এর overloads &&, ||এবং ,অনুমোদন করা উচিত? ফাংশন কল ব্যতীত ওভারলোডগুলি অন্য কোনও কিছুর মতো আচরণ করার অনুমতি দেওয়ার জন্য সি +++ এর কোনও ব্যবস্থা নেই তা এই ব্যাখ্যা করে যে কেন those ফাংশনগুলির ওভারলোডগুলি অন্য কিছু করতে পারে না, তবে কেন এই অপারেটররা প্রথম স্থানে ওভারলোডযোগ্য হয় তা ব্যাখ্যা করে না। আমার সন্দেহ হয় যে আসল কারণটি হ'ল তারা এতো চিন্তাভাবনা না করে অপারেটরদের তালিকায় ফেলে দিয়েছে।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.