2016-01-30 5 views
5
#include <stdio.h> 
int main() 
{ 
    int a=3,b=4,g; 
    a > b ? g = a : g = b ; 
    printf("%d",g); 
    return 0; 
} 

g का मूल्य क्यों मुद्रित नहीं होता है? और कंपाइलर कहते हैं lvalue आवश्यक है। इसका क्या मतलब है?सी टर्नरी अभिव्यक्ति-कथन काम नहीं कर रहा

+1

आपको 'ए> बी' बदलना होगा? जी = ए: जी = बी; 'से' जी = ए> बी? ए: बी; 'या' ए> बी? जी = ए: (जी = बी); ' – pouyan

उत्तर

15

ऑपरेटर ?: के उच्च पूर्वता के कारण = से अधिक, अभिव्यक्ति

a > b ? g = a : g = b; 

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

अभिव्यक्ति (a > b ? g = a : g) के रूप में पार्स किया जाएगा एक rvalue दे देंगे। असाइनमेंट (=) ऑपरेटर के बाईं संकार्य एक lvalue (परिवर्तनीय ) होना चाहिए।

बदलें

a > b ? g = a : g = b ; 

को
a > b ? (g = a) : (g = b);  

या

g = a > b ? a : b; 

। सी 11-§6.5.16/2: एक असाइनमेंट ऑपरेटर के पास बाएं ऑपरेंड के रूप में एक संशोधित अंतराल होगा।
। §6.3.2.1/1: एक लाभा एक अभिव्यक्ति (शून्य के अलावा किसी ऑब्जेक्ट प्रकार के साथ) है जो संभावित रूप से किसी ऑब्जेक्ट को निर्दिष्ट करता है; 64) यदि कोई लालसा किसी वस्तु को मूल्यांकन करते समय निर्दिष्ट नहीं करता है, तो व्यवहार अपरिभाषित होता है। जब किसी ऑब्जेक्ट को किसी विशेष प्रकार के रूप में कहा जाता है, तो ऑब्जेक्ट को निर्दिष्ट करने के लिए उपयोग किए गए लवल द्वारा निर्दिष्ट किया जाता है। एक संशोधित अंतराल एक अंतराल है जिसमें सरणी प्रकार नहीं है, इसमें अपूर्ण प्रकार नहीं है, इसमें कोई कॉन्स्ट-क्वालिटी प्रकार नहीं है, और यदि यह संरचना या संघ है, तो इसमें कोई सदस्य नहीं है (जिसमें, रिकर्सिव, कोई भी शामिल है) सभी निहित समेकित या संघों का सदस्य या तत्व) एक कॉन्स-क्वालिफाइड प्रकार के साथ।

+0

क्या आप अपनी लाइन को समझा सकते हैं: -" बाएं ऑपरेंड का = ऑपरेटर एक लवल (संशोधित) होना चाहिए।" – sgewraks

+0

@sam;" lvalue "और" modifiable lvalue "के बारे में कुछ विवरण जोड़े गए। – haccks

0
  • बस अपने को बदल दें:

    a > b ? g = a : g = b ; 
    

    a > b ? (g = a) : (g = b) ; 
    
  • क्योंकि कोष्ठकों के precedance है साथ higher.So अगर हालत a > b सच बन जाता है तो एक के मान को असाइन किया गया जी और यदि यह विफल रहता है तो बी का मान जी को असाइन किया जाता है।

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