2010-07-30 8 views
6

मैं निम्नलिखित कार्यक्रम के उत्पादन में समझ में नहीं आता:कृपया && और || की प्राथमिकता के बीच एक स्पष्ट संघर्ष की व्याख्या करें और एक अभिव्यक्ति की वास्तविक परिणाम

#include<stdio.h> 

int main() 
{ 
    int i=-3, j=2, k=0, m; 
    m = ++i || ++j && ++k; 
    printf("%d %d %d %d\n", i, j, k, m); 
    return 0; 
} 

उत्पादन -2 2 0 1-2 3 1 1 के बजाय, है जिसका अर्थ है कि ++i मूल्यांकित किया गया था (और छोटी को || ऑपरेटर की वजह से अभिव्यक्ति ++j && ++k अभिव्यक्ति से पहले सर्किट का दायां हाथ) सर्किट इस तथ्य के विपरीत है कि && ऑपरेटर || से अधिक प्राथमिकता है।

क्या कोई बताएगा क्यों?

+1

मीटर का प्रकार क्या है? –

+0

मीटर पूर्णांक प्रकार मैं anwer पता है ... मैं explaination की जरूरत क्यों k = 0 – anurag

+4

'j' है और' k' वृद्धि कभी नहीं रहे हैं, क्योंकि अभिव्यक्ति का वह हिस्सा शॉर्ट सर्किट है। '++ i' सत्य है, इसलिए बाकी अभिव्यक्ति का मूल्यांकन नहीं किया जाता है। –

उत्तर

2

अभिव्यक्ति:

(++i) || ((++j) && (++k)) 

की व्याख्या::

++i || ++j && ++k 

के बराबर है

  1. ++i मूल्यांकन किया जाता है - (-2) || ((++j) && (++k));
  2. || ऑपरेटर का मूल्यांकन किया जाता है - (1);

चूंकि 1 || anything सत्य साबित होता है, सही ऑपरेंड का मूल्यांकन नहीं किया जाता है।इस प्रकार, && प्राथमिकता यहां कोई फर्क नहीं पड़ता। प्रासंगिक शॉर्ट्स द्वारा सी और सी ++ दोनों में यह शॉर्ट सर्किटिंग की गारंटी है (Is short-circuiting logical operators mandated? And evaluation order? देखें)।

अब, एक उप अभिव्यक्ति का उपयोग करते हुए, इस तरह का प्रयास करें:

((++i) || (++j)) && (++k) 

की व्याख्या::

(++i || ++j) && ++k 

के बराबर है कौन सा

  1. ++i मूल्यांकन किया जाता है - ((-2) || (++j)) && (++k);
  2. || मूल्यांकन किया जाता है - (1) && (++k)
  3. ++k मूल्यांकन किया जाता है - (1) && (1);
  4. सत्य का मूल्यांकन करता है;
3

-2 2 0 1

लेज़ी।

#include <stdio.h> 

int main() 
{ 

int i=-3,j=2,k=0; 
int m=++i||++j&&++k; 

printf("%d %d %d %d",i,j,k,m); 

} 

संकलित करें, चलाएं और स्वयं के लिए देखें।

Error, line 2: 'm': undefined variable. 

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

gcc tmp.c -o tmp 
+0

मेरे विचार बिल्कुल – Tom

+1

उच्च प्राथमिकता के कारण पहले नहीं किया जाना चाहिए? – anurag

+0

नहीं। जेरी कॉफ़िन के जवाब में यह बहुत अच्छी तरह से समझाया गया है। ओपी और दूसरों को सिर्फ एक समझ की समस्या है। मुझे बकवास बनाने के लिए –

22

उत्पादन की तरह कुछ होना चाहिए कि के साथ तय हो गई है, केवल ++i मूल्यांकन किया जाना चाहिए। प्राथमिकता निर्धारण के आदेश (या यहां तक ​​कि प्रभावित) निर्धारित नहीं करता है। प्राथमिकता का अर्थ है कि अभिव्यक्ति ++i || (++j && ++k) के बराबर है। || या && के लिए मूल्यांकन का आदेश हमेशा है कि बाएं ऑपरेंड का मूल्यांकन किया जाता है, फिर एक अनुक्रम बिंदु होता है। अनुक्रम बिंदु के बाद, दाएं ऑपरेंड का मूल्यांकन किया जाता है यदि अंतिम परिणाम निर्धारित करने के लिए केवल तभी आवश्यक होता है (यानी, || का सही संचालन मूल्यांकन किया जाता है यदि बाएं ऑपरेंड शून्य पर मूल्यांकन किया जाता है; && का दायां ऑपरेंड मूल्यांकन किया जाता है यदि बाएं ऑपरेंड का मूल्यांकन किया जाता है गैर-शून्य तक)।

इस अभिव्यक्ति में, ++i का मूल्यांकन किया गया है, क्योंकि यह || का बायां ऑपरेंड है और गैर-शून्य का मूल्यांकन किया गया है, शेष अभिव्यक्ति में से कोई भी मूल्यांकन नहीं किया जाता है।

+1

+1। मैं सहमत हूँ। : डी –

+0

यह मूल रूप से सभी एक पंक्ति थी, एम बाकी के साथ घोषणा का हिस्सा था। इसे तोड़ते समय, संपादक स्पष्ट रूप से त्रुटि को डालने, लाइनों को विभाजित करता है। –

+0

@ जेम्स - यहां तक ​​कि जब यह एक लाइनर था तब भी के और एम के बीच '' 'था। –

0

विवरण के वैसे:

#include <stdio.h> 

int main() 
{ 
    if (-1) 
     printf ("-1!\n"); 
    else 
     printf ("Not -1.\n"); 
    return 0; 
} 

ऋणात्मक संख्याओं को हमेशा 0 (या FALSE) को बूलियन मूल्यों की तुलना या आप if (worked == TRUE) मिथ्या नकारात्मक दे ने काट लिया हो सकता है सी में झूठी नहीं हैं।

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