কেন একটি সংক্ষিপ্ত-সার্কিট বা এর পাশাপাশি সি # তে অপারেটরের শর্ট-সার্কিট পরিবর্তিত পরিবর্তন?


9

পর্যায়ক্রমে আমি এই সম্পর্কে অবাক হই:

সংক্ষিপ্ত-সার্কিট OR সর্বদা একই রকম মানটি ফিরিয়ে দেবে যেটি আনসার্ট-সার্কিটযুক্ত ওআর অপারেটরের করবে?

আমি আশা করি যে শর্ট সার্কিট OR সর্বদা আরও দ্রুত মূল্যায়ন করবে। সুতরাং, আনসোর্ট-সার্কিট বা অপারেটরটি কি ধারাবাহিকতার জন্য সি # ভাষায় অন্তর্ভুক্ত ছিল?

আমি কি মিস করেছি?


9
একই ফেরতের মান - হ্যাঁ। একই পার্শ্ব প্রতিক্রিয়া - না।
কাজ

2
ধরা যাক f()একটি ব্যতিক্রম উত্থাপন করে, বিবেচনা করুন true || f()এবং true | f()। তুমি কি ভিন্নতা দেখতে পাও? পূর্বের অভিব্যক্তিটি মূল্যায়ন করে true, পরবর্তীগুলির মূল্যায়নের ব্যতিক্রম ছুঁড়ে ফেলা হয়।
স্কার্ফ্রিজে

উত্তর:


25

উভয় অপারেশনগুলি বিভিন্ন জিনিসগুলির জন্য বোঝানো হয়েছিল, সি থেকে আগত যা বুলেট জাতীয় ধরণের ছিল না। শর্ট সার্কিট সংস্করণ || কেবল বুলিয়ানগুলির সাথে কাজ করে, অ শর্ট সার্কিট সংস্করণ | অবিচ্ছেদ্য প্রকারের সাথে কাজ করে, কিছুটা পারফরম্যান্স সম্পাদন করে বা। এটি কেবল বুলিয়ানদের জন্য একটি নন-শর্ট সার্কিট লজিকাল অপারেশন হিসাবে কাজ করার জন্য ঘটেছিল যা 0 বা 1 হয়ে একক বিট দ্বারা প্রতিনিধিত্ব করা হয়।

http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators#Logical


10
লিঙ্কের জন্য +1। আমি যখন এই প্রশ্নটি পড়ি তখন আমি "কী?" আফিক যেহেতু এগুলির সরকারী নামটি যৌক্তিক এবং বিটওয়াইজ বা শর্ট সার্কিট এবং আনসার্ট সার্কিট নয় যা তারা কীভাবে কাজ করে তার পার্শ্ব প্রতিক্রিয়া হিসাবে দেখা দেয়।
10

1
+1 আমি "কেবলমাত্র বুলিয়ান অপারেশনগুলিতেই কাজ করে" দেখি - আমি সম্ভবত পার্থক্যটি লক্ষ্য করিনি কারণ আমি কেবলমাত্র যেভাবেই বুলিয়ানকে মূল্যায়ন করে তা প্রকাশ করি
CarneyCode

2
আমাকে যাচাই করতে হয়েছিল, তবে এটি সত্য যে |দুটি অপেক্ষাকৃত মান প্রয়োগ করার সময় অপারেটর যখন দুটি বুলিয়ান মানের সাথে প্রয়োগ করা হয়, তখন একই orঅপারেটরে সংকলিত হয় - শর্তসাপেক্ষে ||সিআইএল-এ সংকলিত হয় না brtrueঝাঁপ।
কোয়ান্টিন-স্টারিন

13

|(বিটওয়াইস-বা) অবশ্যই জাতীয় ধরণের জন্য অ-শর্ট সার্কিট হতে হবে int। কারণ প্রায় সকল ক্ষেত্রেই আপনাকে |সঠিক ফলাফল গণনা করতে একটি অভিব্যক্তির উভয় পক্ষের গণনা করতে হবে । উদাহরণস্বরূপ, এর ফলাফল কী 7 | f(x)?

যদি f(x)মূল্যায়ন না হয় তবে আপনি বলতে পারবেন না।

তবুও এটি অপারেটরকে শর্ট-সার্কিটের শর্ট সার্কিট করার পক্ষে অসঙ্গত হবে boolযখন এটি অ-শর্ট সার্কিটের জন্য হয় int। যাইহোক, আমি মনে করি আমি |ইচ্ছাকৃতভাবে কখনই যৌক্তিক তুলনা ব্যবহার করি নি , |লজিকাল অপারেটর হিসাবে কথা বলা এটি খুব অসুবিধে হয় ।

|| তবে লজিকাল তুলনার জন্য, যেখানে শর্ট সার্কিট মূল্যায়ন ভাল কাজ করে।

এমনকি সি এবং সি ++ এর ক্ষেত্রেও একই বৈধ, যেখানে এই অপারেটরগুলির উত্স।


5

এটি সঠিক, শর্ট সার্কিট OR অপারেটর (||) সর্বদা নন-শর্ট সার্কিট OR অপারেটর (|) এর সমান মান প্রদান করবে। (*)

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

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

একটি উদাহরণ যেখানে আপনার নন-শর্ট সার্কিট অপারেটরটি ব্যবহার করা উচিত:

if( write_customer_to_database() != SUCCESS |
    write_supplier_to_database() != SUCCESS |
    write_order_to_database() != SUCCESS )
{
    transaction_rollback();
}

(*) সত্যিকারের কিছু বিকৃত দৃশ্য ব্যতীত যেখানে প্রথম অপারেন্ডকে মিথ্যা কারণের দিকে তাকাতে পার্শ্ব-প্রতিক্রিয়া দ্বারা দ্বিতীয় অপারেন্ডকে মিথ্যা পরিবর্তে সত্যে মূল্যায়ন করতে হবে।


2
+1 তবে আমি সাফল্য বা ব্যর্থতা নির্দেশ করতে ফাংশনগুলি ব্যবহার করা ছাড়াও এটি যুক্ত করতে চাই (যেমন আপনার উদাহরণ হিসাবে): পার্শ্ব প্রতিক্রিয়াযুক্ত ফাংশনগুলি সাধারণত এড়ানো উচিত ...
মার্জান ভেনেমা

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

সেই উদাহরণটি অপারেটরদের উপর নির্ভর করে কঠোর বাম থেকে ডান ক্রমে মূল্যায়ন করা হচ্ছে। সি # এটির গ্যারান্টি দেয় তবে অনেকগুলি অনুরূপ ভাষা (সি এবং সি ++ সহ) তা দেয় না do
কিথ থম্পসন

সংক্ষিপ্ত-সার্কিট মূল্যায়ন কি সেই বিশেষ উদাহরণটির জন্য অর্থবোধ করে না, যেহেতু তাদের মধ্যে কোনওটি ব্যর্থ হলে সমস্ত লেনদেনগুলি আবার ফিরিয়ে আনা হবে? (আমি কলগুলির শব্দার্থবিজ্ঞান সম্পর্কে কিছুটা অনুমান করছি Ke)
কেথ থম্পসন

@ কিথথম্পসন আপনি ঠিক বলেছেন, নন-শর্ট সার্কিট মূল্যায়ন অপ্রয়োজনীয় প্রক্রিয়াজাতকরণের কারণ ঘটবে, এবং এই দিক থেকে উদাহরণটি কিছুটা খোঁড়া, তবে পরিবর্তনের পরোয়ানা দেওয়া এতটা খোঁড়া নয়, কারণ সত্যটি এখনও শর্ট সার্কিটের মূল্যায়ন থাকলেই হবে write_customer_to_datedia () সাফল্য লাভ করে, তারপরে বাকী লেখার _... ফাংশন কখনই ডাকা হবে না, এবং ব্যর্থতার ক্ষেত্রে কিছু অপ্রয়োজনীয় ক্রিয়াকলাপ সম্পাদনের চেয়ে সাফল্যের ক্ষেত্রে সঠিকভাবে কাজ করা ভাল।
মাইক নাকিস

4

নন-শর্টকার্টকিট বৈকল্পিকটি ব্যবহার করার জন্য দুটি কারণ থাকবে:

  1. পার্শ্ব প্রতিক্রিয়া রাখা (তবে এটি একটি অস্থায়ী ভেরিয়েবল সহ কোডটি আরও পরিষ্কার)

  2. শর্ট সার্কিটের কাঁটাচাটি এড়িয়ে সময়সীমার আক্রমণগুলি ব্যর্থ করুন (এটি যদি দ্বিতীয় অপারেন্ডটি পরিবর্তনশীল হয় তবে রানটাইম দক্ষতাও উন্নত করতে পারে তবে এটি সংকলক যেভাবেই তৈরি করতে পারে এটি একটি মাইক্রো-অপ্টিমাইজেশন)


এটি কেবলমাত্র সঠিক কারণ হিসাবে সরবরাহ করা হয়েছে, আমি কেন জানি না কেন এটি সর্বোচ্চ ভোট দিয়ে গৃহীত উত্তর নয় ...
বেহরোজ

2

যদি অপারেটরের ডান হাতের ক্লজটির পার্শ্ব-প্রতিক্রিয়া থাকে এবং প্রোগ্রামারটি উদ্দেশ্য করে যে সে তার রিটার্নের মান যাচাই করার আগে উভয় পার্শ্ব প্রতিক্রিয়া ঘটুক।


5
Eek। দয়া করে এর মতো কোড করবেন না ... যদি আপনি পার্শ্ব প্রতিক্রিয়াগুলির উপর নির্ভর করেন, দুটি আলাদা ভাব প্রকাশ করেন, ফলাফল নির্ধারণ করুন এবং তারপরে তাদের পরীক্ষা করুন ।
কনরাড রুডল্ফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.