KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q38218: Why pointer1++ = pointer2 Is Illegal

Article: Q38218
Product(s): See article
Version(s): 5.00 5.10 | 5.10
Operating System(s): MS-DOS | OS/2
Keyword(s): ENDUSER | | mspl13_c
Last Modified: 21-NOV-1988

Question:

Why is the following statement

   pointer1++ = pointer2 ;

illegal, causing error 2106 : left operand must be lvalue,
when the following statement is legal?

   *pointer1++ = *pointer2 ;

Both pointer1 and pointer2 are declared as pointers to the same type.

Response:

Because the post-increment operator ++ has higher precedence than the
assignment operator =, the following statement

   pointer1++ = pointer2 ;

is equivalent to the following statement:

   (pointer1++) = pointer2 ;

As defined by the post-increment operation, the result of evaluating
the expression (pointer1++) is NOT a lvalue. So (pointer1++) cannot
be used as a left operand of the assignment operator.

However, a statement such as the following, which is equivalent to
*(pointer1++) = *pointer2 ;, is legal:

    *pointer1++ = *pointer2 ;

This statement is legal because although (pointer1++) is not a lvalue,
it can be used for indirection and *(pointer1++) is a lvalue.

It is very important to understand the difference between the value of
the expression (pointer1++) and the value of pointer1. Although
(pointer1++) has higher precedence in the above statements, the result
of evaluating (pointer1++) has the old value that pointer1 had before
the evaluation of the expression (pointer1++). Because of the side
effect of the post-increment operator, the evaluation of (pointer1++)
causes the value of pointer1 to be incremented by 1 only after the
rest of the statement has been evaluated. In other words, as an
address, (pointer1++) points to the same memory location as pointer1
used to. Therefore, *pointer1++ or *(pointer1++) represents the same
object as *pointer1 used to.

The following example has the effect of assigning "a" to memory
offset location 0x100, then incrementing ptr1 to point to memory
offset 0x101:

char * ptr1 = 0x100; /* ptr1 points to memory offset 0x100
                        in the current data segment
                        for small or medium memory models */
*ptr1++ = 'a';

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.