In this video tutorial lets learn about preprocessor command or directives like #if, #elif, #else and #endif. These directives are used in conditional compilation.
Related Read:
Logical Operators In C
Conditional Compilation In C: #ifdef #else #endif
How Does #if and #elif Work?
The block of code inside #if block works only if the condition or the expression in resolved to non-zero number. If the expression is resolved to zero, then the code inside #if is skipped from compilation.
Same is true for #elif: If the condition or the expression is resolved to 0 then the code inside #elif block is skipped from compilation. If it’s resolved to non-zero number then the block of code inside #elif gets compiled and executed.
#else is optional and when used, it should be present only once between #if and #endif, and it should be present at the end(just before the #endif directive). If none of the conditions in #if and #elif match, then the code inside #else directive block gets executed.
#elif is also optional. But it can be used any number of times inside #if and #endif. But it should always be written after #if and not before it. It should be present before #else and not after #else directive.
Note: We can have nested #if #elif #else #endif inside #if and/or #elif and/or #else block. Nesting can go any number or depth.
But remember to have #endif for every #if.
Video Tutorial: Conditional Compilation In C: #if #elif #else #endif
[youtube https://www.youtube.com/watch?v=0s-y4WADkf0]
When To Use #if, #elif, #else and #endif?
1. When you want certain code to be skipped: #if or #elif or #else part of the code is compiled and executed only when the conditions are met.
2. To write portable code: Again, like that of in #ifdef and #else, we could write portable code. That is, we can write code for specific devices in #if, #elif and #else part and the compiler compiles the code specific to that device. All other code will be treated as comments.
3. Saving memory and file size: We could use it in big projects. We could include device specific files inside #if, #elif and #else blocks depending upon the condition. This way we could avoid including or importing all the files into our source code.
#include<stdio.h>
int main()
{
#if MARKS
printf("GRADE A\n");
#endif // MARKS
printf("Your Result\n");
return 0;
}
Output:
Your Result
Here macro template is not even defined. And for #if to resolve and print the code inside its block, MARKS should be evaluated to non-zero number.
#include<stdio.h>
#define MARKS
int main()
{
#if MARKS
printf("GRADE A\n");
#endif // MARKS
printf("Your Result\n");
return 0;
}
Output:
Your Result
Here even though MARKS is defined, it doesn’t have a non-zero value, so the code inside #if block isn’t compiled.
#include<stdio.h>
#define MARKS 50
int main()
{
#if MARKS
printf("GRADE A\n");
#endif // MARKS
printf("Your Result\n");
return 0;
}
Output:
GRADE A
Your Result
Here MARKS has a macro expansion as 50, which not zero, so code inside #if gets compiled and executed.
Using logical operatation
#include<stdio.h>
#define MARKS 50
int main()
{
#if(MARKS <= 100 && MARKS >= 80)
printf("GRADE A\n");
#endif // MARKS
printf("Your Result\n");
return 0;
}
Output:
GRADE A
Your Result
Check the condition for #if. We can use logical operator and/or arithmetic operators and/or relational operators and/or Conditional Operators in the condition.
Nesting of Directives
#include<stdio.h>
#define MARKS 50
int main()
{
#if(MARKS <= 100)
printf("GRADE A\n");
#if(MARKS >= 80)
printf("You're excellent!\n");
#else
printf("You're not that excellent yet!\n");
#endif
#endif // MARKS
printf("Your Result\n");
return 0;
}
Output:
GRADE A
You’re not that excellent yet!
Your Result
We can nest any number of #if #endif and/or #if #else #endif and/or #if #elif #endif and/or #if #elif #else #endif inside #if and/or #elif and/or #else.
Source Code: Conditional Compilation In C: #if #elif #else #endif
#include<stdio.h>
#define MARKS 50
int main()
{
#if(MARKS <= 100 && MARKS >= 80)
printf("GRADE A\n");
#elif(MARKS <= 79 && MARKS >= 60)
printf("GRADE B\n");
#elif(MARKS <= 59 && MARKS >= 40)
printf("GRADE C\n");
#elif(MARKS <= 39 && MARKS >= 30)
printf("GRADE D\n");
#else
printf("Please retake the test!\n");
#endif // MARKS
printf("Your Result\n");
return 0;
}
Output:
GRADE C
Your Result
Only 1 block of code is compiled and executed here, even if multiple conditions are satisfying. Whichever condition returns non-zero number first, the code inside its block gets executed. All other code will be skipped.
For list of all c programming interviews / viva question and answers visit: C Programming Interview / Viva Q&A List
For full C programming language free video tutorial list visit:C Programming: Beginner To Advance To Expert