क्या अंतर है | और || या ऑपरेटरों


300

मैंने हमेशा ||(# दो पाइप) OR या भाव में, C # और PHP दोनों में उपयोग किया है। कभी-कभी मुझे एक एकल पाइप का उपयोग होता दिखाई देता है |:। उन दो usages के बीच अंतर क्या है? जब कोई एक दूसरे का उपयोग कर रहा है या वे विनिमेय हैं तो क्या कोई चेतावनी है?

जवाबों:


488

ऑपरेटर &और &&ऑपरेटर की तरह , डबल ऑपरेटर "शॉर्ट-सर्किट" ऑपरेटर है।

उदाहरण के लिए:

if(condition1 || condition2 || condition3)

यदि कंडीशन 1 सत्य है, तो शर्त 2 और 3 की जाँच नहीं की जाएगी।

if(condition1 | condition2 | condition3)

यह शर्तों 2 और 3 की जांच करेगा, भले ही 1 पहले से ही सच हो। जैसे-जैसे आपकी शर्तें काफी महंगी हो सकती हैं, आप उनका उपयोग करके एक अच्छा प्रदर्शन बढ़ा सकते हैं।

वहाँ एक बड़ा चेतावनी, NullReferences या इसी तरह की समस्याएं हैं। उदाहरण के लिए:

if(class != null && class.someVar < 20)

यदि कक्षा अशक्त है, तो class != nullगलत होने के बाद यदि कथन बंद हो जाएगा । यदि आप केवल & का उपयोग करते हैं, तो यह जांचने की कोशिश करेगा class.someVarऔर आपको एक अच्छा मिलेगा NullReferenceException। Or-Operator के साथ ऐसा कोई जाल नहीं हो सकता है क्योंकि यह संभावना नहीं है कि आप कुछ बुरा ट्रिगर करें, लेकिन यह ध्यान में रखना है।

कोई भी कभी भी एकल &या |ऑपरेटरों का उपयोग नहीं करता है , जब तक कि आपके पास एक डिज़ाइन नहीं है जहां प्रत्येक स्थिति एक फ़ंक्शन है जिसे निष्पादित किया जाना है। एक डिजाइन गंध की तरह लगता है, लेकिन कभी-कभी (शायद ही कभी) यह सामान करने का एक साफ तरीका है। &ऑपरेटर "इन 3 कार्यों को चलाने, और यदि उनमें से एक झूठी देता है, किसी और ब्लॉक निष्पादित" करता है, जबकि |"केवल किसी और ब्लॉक चलाने से कोई भी वापसी झूठी अगर" करता है - उपयोगी हो सकता है, लेकिन जैसा कि कहा, अक्सर यह एक डिजाइन है गंध।

हालांकि |और &ऑपरेटर का दूसरा उपयोग है : बिटवाइज़ ऑपरेशंस


9
हाँ, मुझे विश्वास नहीं हुआ जब तक मैंने कंसोल ऐप नहीं बनाया - लेकिन अच्छा स्वामी! वे आपको खुद को फांसी देने के लिए रस्सी क्यों देंगे! मुझे लगता है कि VB.NET - OrElse और AndAlso कीवर्ड के बारे में नफरत है!
जारोड डिक्सन

24
लोगों को उपयोग करना सिखाना &और |सशर्त संचालकों के रूप में एक हैक है, और यदि उन्हें कभी भी C / C ++ का उपयोग करने की आवश्यकता होती है, तो वे उन्हें परेशानी में डालेंगे: 1 && 2यह सच है जबकि 1 & 2गलत है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

47
यह हैक नहीं है, यह धारा 7.10.3 बूलियन तार्किक ऑपरेटरों में सी # के लिए आधिकारिक तौर पर निर्दिष्ट है: "एक्स या वाई का परिणाम सही है अगर या तो एक्स या वाई सच है। अन्यथा, परिणाम गलत है।" धारा 7.11 सशर्त तार्किक ऑपरेटरों को भी देखें: "ऑपरेशन x || y, ऑपरेशन x | y से मेल खाता है, सिवाय इसके कि y का मूल्यांकन केवल तभी किया जाता है यदि x गलत है।" जो आगे "वैध करता है" | सशर्त संचालक के रूप में। और जो लोग C / C ++ का उपयोग करेंगे वे वैसे भी मुसीबत में पड़ जाएंगे जब वे बस आँख बंद करके मान लेंगे कि सामान समान रूप से काम करता है। जैसा कि कहा गया है: का उपयोग करना | अगर एक बयान में एक डिजाइन गंध है, लेकिन एक पूरी तरह से कानूनी ऑपरेशन।
माइकल Stum

9
मैंने कभी नहीं कहा कि यह कानूनी नहीं था, बस यह एक हैक है, जो यह है (आप &इसका अर्थ यह बताने के लिए इस्तेमाल कर रहे हैं कि इसके लगभग हमेशा मतलब के अलावा: बिटवाइज़-एंड)
ब्लूराजा - डैनी पफ्लुघोफ्ट

15
@ BlueRaja-DannyPflughoeft डॉक्यूमेंटेड फीचर को हैक कहते हैं जब डॉक्यूमेंट कहता है कि इसका इस्तेमाल करने का इरादा था, तो स्विच स्टेटमेंट "a aifif hack" का उपयोग करने जैसा है। उपकरण बॉक्स में इसका एक उपकरण, शायद ही कभी इस्तेमाल किया जाने वाला विशेषता उपकरण हो सकता है, लेकिन एक उपकरण कम होता है।
जेंट

80

|| तार्किक या ऑपरेटर है। ऐसा लगता है कि आप मूल रूप से जानते हैं कि क्या है। इसका उपयोग सशर्त विवरणों में किया जाता है जैसे कि, जबकि, आदि।

condition1 || condition2

या तो कंडीशन 1 या कंडीशन 2 सही है या नहीं।

| बिटवाइज़ या ऑपरेटर है। इसका उपयोग दो नंबरों पर काम करने के लिए किया जाता है। आप प्रत्येक संख्या के प्रत्येक बिट को व्यक्तिगत रूप से देखते हैं और, यदि बिट्स में से एक कम से कम संख्या में 1 है, तो परिणामी बिट 1 भी होगा। कुछ उदाहरण निम्नलिखित हैं:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

उम्मीद है कि समझ में आता है।

इसलिए पिछले दो सवालों का जवाब देने के लिए, मैं यह नहीं कहूंगा कि इसके अलावा "दोनों ऑपरेटरों के बीच अंतर पता है।" वे विनिमेय नहीं हैं क्योंकि वे दो पूरी तरह से अलग चीजें करते हैं।


इससे मुझे यह समझने में मदद मिली कि कैसे कोई मोंटॉड सी # ड्राइवर में फिल्टर मर्ज करने के लिए बिटवाइज या ऑपरेटर का उपयोग कर रहा था। gist.github.com/a3dho3yn/…
डोनी वी।

30

एक "बिटवाइज़ या" है।

10011 बी | 01000 बी => 11011 बी

दूसरा तर्क है या।

सत्य या असत्य => सत्य


2
|boolशॉर्ट सर्किटिंग के बिना प्रकारों पर भी इस्तेमाल किया जा सकता है ।
जुखर

14

अच्छा प्रश्न। ये दोनों ऑपरेटर PHP और C # में समान काम करते हैं।

|एक बिटवाइज़ है या। यह उनके बिट्स द्वारा दो मूल्यों की तुलना करेगा। जैसे 1101 | 0010 = 1111. बिट विकल्पों का उपयोग करते समय यह बेहद उपयोगी है। जैसे Read = 01 (0X01) Write = 10 (0X02) Read-Write = 11 (0X03)। एक उपयोगी उदाहरण फ़ाइलों को खोलना होगा। एक सरल उदाहरण होगा:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

||एक तार्किक OR है। यह वह तरीका है जो अधिकांश लोग OR के बारे में सोचते हैं और उनकी सच्चाई के आधार पर दो मूल्यों की तुलना करते हैं। जैसे मैं स्टोर जा रहा हूं या मैं मॉल जाऊंगा। यह एक कोड में सबसे अधिक इस्तेमाल किया जाता है। उदाहरण के लिए:

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

PHP संसाधन: http://us3.php.net/language.operators.bitwise

C # संसाधन: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


4
एफडब्ल्यूआईडब्ल्यू, तकनीकी रूप से, सी # |में एक तार्किक या जब बूलियन पर लागू होता है । जैसा कि आपके जुड़े संदर्भ बताता है। व्यवहार में, अंतिम परिणाम एक ही है जैसे कि यह एक बिटवाइज़ ऑपरेटर था, क्योंकि बिटवाइज़ के मान trueऔर falseऐसे होते हैं कि बिटवाइज़ या उनके मान एक तार्किक या करता है के समान सटीक परिणाम उत्पन्न करता है। वह (int)(bool1 | bool2)== है ((int)bool1) | ((int)bool2)
टूलमेकरसेव

4

जावा में सरल उदाहरण

public class Driver {

  static int x;
  static int y;

public static void main(String[] args) 
throws Exception {

System.out.println("using double pipe");
    if(setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }



System.out.println("using single pipe");
if(setX() | setY())
    {System.out.println("x = "+x);
    System.out.println("y = "+y);
    }

}

 static boolean setX(){
      x=5;
     return true;
  }
 static boolean setY(){
      y=5;
      return true;
  }
}

आउटपुट:

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5

2
आप एक प्रश्न के लिए एक जावा उदाहरण क्यों देंगे जिसमें जावा का उल्लेख भी नहीं है?
जुहेर

4

& - (कंडीशन 1 और कंडीशन 2): दोनों मामलों की जांच करता है, भले ही पहला झूठ हो

&& - (स्थिति 1 और& स्थिति 2): यदि मामला गलत है, तो दूसरे मामले की जाँच करने के लिए परेशान न हों

&& - ऑपरेटर आपके कोड को तेज़ी से चलाएगा, पेशेवर रूप से और शायद ही कभी उपयोग किया जाता है

| - (स्थिति 1 | स्थिति 2): यदि मामला सत्य है तो भी दोनों मामलों की जाँच करता है

|| - (स्थिति 1 || स्थिति 2): पहला मामला सच होने पर दूसरे मामले की जाँच करने के लिए परेशान न हों

|| - ऑपरेटर आपके कोड को तेज़ी से चलाएगा, पेशेवर रूप से | शायद ही कभी इस्तेमाल किया जाता है


2
rarely used? सभी इस बात पर निर्भर करते हैं कि आपको क्या चाहिए या क्या करना है।
एमबोरसा

1
महान! लघु और मधुर, मैं "को शायद ही कभी इस्तेमाल किया जाता है" और "शायद ही कभी इस्तेमाल किया जाता है" को हटा देगा क्योंकि, जैसा कि एमाबोर्सा ने कहा, इसका वास्तव में इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं या क्या करना है।
इकनॉमिक

0

एकल पाइप, |, बिटवाइज़ ऑपरेटरों में से एक है।

विकिपीडिया से:

सी प्रोग्रामिंग भाषा परिवार में, बिटवाइज़ या ऑपरेटर "है |" (पाइप)। फिर से, इस ऑपरेटर को अपने बूलियन "तार्किक या" समकक्ष के साथ भ्रमित नहीं होना चाहिए, जो अपने ऑपरेंड को बूलियन मान के रूप में मानता है और लिखा है "||" (दो पाइप)।


0

उनकी गणितीय परिभाषा के अनुसार, OR और AND बाइनरी ऑपरेटर हैं; वे LHS और RHS शर्तों की परवाह किए बिना सत्यापित करते हैं, इसी तरह से | तथा &।

|| LHS स्थिति पूरी नहीं होने पर && और उन्हें रोककर OR और ऑपरेटरों के गुणों में परिवर्तन करें।


-1

| ऑपरेटर एक बिटवाइंड या अपने दो ऑपरेंड करता है (जिसका अर्थ है कि दोनों पक्षों को इसके लिए असत्य का मूल्यांकन करना चाहिए ताकि वह गलत हो) ऑपरेटर को केवल दूसरे ऑपरेटर का मूल्यांकन करना होगा, अगर उसे इसकी आवश्यकता है।

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


यदि आप वास्तव में उन लेखों को पढ़ते हैं, तो आपने देखा होगा कि वे
बिटकॉइन

यही बिटवाइस का मतलब नहीं है।
जुखर

-1

सिंगल पाइप "|" "बिटवाइज़" है या इसका उपयोग केवल तब किया जाना चाहिए जब आपको पता हो कि आप क्या कर रहे हैं। डबल पाइप "||" एक तार्किक है या, और तार्किक कथनों में इस्तेमाल किया जा सकता है, जैसे "x == 0 || x == 1"।

यहाँ एक उदाहरण है कि बिटवाइज़ या क्या करता है: यदि a = 0101 और b = 0011, तो a | b = 0111 | यदि आप एक तर्क प्रणाली के साथ काम कर रहे हैं जो किसी भी गैर-शून्य को सच मानती है, तो बिटकॉइन या तार्किक या उसी तरह कार्य करेगा, लेकिन यह प्रतिपक्ष (बिटवाइज़ और, "और") नहीं होगा। इसके अलावा बिटवाइज़ या शॉर्ट सर्किट मूल्यांकन नहीं करता है।


'|' boolशॉर्ट सर्किटिंग के बिना प्रकारों पर भी इस्तेमाल किया जा सकता है ।
जुहेर

-2

एक एकल पाइप (!) बिटवाइज़ या ऑपरेटर है

दो पाइप (||) तार्किक या ऑपरेटर है।

वे विनिमेय नहीं हैं।


1
यदि आप बिटवाइज़ ऑपरेशन को अनदेखा करते हैं, तो डबल पाइप आलसी मूल्यांकन है और लॉजिकल ऑपरेटर क्षेत्र के भीतर सिंगल पाइप लालची है।
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.