तार्किक संचालक, || या या?


104

मुझे याद है कि लॉजिकल ऑपरेटर्स के संबंध में कुछ समय पहले पढ़ना था कि ORइस्तेमाल करने के मामले में (या इसके विपरीत) ||बेहतर था or

मुझे बस अपने प्रोजेक्ट में इसका उपयोग करना था जब यह मेरे पास वापस आया, लेकिन मुझे याद नहीं है कि किस ऑपरेटर की सिफारिश की गई थी या अगर यह सच था।

कौन सा बेहतर है और क्यों है?

जवाबों:


139

कोई "बेहतर" नहीं है, लेकिन अधिक आम है ||। उनकी अलग-अलग मिसालें हैं और ||वे काम करेंगे जैसे एक सामान्य रूप से उम्मीद करेंगे।

यह भी देखें: लॉजिकल ऑपरेटर्स ( निम्न उदाहरण वहां से लिया गया है ):

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;

11
और शॉर्ट-सर्किटिंग के कारण $e = true || $x = 'foo'परिभाषित नहीं होगा $x, न कि उच्च पूर्वता के कारण।
मैट कीरन

1
यह भी ध्यान देने योग्य है कि ये हमेशा कई अन्य भाषाओं के विपरीत बूलियन मान लौटाते हैं, जहां वे अंतिम मान की जाँच करते हैं। तो PHP में (27 || 0) सही है , 27 नहीं ।
टेक्सगेक सेप

@TextGeek, "ये"? मेरे लिए 27 or 0लौटता 27है।
जैंसिस एल्मेरिस

@ जानिस एल्मेरिस - आप सही हैं, मुझे केवल "" का उल्लेख करना चाहिए था। मामला।
TextGeek

2
@TextGeek, वास्तव में, आप सही हैं कि orबूलियन भी देता है। बस इसकी पूर्वता इतनी कम है कि यह कभी-कभी ऐसा लगता है कि यह कुछ और करता है। :) print 27 or 0प्रिंट होता है 27क्योंकि बादor होता है । BTW, मूर्ख नहीं है - उत्पादन होगा । print 27echoecho 27 or 01
जानिस एल्मेरिस

43

उनका उपयोग विभिन्न उद्देश्यों के लिए किया जाता है और वास्तव में अलग-अलग ऑपरेटर की प्राथमिकताएं होती हैं। &&और ||ऑपरेटरों, बूलियन स्थितियों के लिए करना है, जबकि andऔर orनियंत्रण प्रवाह के लिए करना है।

उदाहरण के लिए, निम्नलिखित बूलियन स्थिति है:

if ($foo == $bar && $baz != $quxx) {

यह नियंत्रण प्रवाह से अलग है:

doSomething() or die();

die()फ़ंक्शन को बुलाया doSomething()जाएगा यदि वापस आ जाएगी falseया null? अगर doSomething()रिटर्न trueया कुछ नहीं तो क्या ?
गियान्निस क्रिस्टोफाकिस

5
doSomething()एक बूलियन के रूप में मूल्यांकन किया जाता है। यदि यह एक मान लौटाता है तो PHP सत्य ( trueएक गैर-रिक्त स्ट्रिंग, आदि) पर विचार करता है, यह कॉल नहीं करेगा die()
मैथ्यू रत्ज़ोल्फ

23

क्रमशः अंतर || और और && और AND ऑपरेटर पूर्वता है :

$bool = FALSE || TRUE;

  • के रूप में व्याख्या की ($bool = (FALSE || TRUE))
  • का मूल्य $boolहैTRUE

$bool = FALSE OR TRUE;

  • के रूप में व्याख्या की (($bool = FALSE) OR TRUE)
  • का मूल्य $boolहैFALSE

$bool = TRUE && FALSE;

  • के रूप में व्याख्या की ($bool = (TRUE && FALSE))
  • का मूल्य $boolहैFALSE

$bool = TRUE AND FALSE;

  • के रूप में व्याख्या की (($bool = TRUE) AND FALSE)
  • का मूल्य $boolहैTRUE

5

स्रोत: http://wallstreetdeveloper.com/php-logical-operators/

तार्किक ऑपरेटरों के साथ काम करने के लिए यहाँ नमूना कोड है:

<html>

<head>
    <title>Logical</title>
</head>

<body>
    <?php
        $a = 10;
        $b = 20;
        if ($a>$b)
        {
            echo " A is Greater";
        }
        elseif ($a<$b)
        {
            echo " A is lesser";
        }
        else
        {
             echo "A and B are equal";
        }
    ?>
    <?php
        $c = 30;
        $d = 40;
        //if (($a<$c) AND ($b<$d))
        if (($a<$c) && ($b<$d))
        {
            echo "A and B are larger";
        }
        if (isset($d))
            $d = 100;
        echo $d;
        unset($d);
    ?>
    <?php
        $var1 = 2;
        switch($var1)
        {
            case 1:  echo "var1 is 1";
                     break;
            case 2:  echo "var1 is 2";
                     break;
            case 3:  echo "var1 is 3";
                     break;
            default: echo "var1 is unknown";
        }
    ?>
</body>
</html>

लिंक टूट गया है।
पीटर मोर्टेंसन

2

मुझे पता है कि यह एक पुराना विषय है लेकिन फिर भी। मैं सिर्फ उस कोड में समस्या से मिला हूं जिसे मैं काम पर डिबग कर रहा हूं और हो सकता है कि किसी को भी इसी तरह का मुद्दा हो ...

मान लीजिए कि कोड इस तरह दिखता है:

$positions = $this->positions() || [];

आप उम्मीद करेंगे (जैसे कि आप जावास्क्रिप्ट से उपयोग किए जाते हैं) कि जब $ यह-> स्थिति () गलत या अशक्त देता है, तो $ स्थिति खाली सरणी है। लेकिन ऐसा नहीं है। मान TRUE है या FALSE इस बात पर निर्भर करता है कि यह कितना $ है -> स्थिति () रिटर्न।

यदि आपको $ इस-> पदों () या खाली सरणी का मूल्य प्राप्त करने की आवश्यकता है, तो आपको उपयोग करना होगा:

$positions = $this->positions() or [];

संपादित करें:

ऊपर के उदाहरण के रूप में नहीं काम करता है, लेकिन सच्चाई यह है कि है ||और orएक ही नहीं है ... इस प्रयास करें:

<?php

function returnEmpty()
{
  //return "string";
  //return [1];
  return null;
}

$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];

var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";

यह परिणाम है:

bool(false)
NULL
array(0) {
}

तो, वास्तव में तीसरा विकल्प ?:सही समाधान है जब आप लौटे मूल्य या खाली सरणी सेट करना चाहते हैं।

$positions = $this->positions() ?: [];

PHP 7.2.1 के साथ परीक्षण किया गया


यह गलत जवाब है, दूसरा उदाहरण ठीक एक के रूप में काम करता है
WayFarer

@WayFarer अच्छी तरह से, यह सही नहीं है (एक मुद्दा है) लेकिन आप भी गलत हैं ((और या एक ही नहीं है) - मेरा संपादन देखें
Zdeněk

सही, ऑपरेटरों || और 'या' की अलग प्राथमिकता है, इसलिए, आपका दूसरा उदाहरण इस तरह काम करता है: (($ सेकंड = रिटर्नइम्टी ()) या []); तो, मूल प्रश्न का उत्तर होगा || बेहतर है, हमेशा इसका उपयोग करें, जब तक आप वास्तव में यह नहीं समझते कि आप 'या' का उपयोग क्यों करना चाहते हैं
WayFarer

1
$positions = $this->positions() ?? [];संभावना है कि आप क्या चाहते हैं।
बिशप

0

मुझे नहीं लगता कि एक स्वाभाविक रूप से एक दूसरे से बेहतर है, लेकिन मैं इसके साथ चिपके रहने का सुझाव दूंगा || क्योंकि यह अधिकांश भाषाओं में डिफ़ॉल्ट है।

संपादित करें: जैसा कि दूसरों ने बताया है कि वास्तव में दोनों के बीच अंतर है।


0

कुछ भी बुरा या बेहतर नहीं है, यह सिर्फ ऑपरेटरों की पूर्वता पर निर्भर करता है। चूंकि ||इसकी पूर्वता अधिक है or, इसलिए ||इसका ज्यादातर उपयोग किया जाता है।


-3

कुछ भाषाएं शॉर्ट-सर्किट का उपयोग करती हैं, और अन्य पूर्ण बूलियन मूल्यांकन का उपयोग करते हैं (यदि आप जानते हैं, यह $Bपास्कल में निर्देश के समान है )।

स्पष्टीकरण:

function A(){
    ...Do something..
    return true;
}

function B(){
    ...Do something..
    return true;
}

if ( A() OR B() ) { .....

इस उदाहरण में फ़ंक्शन B()को कभी भी निष्पादित नहीं किया जाएगा। चूंकि फ़ंक्शन A()TRUE देता है, इसलिए OR कथन का परिणाम अभिव्यक्ति के दूसरे भाग का मूल्यांकन करने के लिए आवश्यक होने के बिना पहले भाग से जाना जाता है।

हालांकि ( A() || B() ), दूसरे भाग का मूल्यांकन हमेशा पहले के मूल्य की परवाह किए बिना किया जाता है।

अनुकूलित प्रोग्रामिंग के लिए, आपको हमेशा उपयोग करना चाहिए ORजो तेज है (मामले के अलावा जब पहला भाग वापस आता है falseऔर दूसरे भाग को वास्तव में मूल्यांकन करने की आवश्यकता होती है)।


यह 'द बेस्ट आंसर !!' नहीं है। कृपया अच्छे से स्पष्टीकरण के लिए सबसे पहले मतदान करें और उत्तर दें। के साथ ||, Bनहीं बुलाया जाएगा। दोनों ऑपरेटर बिल्कुल वैसा ही करते हैं, सिवाय इसके कि पूर्ववर्तीता भिन्न हो।
बेज़मैन

"आपको हमेशा उपयोग करना चाहिए या जो तेज है" हम्म, मुझे आश्चर्य है कि अगर यह सच है ... तो चलिए देखते हैं कि: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs ओपकोड की संख्या है वही। इसलिए यह प्रदर्शन के लिहाज से महत्वपूर्ण नहीं है।
जेन्स ए। कोच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.