दिलचस्प पोस्ट
जेएस में नियमित अभिव्यक्ति में कैरेट (^) और डॉलर का प्रतीक ($) की क्या आवश्यकता है? नोड एनपीएम विंडो फाइल पथ पैकेज़ को स्थापित करने के लिए बहुत लंबा हैं एएसपी.नेट वेब विधि और डब्ल्यूसीएफ सेवा के बीच अंतर क्या है? jqgrid: पीढ़ी के समय में सेल विशिष्ट सीएसएस वर्ग कैसे सेट करें मैं CoffeeScript के लिए Rails 3.1 में "-bare" विकल्प का उपयोग कैसे कर सकता हूं? क्यों async कीवर्ड मौजूद है IPython नोटबुक matplotlib प्लॉट इनलाइन कैसे करें क्या नियमित अभिव्यक्ति में एक काउंटर वेरिएबल की तरह कुछ है? एंड्रॉइड पर asynctask के साथ वेबदृश्य कोणीय में textarea मूल्य नहीं मिल सकता है मैं Google क्रोम एक्सटेंशन से मौजूदा टैब का यूआरएल कैसे प्राप्त करूं? अग्रगण्य डोपर लूप के कई आउटपुट सहेजे जा रहे हैं Json.NET कैश प्रकार 'serialization जानकारी है? क्या अजगर में HTTP PUT करने का कोई तरीका है Java.lang.String.replace समस्या के लिए संकेत?

त्रुटि: इस सरल सी कोड में आवश्यक लार्वेल? (असाइनमेंट के साथ टर्नरी?)

मेरे पास है :

#include<stdio.h> int main() { int a=5,b=6; (a>b)?b=a:b=b; // Here is the error return 0; } 

लेकिन अगर मैं प्रतिस्थापित करता हूं:

 (a>b)?b=a:b=b; // Error with (a>b)?(b=a):(b=b); // No-Error 

मैं समझता हूँ कि lvalue एक ऐसा मूल्य है जिसके लिए कुछ सौंपा जा सकता है और यह कैसे rvalue से अलग है, लेकिन extra parenthesis अंतर क्यों बना रहा है

Solutions Collecting From Web of "त्रुटि: इस सरल सी कोड में आवश्यक लार्वेल? (असाइनमेंट के साथ टर्नरी?)"

असाइनमेंट में टर्नेरी ऑपरेटर की तुलना में निम्न प्राथमिकता है, ताकि रेखा इस तरह मूल्यांकन करे:

 ((a>b)?b=a:b)=b; 

उपयोग:

 b=(a>b)?a:b; 

असल में, सी में, यह कोड

 (a>b)?b=a:b=b; 

कई कंपाइलर्स द्वारा पार्स किया जाता है

 ((a>b)?b=a:b)=b; 

जो एक त्रुटि है, अभिव्यक्ति के रूप में ((a>b)?b=a:b) एक रैवल्यू के लिए मूल्यांकन करता है जिसे आप b साथ असाइन करने का प्रयास करते हैं जो कि किसी त्रुटि में होता है। एक रवैया असाइन करने की कोशिश करना एक त्रुटि है अगर यह उस तरह पार्स नहीं किया जाता है, तो इसकी बस एक वाक्यविन्यास त्रुटि है। लेकिन एक सी संकलक को इसे पार्स करने की अनुमति नहीं है:

 ((a>b)?b=a:(b=b)); //not allowed to parse by C language 

चूंकि सी का व्याकरण एक कंपाइलर को ऊपर के कोड को पार्स करने की अनुमति नहीं देता है

लेकिन आपने जो लिखा है (मूल कोड) सी ++ के रूप में सही है

यहाँ सी और सी ++ के व्याकरण बहुत अलग हैं। और इस अंतर के कारण आप देखते हैं कि दोनों भाषाओं ने अभिव्यक्ति को अलग तरीके से व्यवहार किया है। यही है, the conditional expression in C++ the conditional expression in C से अलग the conditional expression in C

विकिपीडिया के पास इसके लिए बहुत अच्छी और सही व्याख्या है:

सी और सी ++ में ऑपरेटर की बाइंडिंग एक प्राथमिकता तालिका के बजाय, एक कारगर भाषा व्याकरण द्वारा (इसी मानकों में) निर्दिष्ट की गई है। यह कुछ सूक्ष्म संघर्ष बनाता है। उदाहरण के लिए, सी में, एक सशर्त अभिव्यक्ति के लिए वाक्यविन्यास है:

तार्किक-या-अभिव्यक्ति? अभिव्यक्ति: सशर्त-अभिव्यक्ति

जबकि सी ++ में यह है:

तार्किक-या-अभिव्यक्ति? अभिव्यक्ति: असाइनमेंट-अभिव्यक्ति

इसलिए, अभिव्यक्ति:

ई = एक <डी? ए ++: ए = डी

दो भाषाओं में अलग ढंग से पार्स किया जाता है। सी में, यह अभिव्यक्ति एक वाक्यविन्यास त्रुटि है, लेकिन कई compilers इसे पार्स करते हैं:

ई = ((एक <डी? ए ++: ए) = डी)

जो एक सिमेंटिक त्रुटि है, क्योंकि सशर्त-अभिव्यक्ति के परिणाम (जो कि ++ हो सकता है) एक लावलू नहीं है। सी ++ में, इसे पार्स किया जाता है:

ई = (एक <डी? ए ++: (ए = डी))

जो एक वैध अभिव्यक्ति है

यह वाकई:

 ((a>b)?b=a:b)=b; 

नोट: आपको बस चाहिए

 b = (a>b)?a:b; 

जब हम कोष्ठक में समीकरण लगाया जाता है तो इसे अभिव्यक्ति के रूप में माना जाता है और यह कुछ मान देता है जो त्रुटि का समाधान प्रदान करता है।