ভাষার মতো সি-তে "শর্ট-সার্কিট" কী?


14

আমি "শর্ট-সার্কিট" শব্দটি সি, সি ++, সি #, জাভা এবং আরও অনেক ক্ষেত্রে ব্যবহৃত হচ্ছে শুনেছি। এর অর্থ কী এবং কোন পরিস্থিতিতে এটি ব্যবহার করা হবে?


6
ধারণাটি সম্পর্কে একটি উইকিপিডিয়া নিবন্ধ রয়েছে: en.wikedia.org/wiki/Short-circuit_e মূল্যায়ন &&অপারেটরের মূল্যায়নের ক্ষেত্রে এটি একটি অপ্টিমাইজেশন ।
ওয়ার্লবেল

1
@ ভাইরবেল আমি বিশ্বাস করি এটিও প্রযোজ্য ||... কমপক্ষে এটি হওয়া উচিত।
রাদু মুর্জিয়া

1
নিবন্ধন করুন তুলনা ||এবং &&করতে &এবং |সূক্ষ্ম পার্থক্য দেখতে। একটি সহজ প্রোগ্রাম আছে মূল্যায়নের 1 || printf("yay");বনাম 0 || printf("yay");এবং 1 | printf("yay");বনাম 0 | printf("yay");differeces দেখতে
wirrbel

উত্তর:


35

সিতে সংক্ষিপ্ত সার্কিট হয় যখন লজিকাল অপারেটর তার সমস্ত যুক্তি মূল্যায়ন করে না।

উদাহরণস্বরূপ নিন এবং &&, এটি বেশ সুস্পষ্ট যে 0 && WhoCaresএটি যাই হোক না কেন মিথ্যা হতে চলেছে WhoCares। এ কারণে সি কেবল মূল্যায়ন এড়িয়ে যায় WhoCares। একই জন্য 1 || WhoCaresএটি সর্বদা সত্য হতে হবে। এই কারণে, আমরা কোড লিখতে পারেন

CanFireMissiles && FireMissiles()

এইভাবে আমরা কিছু সম্ভাব্য অসম্ভব অপারেশন করা এড়াতে চাই। আমরা যদি মিসাইল গুলি চালাতে না পারি তবে আমরা অবশ্যই চেষ্টা করতে চাই না। এটি সাধারণত পয়েন্টার, বিশেষত ফাইল পয়েন্টারগুলির সাথে ব্যবহৃত হয়।

 bool isN(int* ptr, int n){
     return ptr && *ptr == n;
 }

এটি অপ্রয়োজনীয় কম্পিউটিং এড়ানোর জন্য প্রচুর অন্যান্য দরকারী উপায়ে কাজ করে

 isFileReady() || getFileReady()

এটি আমাদের প্রয়োজন না হলে অতিরিক্ত কাজ করা এড়ানো হয়।


1
যে কোনও সময়, আমি যদি আপনার প্রশ্নের উত্তর দিয়েছি তবে আপনার উত্তর হিসাবে চিহ্নিত হিসাবে আপনি এটির পাশের চেকবক্সটি চেক করতে পারেন
ড্যানিয়েল গ্রেটজার

7
আমি ভালবাসি না CanFireMissiles && FireMissiles(), কারণ এটি সন্দেহজনক করে তোলে যে আপনি পার্শ্ব প্রতিক্রিয়াগুলি ট্রিগার করতে শর্ট সার্কিট ব্যবহার করছেন। আমি মনে করি আপনি শর্তাধীন ক্রিয়াগুলি গোপন করছেন। এই ধরনের কোড ভাল হিসাবে লেখা হয় if(CanFireMissiles){FireMissiles();}বা if(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}
ব্রায়ান

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

2
@jozefg আপনি ব্যয়বহুল ক্রিয়াকলাপগুলি রোধ করতেও এটি ব্যবহার করতে পারেন IsInCache(value) || IsInDatabase(value), যেখানে আইসএনডাটাবেস সময় নিতে পারে (বিশেষত যদি কোনও মোবাইল ডিভাইস এবং নেটওয়ার্ক ল্যাটেন্সি ব্যবহার করা কোনও সমস্যা)।
এমজিডব্লিউ 854

4

"শর্ট সার্কিট " সাধারণত " শর্ট সার্কিট মূল্যায়ন " বোঝায় যা সাধারণ ধারণা, কেবল সি নির্দিষ্ট নয়।

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

উদাহরণ:

while((x && y) == 1) {
    //This bit will not execute if x is 0 or y is 0 but y won't even be 
    //evaluated due to short circuit evaluation if x is 0.
}

আরও জটিল উদাহরণ:

if((a || b || c || d || e || f || g || h || i || j || k) == 1) {
    /* If any of these are equal to 1 the whole expression is equal to 1,
     * thus doesn't it make sense to short circuit evaluate this?
     * Saves a bunch of time.
     */
}

8
শর্ট সার্কিট করা সময় সাশ্রয়ের বিষয়ে কম তবে মূল্যায়ন না করা সম্পর্কে বেশি। কোন ফাংশন মূল্যায়ন করা হচ্ছে না তার পার্শ্ব প্রতিক্রিয়াও এটিকে মূল্যায়ণ করা হবে না।
পিটার বি

আপনি জানেন, এটি == 0কেবল অযৌক্তিক নয়, এটি সম্ভবত কিছু লোককে বিভ্রান্ত করতে পারে।
Deduplicator

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