This blog is under construction

Saturday, 18 January 2014

Operator precedence and associativity in C language

Below is the table for operator precedence and associativity in C programming language.
[ ]
( )
.
->
++ --
Array subscript
Function Call
Structure reference
Structure dereference
Postfix increment/Postfix decrement


Left to right
++ --
+ -
! ~
(type)
*  &
sizeof
Prefix increment/Prefix decrement
Unary plus/Unary minus
Logical negation/One's complement
Typecast operator
Pointer dereference/Address of
Size of type/variable in bytes


Right to left
*  /  % Multiplication/Division/Modulo Left to Right
+ - Addition/Subtraction Left to Right
<<   >> Bitwise left shift/ Bitwise right shift Left to Right
<    >
<=
>=
Comparison less than/Comparision greater than
Comparison less than or equal to
Comparison greater than or equal to

Left to Right
==   != Comparison equal to/Comparison not equal to Left to Right
& Bitwise AND Left to Right
^ Bitwise XOR Left to Right
| Bitwise OR Left to Right
&& Logical AND Left to Right
|| Logical OR Left to Right
?: Ternary Conditional Operator Right to Left
=
*=    /=   %=
+=    -=
<<=   >>=
&=    ^=
|=
Assignment Operator
Mulplication/division/modulo assignment
Addition/Subtraction assignment
Bitwise left shift/right shift assignment
Bitwise AND/XOR assignment
Bitwise OR assignment


Right to Left
, Comma Operator Left to Right


Sunday, 12 January 2014

#ifdef, #ifndef and #endif directives in C

#ifdef
If the named macro is defined, then the code between #ifdef and #endif will be compiled.

#ifndef
If the named macro is not defined, then the code between #ifndef and #endif will be compiled.


#ifdef, #ifndef and #endif example in C
 
  #include <stdio.h>
  #define NAME "Raj"

  int main() {

        #ifdef NAME
                printf("#ifdef: Value of NAME is %s\n", NAME);
        #endif

        #ifndef VAL
                printf("#ifndef: macro VAL is not defined\n");
        #endif
        return 0;
  }


  Output:
  jp@jp-VirtualBox:~/$ ./a.out
  #ifdef: Value of NAME is Raj
  #ifndef: macro VAL is not defined


In the above program, macro NAME is defined.  So, the code between #ifdef and #endif is executed. Similarly, the code between #ifndef and #endif is executed as the macro VAL is not defined.



#if, #elif, #else and #endif example

#if
If the resultant value of the arithmetic expression is non-zero, then the code between #if and #endif will be compiled.

Example:
#if 10 > 5
     printf("10 is greater than 5");
#endif

The code between #if and #endif will be compiled since the resultant value of the expression(10 > 5) is non-zero.


#elif
This provides an alternate expression to evaluate

Example:
#if 10 < 5
     printf("10 is less than 5");
#elif 10 > 5
     printf("10 is greater than 5");
#endif

The expression at #if directive evaluates to 0.  So, the expression at #elif is evaluated. If it is non-zero, then the code between #elif and #endif will be compiled.


#else
If the resultant value of the arithmetic expression is false for #if, #ifdef or #ifndef, then the code between #else and #endif will be compiled.

Example:
#if 10 < 5
     printf("10 is less than 5");
#else
     printf("10 is greater than 5");
#endif


#endif
This acts as an end directive for #if, #ifdef, #ifndef, #elif or #if

#if 100 < 50   // resultant value of expression is 0
   printf("#if directive");
#elif 50 < 10  // resultant value of the expression is 0
    printf("#elif directive");
#else
    printf("#else directive");  // this statement would be executed
#endif

Example C program to illustrate #if #elif #else #endif usage in C:

  #include <stdio.h>
  #define VAL1 10
  #define VAL2 20
  #define VAL3 30

  int main() {
    #if VAL1 > VAL2
          printf("%d is greater than %d\n", VAL1, VAL2);
    #elif VAL1 > VAL3
          printf("%d is greater than %d\n", VAL1, VAL3);
    #else
          printf("%d is less than %d and %d\n", VAL1, VAL2, VAL3);
    #endif
    return 0;
  }

  Output:
  jp@jp-VirtualBox:~/$ ./a.out
  10 is less than 20 and 30




Saturday, 11 January 2014

How to access union members in C

Dot operator is used to access(or assign) the data members of a union variable.  Consider the following example,

union value {
         int x;
         float y;
};

union value obj;
Here, obj is a union variable of type union value.  x and y are data members of the union value. Let us see how to assign value to or access data members of union using dot operator.

obj.x = 10;

The above statement assigns value 10 to the data member x of the union variable obj.

obj  - object name(union variable name)
x     - data member in union value
.     - dot operator


Example C program to illustrate accessing union members using dot operator

  #include <stdio.h>
  union value {
        int x;
        float y;
  }obj;

  int main() {
        obj.x = 5;
        printf("Value of x is %d\n", obj.x);
        obj.y = 19.22;
        printf("Value of y is %f\n", obj.y);
        printf("Value of x is %d\n", obj.x);
        return 0;
  }


  Output:
  jp@jp-VirtualBox:~/$ ./a.out
  Value of x is 5
  Value of y is 19.219999
  Value of x is 1100595855


The value of data member y overwrites the value of x and that is reason why we see junk value in x.  Basically, all data members in a union shares same storage place.


How to initialize union variables in C

Let us see all possible ways to initialize a union variable.  Please remember that we can access one data member at a time in the case of union.

Method 1:
union value {
     int x;
     float y;
};
union value obj = {5};

Here, initialization is done after union definition.  5 is assigned to the member x of union variable obj.

Method 2:
union value {
     int x;
     float y;
}obj = {5};

Here, initialization is done while defining the union.  5 is assigned to the member x of union variable obj.

Method 3:
union value {
     int x;
     float y;
};
union value obj = {.y = 5.0};

Here, initialization is done after union definition.  5.0 is assigned to the member y of union variable obj.  And we have used dot(.) operator for initialization.

Method 4:
union value {
     int x;
     float y;
};
union value obj = {y:5.0};

This method is similar to method 3.  Here, color(:) is used instead of '=' and period before union member is removed


Example C program to illustrate union variable initialization:

  #include <stdio.h>
  union value {
        int x;
        float y;
  }obj1 = {5};  //initializing union variable

  int main() {
        /* declaration and initialization for union variables */
        union value obj2 = {6};
        union value obj3 = {.y = 7.1};
        union value obj4 = {y:8.2};

        /* printing the values */
        printf("obj1.x : %d\n", obj1.x);
        printf("obj2.x : %d\n", obj2.x);
        printf("obj3.y : %f\n", obj3.y);
        printf("obj4.y : %f\n", obj4.y);
        return 0;
  }

  Output:
  jp@jp-VirtualBox:~/$ ./a.out
  obj1.x : 5
  obj2.x : 6
  obj3.y : 7.100000
  obj4.y : 8.200000