Predict the output of following C programs.
Question 1
#include<stdio.h>
int fun()
{
static int num = 40;
return num--;
}
int main()
{
for(fun(); fun(); fun())
{
printf("%d ", fun());
}
getchar();
return 0;
}
Output: 38 35 32 29 26 23 20 17 14 11 8 5 2
Since num is static in fun(), the old value of num is preserved for subsequent functions calls. Also, since the statement return num-- is postfix, it returns the old value of num, and updates the value for next function call.
Question 2
#include<stdio.h>
int main()
{
char *s[] = { "knowledge","is","power"};
char **p;
p = s;
printf("%s ", ++*p);
printf("%s ", *p++);
printf("%s ", ++*p);
getchar();
return 0;
}
Output: nowledge nowledge s
Let us consider the expression ++*p in first printf(). Since precedence of prefix ++ and * is same, associativity comes into picture. *p is evaluated first because both prefix ++ and * are right to left associative. When we increment *p by 1, it starts pointing to second character of "knowledge". Therefore, the first printf statement prints "knowledge".
Let us consider the expression *p++ in second printf() . Since precedence of postfix ++ is higher than *, p++ is evaluated first. And since it's a postfix ++, old value of p is used in this expression. Therefore, second printf statement prints "knowledge".
In third printf statement, the new value of p (updated by second printf) is used, and third printf() prints "s".
Please write comments if you find any of the answers/explanations incorrect, or you want to share more information about the topics discussed above