Precedence and Associativity of Operators

    Precedence and Associativity of Operators

    पीछे वाले 8 अध्याय से स्पष्ट होता है कि "सी लैंग्वेज"(C language) में बहुत से ऑपरेटर(operator) हैं। ऐसे में यदि कोई ऐसा एक्सप्रेशन(expression) हो जिसमें 1 से अधिक ऑपरेटर(operator) हो तो यह प्रश्न उठता है कि पहले कौन से ऑपरेटर(operator) का हल निकाला जाए। इसी प्रश्न का उत्तर देता है प्रेसिडेंस रूल(presidents rule)। अन्य शब्दों में प्रेसिडेंस  रूल से ऐसे ऐसे नियम से हैं जो यह तय करता है कि यदि एक एक्सप्रेशन(expression) में एक से अधिक ऑपरेटर(operator) हो तो पहले कौन सी श्रेणी के ऑपरेटर(operator) का हल निकाला जाएगा। 


    जब एक ही expression में एक ही श्रेणी के एक  से अधिक ऑपरेटर हो तो  एसोसिएटिविटी( Associativity) का नियम यह बताता है कि पहले इनमें से पहले किसे हल किया जाए। यह दाएं से बाएं या बाएं से दाएं हो सकता है


    Operator Description Associativity
    () [] - > Selectors left to right
    ! ~ ++ -- + - (type)* sizeof Unary Right to Left
    * / % Multiplicative Left To Right
    + - Additive Left to right
    << >> bitwise left to right
    < <= > >= Comparison left to Right
    == != Comparison left to Right
    & bitwise Left to Right
    ^ Bitwise Left to Right
    | Bitwise Left to Right
    && Boolean Left to Right
    || Boolean Left to Right
    ? : Conditional Right to left
    = += -= *= %= &=
    ^= |= <<= >>=
    Assignment Right to Left
    , comma Left to Right

    Type Casting

    Data के  type में परिवर्तन दो प्रकार का होता हैं। 

    1. Implicit type Casting(स्वतः होने वाला टाइप परिवर्तन)
    2. Explicit type Casting(User द्वारा करवाया जाने वाला टाइप परिवर्तन)

    (i) implicit Type casting 

    जब दो समान data type वाली वैल्यू पर operation किया जाता है तो उसका परिणाम समान data type में आता है उदाहरण के लिए यदि दो integer value को जोड़ा जाएगा तो परिणाम स्वरूप प्राप्त होने वाली संख्या भी integer होगी।
    किंतु यदि expression का एक ऑपरेंड integer होता दूसरा float हो तो परिणाम किस data type में आएगा। सम्मान सामान्य शब्दों में यह कहा जा सकता है कि यदि किसी expression में एक से अधिक प्रकार के data type प्रयुक्त है तो सामान्यता परिणाम उस data type में होगा, जो memory में अधिक स्थान घेरता है।

    अधिकांशतः  इसके लिए compiler पहले अन्य data type(डाटा टाइप) तो उस data type(डाटा टाइप) में परिवर्तन कर देता है जो मेमोरी में अधिक स्थान  घेरता है।  इसके पश्चात expression(एक्सप्रेशन) के परिणाम की गणना की जाती है इस प्रकार यह कहा जा सकता है कि आवश्यकता पड़ने पर compiler  automatic  डाटा टाइप में परिवर्तन कर देता है।  
    उदाहरण के लिए। 


       #include <stdio.h>
       #include <conio.h>
      void main()
       {
        int i;
        float f;
         f = 254.569;
        printf("\n i = %d\t f = %f ", i,f);
        i = f;
        f = i;
        printf("\n i = %d\t f = %f", i,f);
        getch();
       }


    Output:-

     i = 39,         f = 254.569000 
     i = 254,        f = 254.000000

    उपरोक्त उदाहरण में जब i = f किया जाता है तो f की वैल्यू स्वतः इंतजार में परिवर्तित होकर 254 variable  i मे स्टोर हो गया है। अगले statement में जब वापस f = i किया जाता है तो वेरिएबल i में स्टोरी integer 254 float में परिवर्तित होकर 254.000000 के रूप में f में स्टोर गई है। 


    मान लीजिए कि वेरिएबल एक इंटीरियर वेरिएबल k में वैल्यू 7, फ्लोट वेरिएबल m में वैल्यू 5.5 तथा कैरेक्टर वैल्यू c में वैल्यू 'A' स्टोर है। ध्यान रहे कि 'A' की ascii वैल्यू  65 होती है। इसके आधार पर विभिन्न एक्सप्रेशन तथा उसके परिणाम निम्न टेबल में दिए गए हैं। 


    Expression result data type
    k + m 12.5 float
    k + c 72 Interger
    (k + c) - (2*m/5) 69.8 float



    (ii)Explicit Type casting( यूजर द्वारा करवाया जाने वाला टाइप परिवर्तन ):-

    स्वतः डाटा परिवर्तन के अलावा user(programmer) भी यह बताता है कि data type पर परिवर्तन कब किया जाना है। इसे यूजर डिफाइंड डाटा(user defined data type) परिवर्तन भी कहा जाता है। जिसे तकनीकी शब्दों में explicit Type casting(एक्सप्लिसिट टाइप कास्टिंग) कहा जाता है। इसका प्रारूप निम्न प्रकार है:-

    (DataTypeToCast) Opearand


    उदाहरण:-


       #include <stdio.h>
       #include <conio.h>
      void main()
       {
        float a;
        a = 81.5;
        printf("\n Result is : %f ", a/2);
        printf("\n Result is : %d ", (int)a/2);
        getch();
       }

    Output:-

    Result  is : 40.750000
    Result  is : 40

     Explain example:-

    ऊपर दिए गए Example में a/2 की स्थिति में पहले 2 float में परिवर्तित होगा फिर गणना होगी। वही (int)a/2 की स्थिति में पहले a integer में परिवर्तित किया जाएगा फिर इसे इंटीरियर 2 से विभाजित किया जाएगा। जब a integer में परिवर्तित होगा तो उसका decimal वाला हिस्सा (.5) गायब हो जाएगा और उसकी वैल्यू सिर्फ 80 ही रह जाएगी। तत्पश्चात 80 को 2 से विभाजित करना 40 प्राप्त होगा। 

    Post a Comment

    0 Comments