C Programming - Expressions - Discussion
Discussion Forum : Expressions - Find Output of Program (Q.No. 3)
3.
What will be the output of the program?
#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;
}
Answer: Option
Explanation:
Step 1: int i=-3, j=2, k=0, m; here variable i, j, k, m are declared as an integer type and variable i, j, k are initialized to -3, 2, 0 respectively.
Step 2: m = ++i || ++j && ++k; here (++j && ++k;) this code will not get executed because ++i has non-zero value.
becomes m = -2 || ++j && ++k;
becomes m = TRUE || ++j && ++k; Hence this statement becomes TRUE. So it returns '1'(one). Hence m=1.
Step 3: printf("%d, %d, %d, %d\n", i, j, k, m); In the previous step the value of variable 'i' only increemented by '1'(one). The variable j,k are not increemented.
Hence the output is "-2, 2, 0, 1".
Discussion:
41 comments Page 4 of 5.
Janani said:
7 years ago
The priority wise we decide only which belongs to which operator.. but the operation for short circuit operands (||,&&)are always left to right.
See, here the question is;
m=++i||b++&&++k
step 1: the compiler will decide which is belongs to which operand according to the priority.
So, the above statement will become like.
m= ++i || (b++ && ++k);
step 2: even after assigning like this operation is always from left to right.
so ++i is -2 i,e TRUE .
so,
m=TRUE|| (++j&&++k);
now it won't check the rest.
because it is short-circuited operator. if 1st argument is TRUE it won't check 2nd argument. because;
for ||
TRUE || TRUE=TRUE
TRUE || FALSE=TRUE
FALSE || TRUE = TRUE
FALSE || FALSE= FALSE
So it will check the second argument only if 1st argument is false.
But for our problem 1st arg is true.. so it won't check the rest.
Note: You may have another question like why j and k values are not incremented.
if we do like that then we are violating the short circuit operator rule.
See, here the question is;
m=++i||b++&&++k
step 1: the compiler will decide which is belongs to which operand according to the priority.
So, the above statement will become like.
m= ++i || (b++ && ++k);
step 2: even after assigning like this operation is always from left to right.
so ++i is -2 i,e TRUE .
so,
m=TRUE|| (++j&&++k);
now it won't check the rest.
because it is short-circuited operator. if 1st argument is TRUE it won't check 2nd argument. because;
for ||
TRUE || TRUE=TRUE
TRUE || FALSE=TRUE
FALSE || TRUE = TRUE
FALSE || FALSE= FALSE
So it will check the second argument only if 1st argument is false.
But for our problem 1st arg is true.. so it won't check the rest.
Note: You may have another question like why j and k values are not incremented.
if we do like that then we are violating the short circuit operator rule.
(1)
Achal said:
7 years ago
Aint the precision of logical AND is higher than logical OR? Then how come OR will be executed first?
(1)
Naresh said:
6 years ago
Our misconceptions are, negative(-) numbers including zero are False. Truth is,
Non-Zero numbers are 'True' in C.
eg: -3,-2,-1...1,2,3 ----> True
0 -----> False (only).
In other languages, the rule is negative(-) numbers including zero(0) is False, otherwise True.
Non-Zero numbers are 'True' in C.
eg: -3,-2,-1...1,2,3 ----> True
0 -----> False (only).
In other languages, the rule is negative(-) numbers including zero(0) is False, otherwise True.
Shubham said:
6 years ago
&& operator has higher priority than ||. Then how is this possible?
Sandeep said:
6 years ago
What's the point studying precedence table if Compiler optimization takes control of the result.
Mohit said:
5 years ago
Thanks @Jyoti.
Harshini said:
5 years ago
@Janani.
Thanks for your explanation.
Thanks for your explanation.
Rahul khartode said:
4 years ago
How can we say -2 as true? Please anyone explain.
Mahalakshmi said:
4 years ago
First there is a fight whether ++j belongs to || or &&.According to priority && wins so the compiler groups as ++i || (++j && ++k) ==> the left and right values are the operands of || .OR always evaluates from left to right.
As left gets evaluated and found to be true right is not evaluated due to short circuit evaluation hence the output is;
-2,2,0,1.
As left gets evaluated and found to be true right is not evaluated due to short circuit evaluation hence the output is;
-2,2,0,1.
(3)
Mahalakshmi said:
4 years ago
Thanks for explaining @Janani.
Post your comments here:
Quick links
Quantitative Aptitude
Verbal (English)
Reasoning
Programming
Interview
Placement Papers