Problem: Can you figure out what is wrong with following piece of code?
#include <iostream>int main() { int a[5] = {1,2,3,4,5}; for (int i = 4; a[i] >= 0 && i >=0 ; i--) { std::cout<< "ith element of array is "<<a[i]<<std::endl; }}
I would suggest you to try it yourself before scrolling down to see the answer. Its quite interesting,
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
Answer : Here, as one can figure out, the intention is to print array elements from end till we don't hit any negative number. In the first look it may seem fine but unfortunately it will end up in ABR (Array Bound Read).
Explanation : After the completion of 5th iteration; i.e. when i = 0, compiler will decrement i; i.e., i will become "-1". It will, then, try to check the condition, which will result in reading a[-1]. Since, array can have indexes only greater than or equal to 0, it will result in an error. Trying to read array elements out of the allowed indexes is termed as Array Bound Read Error. Hence, one should avoid such conditions because it can result into random result. The program can crash anytime. If you are lucky, it may run successfully also. Its all up to your luck. Instead, it should be
for (int i = 5; i>=0 && a[i] >= 0 ; i--) {
i.e. first check index value and then do the array access operation.
Here, with the above solution, one more interesting thing comes up to understand. In AND (&&) operation compiler first evaluates condition1; if it is true, then goes to evaluate condition2; otherwise return false from there only.
For example,
#include <iostream>
int main() {int i = 0;int j= 1;if( ( i == 1) && (++j ==3) ) { std::cout<<"inside if"<<std::endl;}std::cout<<"i is "<<i<<" and j is "<<j<<std::endl;}
Output :
Here, as you can see code control will not go into if branch as none of condition is true. since condition1 i==1 is false, compiler will not even check condition2 i.e. value of j will not be incremented.
Internally, compiler might be doing some following kind of transformation to evaluate && operation
bool cond = (i==1); if( cond ) { cond = (++j != 0) ; }if(cond){ std::cout<<"inside if"<<std::endl;}