> On Apr 27, 2015, at 2:21 AM, Roberto E. Vargas Caballero <k...@shike2.com> 
> wrote:
> 
> Again, read [1], section "The use of pointers". Maybe you don't agree with 
> it, but almost
> all the people here agree with it.

Your link shows the use of `node[i].left` as a perfectly valid example when an 
array is being indexed. And since `cp` is not a structure, there is not enough 
single-line context to know what `cp` means in the original example.

The use of cp in such a simple loop is not, again to quote your link, "code 
containing many similar, complex expressions that evaluate to elements of a 
data structure”, so the use of a pointer is not really justified by  just 
quoting the article. Again, this is without seeing the surrounding code itself, 
just the snippets presented in the grandparent conversation.

> ANSI C standard, section 3.3.8 (Relational operators):
> 
[…]
> 
> It is no casuality they added this rule to the standard. They added
> it because is the idiomatic way of running over an array in C. Of
> course CS teachers that liked pascal don't teach it anymore when
> they were forced to move to C, but it is the best way for experienced
> C programmers. Get used to it.

The code in question was not comparing Q against P+1, it was comparing Q 
against P, where `P = &array[len+1]`, which is a subtly different case. The 
first increments a pointer by the size of one element, while the second 
accesses the array element just after the end of the array and obtains a 
reference to that point in memory. The first is dealing with a number in 
memory, the second is accessing memory to get a pointer to it. Nothing in the 
3.3.8 section affects this.

To make the loop code in question obey the Q < P+1 idiom, it would have to look 
more like:

    for (cp = colors; cp < &colors[LEN(colors)] + 1; cp++)

I still prefer the `cp - colors < LEN(colors)` version, myself.

-G

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to