:: Re: [DNG] Studying C as told. (For …
Top Page
Delete this message
Reply to this message
Author: Edward Bartolo
Date:  
To: dng
Subject: Re: [DNG] Studying C as told. (For help)
Hi,

<<
while(*t++ = *s++);
>>


Using the operator priority table, ++ have the highest priority and
evaluation takes place left-to-right. This increments the pointers.

Next, * is 'evaluated' right-to-left. This has the effect of
dereferencing both pointers. Thirdly, the assignment operator '=' is
executed which sets sets the referenced values to equal each other.

The incremented pointers in the first step are not used for the
assignment. The reason is ++ follows the pointers.

Edward

On 01/07/2016, Edward Bartolo <edbarx@???> wrote:
> Hi,
>
> I mistakenly wrote:
> <<
> *t++ means first increment the pointer, then dereference it,
> otherwise this wouldn't work.
> */
> while(*t++ = *s++);
> }
>>>
>
> *t++ means first dereference, then increment. Since we have an
> assignment both incremented pointers are not used for the assignment
> of the characters.
>
> Edward
>
> On 01/07/2016, Edward Bartolo <edbarx@???> wrote:
>> Hi,
>>
>> I am now studying pointers my "weakest" part of the language. The
>> following is a program I wrote as an exercise to mimic what strcat
>> does in a very rudimentary way. Please, be aware this is only to serve
>> as an exercise and NOT to reinvent the standard functions.
>>
>> #include <stdio.h>
>> #include <ctype.h>
>>
>> /* assume target string has enough free space */
>> void strcat1(char* s, char *t) {
>> /* find terminating null */
>>
>> /*
>> The for loop increments pointer t after every iteration.
>> Loop starts at t. The final value of t is the position of
>> /0 character.
>> */
>> for (; *t; t++);
>>
>> /*
>> The while loop uses C's bastardized version of an assignment
>> treating it also as a statement. At each iteration, first the
>> char at t is assigned the char at s. After this, both t and s
>> are incremented.
>>
>> *t++ means first increment the pointer, then dereference it,
>> otherwise this wouldn't work.
>> */
>> while(*t++ = *s++);
>> }
>>
>>
>> int main() {
>> /*
>> Here I am assuming both source and target are automatically
>> appended by a \0 character. Otherwise strcat1 would go into
>> an uncontrolled memory corrupting frenzy only to be stopped
>> by a segmentation fault.
>>
>> However this didn't happen.
>> */
>> char source[] = "Appended end of string\n";
>> char target[1024] = "Target string\n";
>>
>> strcat1(source, target);
>> printf(target);
>>
>> return 0;
>> }
>>
>> I need a memory helper to remember how things like *ch++ is evaluate
>> and to read its meaning. As it is, it is definitely ambiguous as it
>> can be interpreted to mean
>> a) increment the pointer then dereference it
>> b) dereference the pointer then increment its data.
>>
>> I am taking *ch++ as an expression. Some rules must exist that help
>> one correctly interpret the meaning of these expressions.
>>
>> I know there is operator priority and rules that govern how
>> expressions are evaluated. Do I need to know these at the tips of my
>> fingers?
>>
>> Edward
>>
>