2016-02-19 12 views
5

में नेस्टेड टर्नरी-ऑपरेटर एसोसिएटिविटी, इसलिए, मैंने बस this blog post पढ़ा है, और मैं "टर्नरी-ऑपरेटर बाएं-सहयोगी" भाग से उलझन में था, इसलिए मैंने वहां एक उदाहरण कोड चलाया- एक दुभाषिया में:PHP बनाम जावा

$arg = 'T'; 
$vehicle = (($arg == 'B') ? 'bus' : 
      ($arg == 'A') ? 'airplane' : 
      ($arg == 'T') ? 'train' : 
      ($arg == 'C') ? 'car' : 
      ($arg == 'H') ? 'horse' : 
      'feet'); 
echo $vehicle; 

और वास्तव में, यह horse देता है जो कि ब्लॉग पोस्ट में बिंदु-अंतर्दृष्टि है।

जिज्ञासा से, मैंने फिर "बाएं-सहयोगी" को जो भी सोचा था, उसे फिट करने के लिए इसे फिर से लिखकर "यह काम करने" की कोशिश की। मुझे मिल गया इस (स्वरूपण अजीब है, लेकिन यह मेरे सिर में यह कम से कम साफ करता है):,

$arg = 'T'; 
$vehicle = (($arg != 'B') ? 
       ($arg != 'A') ? 
        ($arg != 'T') ? 
         ($arg != 'C') ? 
          ($arg != 'H') ? 
           'feet' : 
          'horse' : 
         'car' : 
        'train' : 
       'airplane' : 
      'bus' 
); 
echo $vehicle; 

अब इस अर्थ में कि क्या कभी चरित्र $arg है वाहन है कि उस चरित्र के साथ शुरू होता रिटर्न में अपेक्षा के अनुरूप काम करता है (पाठ्यक्रम का निचला मामला, लेकिन यह यहां महत्वपूर्ण नहीं है)।

उत्सुक अभी भी, क्योंकि मैं स्पष्ट नहीं हूं कि पूर्व क्यों काम नहीं करता है, मुझे आश्चर्य हुआ कि बाद वाला सही-सहयोगी भाषा में विफल हो जाएगा, क्योंकि ऐसा लगता है कि ऐसा नहीं होगा। तो मैंने इसे जावा दुभाषिया में परीक्षण किया। यहां किसी भी व्यक्ति के लिए कोड जो कुछ सेकंड को आजमाकर सहेजना चाहता है।

class Main { 
    public static void main(String[] args) { 


    Character arg = 'a'; 
    String vehicle = ((arg == 'B') ? "bus" : 
         (arg == 'A') ? "airplane" : 
         (arg == 'T') ? "train" : 
         (arg == 'C') ? "car" : 
         (arg == 'H') ? "horse" : 
         "feet"); 
    System.out.println(vehicle); 
    vehicle = ((arg != 'B') ? 
        (arg != 'A') ? 
         (arg != 'T') ? 
          (arg != 'C') ? 
           (arg != 'H') ? 
           "feet" : 
          "horse" : 
         "car" : 
        "train" : 
       "airplane" : 
      "bus" 
    ); 
    System.out.println(vehicle); 
    } 
} 

दोनों प्रारूप जावा में काम करते हैं। तो, PHP में क्या देता है? मैंने सुना है कि यह अनिवार्य रूप से अंतिम बराबर ($arg == 'H') के रूप में अग्रणी समानता का मूल्यांकन कर रहा है। लेकिन यदि हां, तो इसका मतलब यह है कि यह

$vehicle = ((($arg == 'B') || ($arg == 'A') || ($arg == 'T') || 
      ($arg == 'C') || ($arg == 'H')) ? 'horse' : 'feet'); 

यह मुझे समझ में नहीं आता है। दूसरे PHP उदाहरण में मैंने दिया, मैं केवल if false भाग के बजाय, if true टर्नरी अभिव्यक्ति के भाग में घोंसला चलाता हूं, जहां केवल समानताएं चली जाती हैं। मैं नहीं देखता कि दूसरी विधि अगर पहली विधि काम नहीं करेगी। ऐसा लगता है कि "यह कैसे काम करना चाहिए" की बजाय एक त्रुटि की तरह लगता है, और मैं केवल चीजों की गलत व्याख्या कर रहा हूं, जो मुझे होना चाहिए।

नोट: मुझे पता है कि मैं अभिव्यक्ति को जिस तरह से चाहता हूं उसका आकलन करने के लिए मजबूर करने के लिए चीजों के चारों ओर कोष्ठक लपेट सकता हूं (जो स्पष्ट रूप से सही सहयोगी है)। मैं "यह काम कैसे करना है" की तलाश नहीं कर रहा हूं, मैं जानना चाहता हूं कि ऐसा क्यों नहीं है।

उत्तर

2

बाएं बनाम सही-सहयोगी एक साथ कई ऑपरेटरों को स्ट्रिंग करते समय प्राथमिकता के बारे में है, उदा। A + B + C

त्रिगुट ऑपरेटर A ? B : C लिए, यह केवल अर्थ नहीं है जब अतिरिक्त त्रिगुट ऑपरेटर बदल देता C हिस्सा (या A भाग):

A ? B : X ? Y : Z 
(A ? B : X) ? Y : Z <-- left-associative (PHP) 
A ? B : (X ? Y : Z) <-- right-associative (Java, C, C++, C#, Perl) 

अतिरिक्त त्रिगुट ऑपरेटर बीच में डाला जाता है तो (B की जगह) , इसका केवल एक अर्थ हो सकता है:

A ? X ? Y : Z : C 
A ? (X ? Y : Z) : C 

यही कारण है कि PHP और Java दूसरे पर सहमत हैं। कोई बाएं/दाएं-सहयोगी नियम लागू नहीं है।

+0

ओह, मुझे लगता है कि मैं देखता हूं। चूंकि 'एक्स'' 0' नहीं है या कुछ भी जो 'झूठी' का मूल्यांकन करता है, अंतिम मूल्यांकन तब वाई है। इसलिए पहले मामले में, '$ arg == 'बी'' false' है ... '$ arg == 'ए' 'झूठा' है ...' $ arg == 'टी' 'सत्य 'है ...' ट्रेन'' सत्य 'का मूल्यांकन करता है ... 'कार'' सत्य 'का मूल्यांकन करता है। .. अंतिम मूल्य 'घोड़ा' है? –

+0

@MiaoLiu आपको यह मिला। --- निष्कर्ष: बाएं-सहयोगी टर्नरी ऑपरेटर एक बहुत ही खराब डिजाइन है। या [लिंक किए गए ब्लॉग] को सारांशित करने के लिए (http: // eev।ईई/ब्लॉग/2012/04/09/php-a-fractal-of-bad-design /): * PHP खराब डिज़ाइन * है। दूर रहो। – Andreas

+0

तो इसका मतलब है, जावा के तहत, सबसे गहरा घोंसला हुआ टर्नरी का मूल्यांकन पहले किया जाता है, फिर उस अभिव्यक्ति का परिणाम बाहरी अभिव्यक्ति के वापसी मानों में से एक के रूप में उपयोग किया जाता है। फिर बाहरी अभिव्यक्ति का मूल्यांकन किया जाएगा और इसका वापसी मूल्य अगले बाहरी कथन आदि के लिए उपयोग किया जाता है। सही? – Ungeheuer

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