Consider the following fragment:
int a,b;
a = 1;
b = 2;
c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
Help me understand this behaviour.
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
is treated as:
which is incorrect as you are trying to increment non-lvalue.
and
is treated as:
The cause for this behaviour is: The C language lexical analyzer is greedy.
In case 1: After the token ‘a’ (identifier) the lexer sees +, followed by another +, so it consumes both (as the increment operator) as part of same token. It does not make the 3rd + part of the same token as +++ is not a valid token. Similarly it groups the next two + into ++ token making it effectively same as:
which is not correct as a++ will not return a lvalue, hence you can’t apply a ++ on it. Something similar to saying 5++;
But in case2: the first pair of ++ will be grouped together (as increment operator). Next the * alone will be a token as you cannot combine it with a + as *+ is not a valid token. Finally the + will a token (as unary +) effectively making your statement as:
You can override this greedy behaviour of the lexer by making use of parenthesis or whitespaces as follows: