2008-08-29 14 views
231

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

उत्तर

380

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

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

if(condition1 || condition2 || condition3) 

तो CONDITION1 सच है, हालत 2 और 3 जाँच नहीं किये जाएंगे।

if(condition1 | condition2 | condition3) 

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

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

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

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

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

| और & ऑपरेटर का दूसरा उपयोग है हालांकि: Bitwise Operations

+42

यकीन नहीं है कि यह क्यों कम हो रहा है - यह सही है! यदि आप उसे विश्वास नहीं करते हैं तो इसे अपने कंपाइलर में दो बार जांचें! –

+8

हाँ, जब तक मैंने कंसोल ऐप नहीं बनाया तब तक मुझे विश्वास नहीं था - लेकिन अच्छा भगवान! वे आपको खुद को लटका देने के लिए रस्सी क्यों देंगे! मुझे उस वीबीएनईटी के बारे में नफरत है - ऑरेल और एंड एलो कीवर्ड! –

+1

इन आदेशों की शॉर्ट-सर्किट प्रकृति से प्यार करें! मैं पहली बार सफल होने पर दूसरी बार निष्पादित करने के लिए इसका उपयोग करता हूं, उदाहरण के लिए एक शून्य-ऑब्जेक्ट चेक: यदि (myObj! = Null && myObj.resultCode == 0) कंसोल। राइटलाइन ("यय!") ; – joshperry

26

एक "bitwise या" है।

10011b | 01000b => 11011b

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

सच या गलत => सत्य

0

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

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

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

+0

आप वास्तव में उन लेखों को पढ़ने के हैं, तो आप देखा होगा कि वे ऑपरेटरों – johnc

0

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

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

-1

एक एकल पाइप (|) bitwise OR operator है।

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

वे विनिमय नहीं कर सकते हैं।

+0

बिटवाइज़ करने के लिए आप बिटवाइज़ आपरेशन ध्यान नहीं देते हैं बात कर रहे हैं, डबल पाइप आलसी मूल्यांकन और एकल पाइप लालची है, तार्किक ऑपरेटर क्षेत्र के भीतर है। – Alex

-1

|| (दो पाइप) आमतौर पर तार्किक या जबकि | (एक पाइप) बाइनरी या है। मेरे सिर के ऊपर से, मैं किसी भी समय अंतर नहीं सोच सकता कि अंतर एक बड़ा गॉचा होगा (जब आप किसी और चीज को परिणाम दे रहे हों)। हालांकि मुझे यकीन है कि किसी और के पास ऐसी स्थिति होगी जहां यह मायने रखता है।

संपादित करें: वाह, छह अन्य उत्तरों ने मुझे यह लिखने के लिए लिया था।

66

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

condition1 || condition2 

सही का आकलन करता है, तो या तो CONDITION1 या CONDITION2 सच है।

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

A = 01010101 
B = 10101010 
A | B = 11111111 

A = 00000001 
B = 00010000 
A | B = 00010001 

A = 10001011 
B = 00101100 

A | B = 10101111 

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

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

10

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

| थोड़ा सा है या। यह दो बिटों की तुलना उनके बिट्स से करेगा। जैसे 1101 | 0010 = 1111. बिट विकल्प का उपयोग करते समय यह बेहद उपयोगी है। जैसे पढ़ें = 01 (0x01) लिखें = 10 (0x02) पढ़ने-लिखने = 11 (0x03)। एक उपयोगी उदाहरण फाइलें खोलना होगा। एक साधारण उदाहरण होगा:

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

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

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

पीएचपी संसाधन: http://us3.php.net/language.operators.bitwise

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

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

+0

FWIW, तकनीकी रूप से, सी # '| में ** ** ** लॉजिकल या ** ** बूलियन पर लागू होने पर **। जैसा कि आपके लिंक किए गए संदर्भ बताते हैं। व्यावहारिक रूप से, अंतिम परिणाम वही होता है जैसे कि यह थोड़ा सा ऑपरेटर था, क्योंकि 'सत्य' और 'झूठी' के बिटवाइज मान इस प्रकार हैं कि थोड़ा सा या उनके मान तार्किक या करता है। वह '(int) है (bool1 | bool2)' == '((int) bool1) | ((Int) bool2) '। – ToolmakerSteve

1

एकल पाइप, |, bitwise ऑपरेटरों में से एक है।

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

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

-1

बिटवाई (|) बनाम तार्किक (||)! जावा में तुलनात्मक वस्तुओं के रूप में तार्किक के बारे में सोचें, कुछ अलग-अलग "भागों" की तुलना करें, जबकि बिटवाई ऑपरेटर इन ऑब्जेक्ट्स को देखता है और यह देखने के बजाय कि वे दृष्टिहीन जुड़वां हैं (लॉजिकल करता है), डीएनए नमूना करता है और 0 और इसके बजाय 1 है।

3

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

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 
0

उनके गणितीय परिभाषा के अनुसार, या तथा और द्विआधारी ऑपरेटरों कर रहे हैं; वे एलएचएस और आरएचएस शर्तों को ध्यान में रखते हुए, समान रूप से | और &।

|| और & & एलएचएस स्थिति पूरी होने पर उन्हें रोककर OR और AND ऑपरेटरों के गुणों को बदल दें।

1

& - (स्थिति 1 & स्थिति 2): चेकों दोनों ही मामलों भले ही पहले एक झूठ है

& & - (स्थिति 1 & & स्थिति 2): dosen't दूसरे मामले की जांच करने के मामले एक अगर परेशान गलत है

& & - ऑपरेटर अपने कोड रन तेजी से कर देगा, पेशेवर & शायद ही कभी इस्तेमाल किया जाता है

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

|| - (हालत 1 || शर्त 2): यदि पहले एक सत्य है

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

संबंधित मुद्दे