2013-04-08 9 views
7

मुझे सी 11 विनिर्देश तक पहुंच नहीं है, इसलिए मैं इस बग की जांच नहीं कर सकता।एक टर्नरी ऑपरेटर के साथ ऐरे प्रारंभिकरण?

निम्नलिखित घोषणा संकलन के दौरान एक त्रुटि बढ़ जाता है:

int why[2] = 1 == 1 ? {1,2} : {3,4}; 

त्रुटि है: पहले की उम्मीद अभिव्यक्ति {और: उम्मीद अभिव्यक्ति से पहले:

+2

क्या आपने यह कोशिश की है: int क्यों [2] = (1 == 1)? {1,2}: {3,4}; – luckystars

+3

हां: इससे कोई फर्क नहीं पड़ता –

+0

यह सरणी प्रारंभिकरण के वाक्यविन्यास में मौजूद नहीं है। – BLUEPIXY

उत्तर

9

यह वैध C11 नहीं है।

आप केवल एक सरणी प्रारंभ कर सकते हैं जिसमें एक अभिव्यक्ति के साथ प्रारंभकर्ता-सूची नहीं है।

int why[2] = { ... }; // initializer-list {} 

इसके अलावा, 1 == 1 ? {1,2} : {3,4} एक वैध सी अभिव्यक्ति क्योंकि {1, 2} एक सी अभिव्यक्ति नहीं है नहीं है।

बस यौगिक शाब्दिक का उपयोग कर आप क्या आप एक सूचक वस्तु का उपयोग कर चाहते हैं उसके पास कुछ हो सकता है के बारे में जानकारी के लिए: चार्ल्स बेली जवाब यहाँ से

int *why = (1 == 1) ? (int[2]) {1,2} : (int[2]) {3,4}; 
+0

यह काम करता है: 'int works = 1 == 1? 42: 6 * 7; ' –

+1

@ रुडीरूसल हाँ, वह वैध है लेकिन यहां '{1, 2}' अभिव्यक्ति नहीं है और 'कार्य' एक सरणी नहीं है। – ouah

+1

@ रूडीरूसल: अभिव्यक्ति मूल्यों के साथ चीजें हैं। '6 * 7' का मूल्य है। प्रारंभकर्ता सूचियां अभिव्यक्ति नहीं हैं; ऑब्जेक्ट पर प्रारंभ होने पर ऑब्जेक्ट में कई मानों को वर्णित करने के लिए वे केवल एक वाक्यविन्यास हैं। स्रोत कोड '{1, 2} 'एक मान या वस्तु या कुछ भी नहीं है जिसे आप कुशल बना सकते हैं। यह सिर्फ एक वर्णन है कि एक सरणी में क्या रखा जाए। क्योंकि यह अभिव्यक्ति नहीं है, आप इस पर काम नहीं कर सकते; आप इसे 'ऑपरेशन' के रूप में उपयोग नहीं कर सकते हैं? : 'या अन्य ऑपरेटरों के लिए। –

2

: Gramma from conditional-expression

conditional-expression: 
     logical-OR-expression 
     logical-OR-expression ? expression : conditional-expression 

और

1 == 1 ? {1,2} : {3,4}; 
     ^ ^  are not expressions 

यही वजह है कि संकलक त्रुटि देता है:

error: expected expression before ‘{’ token // means after ? 
error: expected expression before ‘:’ token // before : 

संपादित @Rudi रसेल के रूप में टिप्पणी की:

int main(){ 
    {} 
    ; 
    {1,2;} 
} 

हम {} का उपयोग सी

में

बयान ; गठबंधन करने के लिए:

निम्नलिखित ग में एक मान्य कोड है नोट: यदि मैं {1,2} लिखता हूं तो यह एस त्रुटि (*expected ‘;’ before ‘}’ token*), क्योंकि 1,2 एक अभिव्यक्ति है लेकिन एक बयान नहीं है।

ओपी के लिए: क्या The Expression Statement in C है और क्या Block Statement और Expression Statements

EDIT2 है:
नोट: कैसे @ouah typecase का उपयोग करता है यह अभिव्यक्ति में परिवर्तित करने, हाँ:

इस कोड को चलाने को समझने के लिए:

int main(){ 
printf("\n Frist = %d, Second = %d\n",((int[2]){1,2})[0],((int[2]) {1,2})[1]); 
} 

ऐसा लगता है कि काम करता है:

~$ ./a.out 

Frist = 1, Second = 2 
+0

मेरी समझ के लिए: अभिव्यक्ति नहीं होने पर '{1,2}' क्या है? –

+0

@ रूडीरसेल ने अपने ब्लॉक '{}' पाठ्यक्रम के बयान को गठबंधन करने के लिए –

+1

@ रुडीरसेल: '{1, 2}' प्रारंभकर्ता है। यह 2011 सी मानक के खंड 6.7 में वर्णित है। अभिव्यक्तियों को एक अलग खंड, 6.5 में वर्णित किया गया है। –

0

प्रारंभकर्ता सूचियां अभिव्यक्ति नहीं हैं, इसलिए इन्हें अभिव्यक्तियों में उपयोग नहीं किया जा सकता है।

मेरा सुझाव है कि आप सरणी को अनियंत्रित करें और memcpy का उपयोग करें।

int why[2]; 
memcpy(why, 1 == 1 ? (int[2]){1,2} : (int[2]){3,4}, sizeof why); 
संबंधित मुद्दे